[GHC] #16302: A non-function coerced to a function can cause a stg_ap_v_ret (was: A non-function coerced to a function can cause a stg_ap_pp_ret)
GHC
ghc-devs at haskell.org
Mon Feb 11 06:12:59 UTC 2019
#16302: A non-function coerced to a function can cause a stg_ap_v_ret
-------------------------------------+-------------------------------------
Reporter: WheatWizard | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.4.3
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: x86_64
| (amd64)
Type of failure: Runtime crash | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Description changed by WheatWizard:
Old description:
> If you create an function by unsafe coercing a non-function you can get
> some strange functions. If you then take one of these function and apply
> it something it crashes with a {{{stg_ap_pp_ret}}}. Here is a pretty
> minimal example.
>
> {{{
> import Unsafe.Coerce
> main=(unsafeCoerce()::a->IO())1
> }}}
>
> You can reproduce it online here:
> https://tio.run/##y0gszk7Nyfn/PzO3IL@oRCE0rzgxLVXPOT@1KDmVKzcxM89WoxQsBhHS0LSyStS18/TX0NQ0/P8fAA
>
> Here is another one:
>
> {{{
> import Unsafe.Coerce
> g=unsafeCoerce()::a->a
> main=print$g(g)1
> }}}
>
> If you coerce functions this doesn't appear to happen.
>
> For example:
>
> {{{
> import Unsafe.Coerce
> main=(unsafeCoerce id::a->IO())1
> }}}
>
> is a fine program. Sometimes this causes a segmentation fault
> (particularly with higher airity functions):
>
> {{{
> import Unsafe.Coerce
> main=(unsafeCoerce(+)::a->IO())1
> }}}
>
> but I've never gotten it to make a {{{stg_ap_pp_ret}}}.
New description:
If you create an function by unsafe coercing a non-function you can get
some strange functions. If you then take one of these function and apply
it something it crashes with a {{{stg_ap_v_ret}}}. Here is a pretty
minimal example.
{{{
import Unsafe.Coerce
main=(unsafeCoerce()::a->IO())1
}}}
You can reproduce it online here:
https://tio.run/##y0gszk7Nyfn/PzO3IL@oRCE0rzgxLVXPOT@1KDmVKzcxM89WoxQsBhHS0LSyStS18/TX0NQ0/P8fAA
Here is another one:
{{{
import Unsafe.Coerce
g=unsafeCoerce()::a->a
main=print$g(g)1
}}}
If you coerce functions this doesn't appear to happen.
For example:
{{{
import Unsafe.Coerce
main=(unsafeCoerce id::a->IO())1
}}}
is a fine program. Sometimes this causes a segmentation fault
(particularly with higher airity functions):
{{{
import Unsafe.Coerce
main=(unsafeCoerce(+)::a->IO())1
}}}
but I've never gotten it to make a {{{stg_ap_v_ret}}}.
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/16302#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list