[GHC] #14346: 8.2.1 regression: heap corruption after safe foreign calls
GHC
ghc-devs at haskell.org
Thu Oct 19 11:09:07 UTC 2017
#14346: 8.2.1 regression: heap corruption after safe foreign calls
-------------------------------------+-------------------------------------
Reporter: andrewchen | Owner: (none)
Type: bug | Status: infoneeded
Priority: highest | Milestone:
Component: Runtime System | Version: 8.2.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: Runtime crash | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by simonmar):
Interesting, can someone boil down the transformation that dropped the
`touch#`?
Simon: `touch#` is keeping the `ByteArray#` alive until after the
`action`, in `allocaBytes` (see comment:18). The action itself doesn't
keep the array alive, because it is working with the raw pointer, not the
`ByteArray#`. This is how we allocate temporary memory for marshalling
data between Haskell and C, because it's a lot faster to allocate memory
on the Haskell heap than to use `malloc()` and `free()`.
I imagine the simplifier has proven that `action` never returns and then
dropped the `case` with the continuation containing the `touch#`. That
seems like a reasonable thing to do.
I like @bgamari's alternative suggestion of `with#`, although we probably
want it to be
{{{
with# :: a -> (State# s -> (# State# s, b #)) -> State# s -> (# State# s,
b #)
}}}
otherwise the second argument must be a thunk (yuck).
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14346#comment:20>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list