#9130: Segmentation fault in ThreadPaused.c:223 when compiled with -O ----------------------------------+---------------------------------- Reporter: twi | Owner: simonmar Type: bug | Status: new Priority: high | Milestone: Component: Runtime System | Version: 7.8.2 Keywords: | Operating System: Linux Architecture: x86_64 (amd64) | Type of failure: Runtime crash Difficulty: Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | ----------------------------------+---------------------------------- Compiling the following program with {{{ghc --make -fforce-recomp -O Tests}}} gives me a segmentation fault when running the resulting executable whereas without {{{-O}}} it runs to completion. {{{ module Main where import Control.Concurrent.Async main :: IO () main = test 100 test :: Int -> IO () test s = do mapM_ wait =<< mapM b [0 .. s] where b _ = async $ return () }}} valgrind and gdb indicate that an invalid read in threadPaused is causing this: {{{ $ valgrind ./Tests ==17550== Memcheck, a memory error detector ==17550== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==17550== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info ==17550== Command: ./Tests ==17550== ==17550== Invalid read of size 4 ==17550== at 0x46C2BE: threadPaused (ThreadPaused.c:223) ==17550== by 0x48FC72: stg_returnToSched (in /tmp/xxx/Tests) ==17550== Address 0x1f is not stack'd, malloc'd or (recently) free'd ==17550== ==17550== ==17550== Process terminating with default action of signal 11 (SIGSEGV) ==17550== Access not within mapped region at address 0x1F ==17550== at 0x46C2BE: threadPaused (ThreadPaused.c:223) ==17550== by 0x48FC72: stg_returnToSched (in /tmp/xxx/Tests) ==17550== If you believe this happened as a result of a stack ==17550== overflow in your program's main thread (unlikely but ==17550== possible), you can try to increase the size of the ==17550== main thread stack using the --main-stacksize= flag. ==17550== The main thread stack size used in this run was 8388608. ==17550== ==17550== HEAP SUMMARY: ==17550== in use at exit: 76,884 bytes in 34 blocks ==17550== total heap usage: 53 allocs, 19 frees, 81,122 bytes allocated ==17550== ==17550== LEAK SUMMARY: ==17550== definitely lost: 0 bytes in 0 blocks ==17550== indirectly lost: 0 bytes in 0 blocks ==17550== possibly lost: 0 bytes in 0 blocks ==17550== still reachable: 76,884 bytes in 34 blocks ==17550== suppressed: 0 bytes in 0 blocks ==17550== Rerun with --leak-check=full to see details of leaked memory ==17550== ==17550== For counts of detected and suppressed errors, rerun with: -v ==17550== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 3) Segmentation fault (core dumped) }}} {{{ (gdb) run Starting program: /tmp/xxx/Tests warning: Could not load shared library symbols for linux-vdso.so.1. Do you need "set solib-search-path" or "set sysroot"? [Thread debugging using libthread_db enabled] Using host libthread_db library "/usr/lib/libthread_db.so.1". Program received signal SIGSEGV, Segmentation fault. 0x000000000046c2be in threadPaused (cap=0x6f5dc0 <MainCapability>, tso=0x7ffff6b05390) at rts/ThreadPaused.c:223 223 switch (info->i.type) { (gdb) info locals frame = 0x7ffff6b050f0 info = 0xf bh_info = 0x4779fe <appendToRunQueue+155> bh = 0x7ffff6b10790 stack_end = 0x7ffff6b05390 words_to_squeeze = 0 weight = 0 weight_pending = 9 prev_was_update_frame = rtsFalse }}} -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9130> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler