[GHC] #9765: Strange behavior of GC under ghci
GHC
ghc-devs at haskell.org
Tue Nov 4 08:42:59 UTC 2014
#9765: Strange behavior of GC under ghci
-------------------------------------+-------------------------------------
Reporter: remdezx | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: GHCi | Version: 7.8.3
Keywords: | Operating System:
Architecture: Unknown/Multiple | Unknown/Multiple
Difficulty: Unknown | Type of failure: Incorrect
Blocked By: | result at runtime
Related Tickets: | Test Case:
| Blocking:
| Differential Revisions:
-------------------------------------+-------------------------------------
Releasing the result of `newForeignPtr nullFunPtr nullPtr` end in core
dump, due to the fact that finalizer function is set to null pointer.
When I run something like this in GHCI:
{{{#!hs
> import System.Mem
> import Foreign.Ptr
> import Foreign.ForeignPtr
> import System.IO.Unsafe
> import qualified Data.Map as Map
> a <- return $ Map.singleton 1 (unsafePerformIO $ newForeignPtr
nullFunPtr nullPtr)
Loading package array-0.5.0.0 ... linking ... done.
Loading package deepseq-1.3.0.2 ... linking ... done.
Loading package containers-0.5.5.1 ... linking ... done.
> print a
fromList [(1,0x0000000000000000)]
> performGC
> ^D
Leaving GHCi.
[1] 3782 segmentation fault (core dumped) ghci
}}}
it wont crash until exit from ghci which is correct. But if I do something
similar but using `let` binding it will crash even if variable `a` didn't
lose its scope
{{{#!hs
> import System.Mem
> import Foreign.Ptr
> import Foreign.ForeignPtr
> import System.IO.Unsafe
> import qualified Data.Map as Map
> let a = Map.singleton 1 (unsafePerformIO $ newForeignPtr nullFunPtr
nullPtr)
Loading package array-0.5.0.0 ... linking ... done.
Loading package deepseq-1.3.0.2 ... linking ... done.
Loading package containers-0.5.5.1 ... linking ... done.
> print a
fromList [(1,0x0000000000000000)]
[1] 3842 segmentation fault (core dumped) ghci
}}}
Why is there a difference between doing it with `do` notation and with
`let` binding?
I also expected that if I rebind variable `a` it will lose it's scope and
will be released but it is not (see below)
{{{#!hs
> import System.Mem
> import Foreign.Ptr
> import Foreign.ForeignPtr
> import System.IO.Unsafe
> import qualified Data.Map as Map
> a <- return $ Map.singleton 1 (unsafePerformIO $ newForeignPtr
nullFunPtr nullPtr)
Loading package array-0.5.0.0 ... linking ... done.
Loading package deepseq-1.3.0.2 ... linking ... done.
Loading package containers-0.5.5.1 ... linking ... done.
> print a
fromList [(1,0x0000000000000000)]
> a <- return () -- rebinding varable a, it is no longer used
> performGC
> -- no crash, varaible a not released
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9765>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list