[GHC] #7743: GHCI segfaults with Data.Binary instances
GHC
cvs-ghc at haskell.org
Tue Mar 5 22:55:18 CET 2013
#7743: GHCI segfaults with Data.Binary instances
-----------------------------+----------------------------------------------
Reporter: BigEndian | Owner:
Type: bug | Status: new
Priority: normal | Component: Compiler
Version: 7.6.2 | Keywords:
Os: Unknown/Multiple | Architecture: Unknown/Multiple
Failure: GHCi crash | Blockedby:
Blocking: | Related:
-----------------------------+----------------------------------------------
The following code seems to crash GHCi
I apologize for the long test case,
but I'll need to rebuild ghc with symbols first before I can reduce the
test case.
GHCi's output is
{{{
eric at sagacity ~/prog/haskell/tasks master > ghci
GHCi, version 7.6.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l Segfault.hs
[1 of 1] Compiling Main ( Segfault.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
Loading package array-0.4.0.1 ... linking ... done.
Loading package deepseq-1.3.0.1 ... linking ... done.
Loading package bytestring-0.10.0.2 ... linking ... done.
Loading package containers-0.5.0.0 ... linking ... done.
Loading package binary-0.5.1.1 ... linking ... done.
"zsh: segmentation fault ghci
}}}
Related code is
{{{
module Main where
import qualified Data.ByteString as BW
import Data.Word(Word8(..))
import Data.Binary
import Control.Monad
import Data.Char
convertWord8ToChar :: Word8 -> Char
convertWord8ToChar = chr . fromIntegral
convertCharToWord8 :: Char -> Word8
convertCharToWord8 = fromIntegral . ord
stringToWByteString :: String -> BW.ByteString
stringToWByteString = BW.pack . map convertCharToWord8
wByteStringToString :: BW.ByteString -> String
wByteStringToString = map convertWord8ToChar . BW.unpack
newtype TaskString = TaskString BW.ByteString deriving (Read, Show)
stringToTaskString :: String -> TaskString
stringToTaskString = TaskString . stringToWByteString
word8sToTaskString :: [Word8] -> TaskString
word8sToTaskString = TaskString . BW.pack
instance Binary TaskString where
get = do
(return . word8sToTaskString . init) =<< readWord8sUntil 0
where
readWord8sUntil :: Word8 -> Get [Word8]
readWord8sUntil val = do
w8 <- getWord8
if w8 == val then
return $ [w8]
else
(return . (w8:)) =<< (readWord8sUntil val)
put (TaskString bws) = mapM_ putWord8 $ (BW.unpack bws) ++ [0]
data Task =
Task { taskTitle :: TaskString, taskNotes :: TaskString, taskPriority
:: Int }
deriving (Read, Show)
instance Binary Task where
get = do
tt <- get :: Get TaskString
tn <- get :: Get TaskString
tp <- get :: Get Int
return Task { taskTitle = tt, taskNotes = tn, taskPriority =
tp }
put t = do
put $ taskTitle t
put $ taskNotes t
put $ taskPriority t
exTaskTitle = stringToTaskString "Do the dishes"
exTaskNotes = stringToTaskString "Must be done by 12:00 today"
exTaskPriority = 0
encTaskTitle = encode exTaskTitle
decTaskTitle = decode encTaskTitle :: TaskString
exTask = Task { taskTitle = exTaskTitle,
taskNotes = exTaskNotes,
taskPriority = exTaskPriority }
encTask = encode exTask
decTask = decode encTask :: Task
main = do
putStrLn $ show encTask
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7743>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list