Skip to content

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information