Segmentation fault in ThreadPaused.c:223 when compiled with -O
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
Trac metadata
Trac field | Value |
---|---|
Version | 7.8.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | high |
Resolution | Unresolved |
Component | Runtime System |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | simonmar |
Operating system | |
Architecture |