https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101692

            Bug ID: 101692
           Summary: Program crushes at unpredictable moment of time
           Product: gcc
           Version: 8.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: d
          Assignee: ibuclaw at gdcproject dot org
          Reporter: zed at lab127 dot karelia.ru
  Target Milestone: ---

I am not sure this is really a gdc issue,
but a program behaves very strange -
it works normally for some time, and
then receives SIGSEGV at unpredictable moment
(but always at the same place of code).

Here is code snippet, where the crush occurs

    struct EpollEvent
    {
        align(1):
        uint event_mask;
        EventSource es;     // EventSource is a class
        /* just do not want to use that union, epoll_data_t */
    }

    bool wait()
    {
        EpollEvent event;

        if (done)
            return false;

        int n = epoll_wait(id, &event, 1, -1);
        if (-1 == n)
            return false;

        writefln("%s, n = %d", __FUNCTION__, n);
        writefln("%s", event); // <<< crashes here

        EventSource s = event.es;
        ulong ecode = s.eventCode(event.event_mask);
        mq.putMsg(null, s.owner, ecode, s);

        return true;
    }

Crush occurs when program is accessing 'event' variable
after return from epoll_wait().

And it does not depend on the type of this variable - 
I tried dynamic array EpollEvent[], static array EpollEvent[MAX],
no matter, after some period of normal functioning
program gets SIGSEGV at the indicated line.

gdb says the following:

Core was generated by `./echod'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007f312ed79380 in ?? ()
(gdb) bt
#0  0x00007f312ed79380 in ?? ()
#1  0x0000555f33107071 in
std.format.formatObject!(std.stdio.File.LockingTextWriter, esrc.EventSource,
char).formatObject(ref std.stdio.File.LockingTextWriter, ref esrc.EventSource,
ref const(std.format.FormatSpec!(char).FormatSpec)) (w=...,
val=@0x7ffec19ab610: 0x7f312edb6300, f=...)
    at /usr/lib/gcc/x86_64-linux-gnu/8/include/d/std/format.d:3353
#2  0x0000555f33106fc9 in
std.format.formatValue!(std.stdio.File.LockingTextWriter, esrc.EventSource,
char).formatValue(ref std.stdio.File.LockingTextWriter, esrc.EventSource, ref
const(std.format.FormatSpec!(char).FormatSpec)) (w=..., val=0x7f312edb6300,
f=...)
    at /usr/lib/gcc/x86_64-linux-gnu/8/include/d/std/format.d:3450
#3  0x0000555f33106f39 in
std.format.formatElement!(std.stdio.File.LockingTextWriter, esrc.EventSource,
char).formatElement(ref std.stdio.File.LockingTextWriter, ref esrc.EventSource,
ref const(std.format.FormatSpec!(char).FormatSpec)) (w=...,
val=@0x7ffec19ab6b0: 0x7f312edb6300, f=...)
    at /usr/lib/gcc/x86_64-linux-gnu/8/include/d/std/format.d:3180
#4  0x0000555f3310683a in
std.format.formatValue!(std.stdio.File.LockingTextWriter, ecap.EpollEvent,
char).formatValue(ref std.stdio.File.LockingTextWriter, ref ecap.EpollEvent,
ref const(std.format.FormatSpec!(char).FormatSpec)) (w=..., val=..., f=...)
    at /usr/lib/gcc/x86_64-linux-gnu/8/include/d/std/format.d:3702
#5  0x0000555f3310634b in
std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char,
ecap.EpollEvent).formattedWrite(ref std.stdio.File.LockingTextWriter,
const(char[]), ecap.EpollEvent) (w=..., fmt=..., _param_2=...) at
/usr/lib/gcc/x86_64-linux-gnu/8/include/d/std/format.d:568
#6  0x0000555f33105dc5 in std.stdio.File.writefln!(char,
ecap.EpollEvent).writefln(const(char[]), ecap.EpollEvent) (this=..., fmt=...,
_param_1=...)
    at /usr/lib/gcc/x86_64-linux-gnu/8/include/d/std/stdio.d:1496
#7  0x0000555f330f49ad in std.stdio.writefln!(char,
ecap.EpollEvent).writefln(const(char[]), ecap.EpollEvent) (fmt=...,
_param_1=...)
    at /usr/lib/gcc/x86_64-linux-gnu/8/include/d/std/stdio.d:3797
#8  0x0000555f330eca63 in ecap.EventQueue.wait() (this=0x7f312ed76000) at
engine/ecap.d:113
#9  0x0000555f330f472a in D main (args=...) at echod.d:46

engine/ecap.d:113 is that 'writefln("%s", event);'

Also it seemed to me, that crash is more probable when compiling with -Os.
Also 2, i tried dmd instead of gdc - crushes also occurs, but much less
frequently.

gdc --version
gdc (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
(Linux Mint 19.1 actually)

uname -a
Linux HP-Laptop 4.15.0-151-generic #157-Ubuntu SMP Fri Jul 9 23:07:57 UTC 2021
x86_64 x86_64 x86_64 GNU/Linux

Reply via email to