haskell2: > David Brown wrote: > > Ian Lynagh wrote: > >> On Mon, Mar 05, 2007 at 10:51:46AM -0800, David Brown wrote: > >>> My program 'harchive' <http://www.davidb.org/darcs/harchive/> breaks > >>> if compiled with '-O'. Just wondering if anyone has suggestions on > >>> how to figure out what might be causing this. > >> What do you mean by "breaks"? > > > > I'm now rebuilding individual parts with -O to see if I can isolate > > the problem(s). > > Well, that helped. I found the problem. I had something like: > > import qualified Data.ByteString as B > > let hash = B.pack $ replicate (#const SHA_DIGEST_LENGTH) 0 > ... > B.useAsCStringLen hash $ \ (hdata, _) -> do > c_sha1Final hash ctx > return hash > > But this seems to be causing the hash to be garbage, and possibly have > c_sha1Final write a 20-byte hash into some garbled piece of memory. > > Ireplaced this with > > let hashLen = (#const SHA_DIGEST_LENGTH) > hashData <- mallocForeignPtrBytes hashLen > withForeignPtr hashData $ \hashP -> do > c_sha1Final hashP ctx > B.copyCStringLen (hashP, hashLen) > > and the code works both with and without optimization. > > Dave
Ah, this is my fault! The old api used 'useAsCSTringLen' unsafely. Its a zero-copying version. The default is now copyCStringLen. See this thread for the issues involved: http://www.haskell.org/pipermail/libraries/2007-January/006783.html and for how it has been resolved: http://www.haskell.org/pipermail/libraries/2007-January/006801.html So yes, using 'copyCStringlen' is the appropriate thing to do, if you don't want to guarantee the C side of things. -- Don _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users