[GHC] #14361: GHC HEAD miscompiles `text-containers`

GHC ghc-devs at haskell.org
Fri Nov 3 21:15:44 UTC 2017


#14361: GHC HEAD miscompiles `text-containers`
-------------------------------------+-------------------------------------
        Reporter:  hvr               |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:  8.4.1
       Component:  Compiler          |              Version:  8.3
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Incorrect result  |  Unknown/Multiple
  at runtime                         |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by bgamari):

 I could have sworn I had left a comment here when I looked at this last
 but alas it seems to be gone.

 Anyways, I've done a fair amount of digging on this one. I started by
 looking at differences in the call patterns of
 `Internal.$wcompareByteArray` in two compilations of the repro: one
 compiled with `{-# OPTIONS_GHC -fno-strictness #-}` in the `Internal2.hs`
 (which I'll call the "good" configuration) and one without (the "bad"
 configuration).

 Specifically I setup GDB to instrument calls to this function, logging
 each. This revealed that the bad configuration sometimes enters
 `$wcompareByteArray` with the `ofs2` and `n2` arguments being zero, where
 in good configuration they are non-zero. For instance,
 {{{#!patch
 --- gdb.good.log        2017-11-03 16:53:05.956764525 -0400
 +++ gdb.bad.log 2017-11-03 16:53:27.481174930 -0400
 @@ -186,8 +186,7 @@
  done fffffffc
  memcmp a.len=1 a[0]=44 ofs1=0 n1=1 b.len=50 ofs2=4c n2=1
  done ffffffff
 -memcmp a.len=1 a[0]=44 ofs1=0 n1=1 b.len=50 ofs2=4a n2=1
 -done 1
 +memcmp a.len=1 a[0]=44 ofs1=0 n1=1 b.len=50 ofs2=0 n2=0
  memcmp a.len=1 a[0]=44 ofs1=0 n1=1 b.len=50 ofs2=4b n2=1
  done 0
  memcmp a.len=1 a[0]=45 ofs1=0 n1=1 b.len=50 ofs2=48 n2=1
 }}}
 The (perhaps slightly poorly-named) `memcmp` message is emitted on
 entering `$wcompareByteArray`. The `done` message is emitted after the
 `memcmp` call returns. The fact that there is no `done` message in the bad
 case is the consequence of the implementation of `compareByteArray`, which
 skips the `memcmp` if `min n1 n2 == 0`.

 Another thing I have noticed is that the occurrence probability of the bug
 changes with GC patterns. Interestingly, it doesn't change monotonically
 with GC frequency; for a given value of `+RTS -A` I reproducibly get the
 same set of numbers on stdout.

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


More information about the ghc-tickets mailing list