[GHC] #13611: Segfault due to levity polymorphism of mkWeak#

GHC ghc-devs at haskell.org
Tue Apr 25 08:25:17 UTC 2017


#13611: Segfault due to levity polymorphism of mkWeak#
-------------------------------------+-------------------------------------
        Reporter:  nomeata           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.2.1
       Component:  Compiler          |              Version:  8.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by simonpj):

 * cc: simonmar (added)


Comment:

 > Though what guarantees do we provide when a user writes the IO
 constructor explicitly? This is tantamount to unsafePerformIO, is it not?

 You might get sequencing or concurrency errors, but not seg-faults.

 > But there is one use of mkWeak# in the libraries that seems to use a
 different TypeRep

 Actually ''all'' the uses in `base` are on `UnliftedRep` except the single
 use in `GHC.Weak.mkWeak`.

 >  Or, the easy way out, is to have two copies of the mkWeak# primop, one
 for LiftedRep and one for UnliftedRep.

 Yes, let's do that.

 In principle we could further structure `RuntimeRep` to have
 {{{
 data RuntimeRep
   = IntRep
   | WordRep
   | PtrRep Liftedness

 data Liftedness = Lifted | Unlifted
 }}}
 and now we could have polymorphism over liftedness, but I just don't think
 it's worth it.

 BTW I think that (like `dataToTag#`) `mkWeak#` probably requires its
 argument to be evaluated.  (I don't think it does and eval itself, though
 perhaps it should.)  Reason: `mkWeak#` should not make a weak pointer to a
 thunk.  I think.  So I am pretty suspicious of this `GHC.Weak.mkWeak`:
 {{{
 mkWeak key val (Just (IO finalizer)) = IO $ \s ->
    case mkWeak# key val finalizer s of { (# s1, w #) -> (# s1, Weak w #) }
 }}}
 Looks wrong to me; e.g. `mkWeak# (head xs)`?  Copying Simon M.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13611#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list