Jump to page: 1 2 3
Thread overview
[Issue 18026] Stack overflow in ddmd/dtemplate.d:6241, TemplateInstance::needsCodegen()
Apr 02, 2018
JR
Apr 02, 2018
Seb
Apr 07, 2018
JR
Apr 07, 2018
Seb
Apr 07, 2018
JR
May 03, 2018
JR
May 26, 2018
JR
May 26, 2018
greenify
Jun 08, 2018
JR
Jun 09, 2018
ag0aep6g
Jun 16, 2018
JR
Jun 16, 2018
Stefan Koch
Jun 16, 2018
JR
Jun 17, 2018
ag0aep6g
Jun 18, 2018
FeepingCreature
Jul 25, 2018
Mike Franklin
Jul 25, 2018
Basile B.
Sep 10, 2018
JR
Mar 21, 2020
Basile-z
Nov 07, 2020
JR
Jan 22, 2021
Boris Carvajal
Dec 28, 2021
Tim
Dec 17, 2022
Iain Buclaw
Jan 04, 2023
Dlang Bot
Jan 15, 2023
Dlang Bot
April 02, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

--- Comment #1 from JR <zorael@gmail.com> ---
I am now at a stage where with 2.079.0 I can no longer trick dmd on linux into compiling my project in release mode (or dub -b plain) at all; only debug works. dmd 2.079.0 fails with exit code -11, with gdb backtraces listing needsCodegen(). I can still coerce dmd 2.078.3 and ldc 1.8.0 into compiling, partly. I expect ldc will similarly stop working when a new version of it based on 2.079 is released.

When I reduce the problem with dustmite I end up with nonsense that apparently does still trigger the behaviour, but isn't something you can reason about. Things like function calls that *need to be there* for everything to work, and without which I get the overflow.

The commit that didn't work in the previously linked overflow branch now builds in 2.079.0, but instead now all my other tricks don't for the current state of the codebase. The issue is an emergent property of a hundred little things.

Is there anything I can do to help diagnose?

> $ git clone https://github.com/zorael/kameloso
> $ cd kameloso
> $ git checkout 8b05c0f  # unreduced until interest expressed, expect build times
> $ dub build -c vanilla -b plain
> /usr/bin/dmd failed with exit code -11.

--
April 02, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

Seb <greensunny12@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |greensunny12@gmail.com

--- Comment #2 from Seb <greensunny12@gmail.com> ---
> When I reduce the problem with dustmite I end up with nonsense that apparently does still trigger the behaviour, but isn't something you can reason about. Things like function calls that *need to be there* for everything to work, and without which I get the overflow.

Could you still post the reduced example?

> Is there anything I can do to help diagnose?

Well, the smaller the reduced example, the easier it will be to dive through
the DMD codebase and fix the issue.
Apart from that maybe also post the issue on the #dbugfix campaign, s.t. it
gets more exposure:

https://dlang.org/blog/2018/02/03/the-dbugfix-campaign/

--
April 07, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

--- Comment #3 from JR <zorael@gmail.com> ---
I reduced it to 58 lines using dustmite, which is incidentally amazing.

Under 2.079.0, it compiles in -debug mode but doesn't outside of it. 2.078.3 can however compile it in both. The code is nonsense, but it appears to trigger the behaviour.

> $ git clone https://github.com/zorael/kameloso -b 2.079-overflow
> $ cd kameloso
> $ dub build -b debug  # works
> 
> $ dub build -b plain
> /usr/bin/dmd failed with exit code -11.
> 
> $ gdb --batch -ex "run" --args dmd source/kameloso/*.d source/kameloso/plugins/*.d
> Program received signal SIGSEGV, Segmentation fault.
> 0x0000555555825982 in TemplateInstance::needsCodegen() ()

I tested it on Travis and CircleCI. Both run 2.079.0, and Travis could not reproduce the segfault. CircleCI however could! Please see https://circleci.com/gh/zorael/kameloso/151.

Again, this seems to only affect 2.079.0, and only on *some* distributions. Unless your linux installation sees the behaviour, I imagine the only way to observe it is to download a Manjaro .iso and run it in a virtual machine. Apologies.

I wish I could produce something more tangible but this is how ephemeral the issue is.

--
April 07, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

--- Comment #4 from Seb <greensunny12@gmail.com> ---
JR: Cool! I can reproduce it on my machine too :)

For reference, here's what's necessary for reproducing this without dub:

/home/seb/dlang/dmd/generated/linux/release/64/dmd -c -offoo.o -w -Isource/ source/kameloso/common.d source/kameloso/irc.d source/kameloso/ircdefs.d source/kameloso/main.d source/kameloso/plugins/notes.d -vcolumns | head -n20

Program received signal SIGSEGV, Segmentation fault.
0x00005555557f4187 in TemplateInstance::needsCodegen() ()
#0  0x00005555557f4187 in TemplateInstance::needsCodegen() ()
#1  0x00005555557f42c6 in TemplateInstance::needsCodegen() ()
#2  0x00005555557f42c6 in TemplateInstance::needsCodegen() ()
#3  0x00005555557f42c6 in TemplateInstance::needsCodegen() ()
#4  0x00005555557f42c6 in TemplateInstance::needsCodegen() ()
#5  0x00005555557f42c6 in TemplateInstance::needsCodegen() ()
#6  0x00005555557f42c6 in TemplateInstance::needsCodegen() ()
#7  0x00005555557f42c6 in TemplateInstance::needsCodegen() ()
#8  0x00005555557f42c6 in TemplateInstance::needsCodegen() ()


I will look at reducing this even further tomorrow.

--
April 07, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

--- Comment #5 from JR <zorael@gmail.com> ---
(In reply to Seb from comment #4)
> JR: Cool! I can reproduce it on my machine too :)

[...]

> I will look at reducing this even further tomorrow.

Awesome, thanks!

--
May 03, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

--- Comment #6 from JR <zorael@gmail.com> ---
I can no longer reproduce with 2.079.1 nor 2.080.0, on the same machines that previously exhibited the overflow.

Was something changed, or is it merely being tricky again?

--
May 26, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

--- Comment #7 from JR <zorael@gmail.com> ---
It hit again on dmd 2.080.0 and ldc 1.9.0. The commit that made it sneak back in was literally just this:

> -    plugin.setEvent = event;
> +    plugin.currentPeekType = AdminPlugin.PeekType.set;
> +    IRCEvent mutEvent = event;
>      plugin.state.mainThread.send(ThreadMessage.PeekPlugins(),
> -        cast(shared IRCPlugin)plugin);
> +        cast(shared IRCPlugin)plugin, mutEvent);
>  }

Before that it works, after that it segfaults. I'll have to change my CI scripts so they only test debug mode again.

> zorael@xps ~/src/kameloso [master] $ dub build -b plain
> Performing "plain" build using /usr/bin/dmd for x86_64.
> requests 0.7.4: target for configuration "std" is up to date.
> kameloso 1.0.0-rc.1+commit.13.g9bb032c: building configuration "posix"...
> /usr/bin/dmd failed with exit code -11.

I haven't made a new attempt at reducing it yet, but it's not like I can produce something that looks like a reduced bug. All I can do is lessen the number of lines needed to compile and still get it to surface.

Do bounties work? I'd file one for this but not sure if people read those.

--
May 26, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

greenify <greeenify@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |greeenify@gmail.com

--- Comment #8 from greenify <greeenify@gmail.com> ---
You could search for the "dbugfix campaign".
Bounties generally don't work too well, but you could still try to post on the
NG for visibility - this one typically does help.

--
June 08, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

--- Comment #9 from JR <zorael@gmail.com> ---
To update, I did a new dustmite run and managed to produce something that segfaults on all my machines running dmd 2.080, ldc 1.7.0 and 1.9.0. This includes local Windows, but also CircleCI and Travis. dscanner --sloc reports it as 108 lines.

Mind that it is still nonsense! But it is compiler-segfaulting nonsense.

> git clone https://github.com/zorael/kameloso -b 2080-overflow1
> cd kameloso
> dub build -b plain
> dmd -c source/kameloso/*.d source/kameloso/plugins/*.d
> ldc source/kameloso/*.d source/kameloso/plugins/*.d

I'll write up a #dbugfix post for the General forum next and ask for more help there.

--
June 09, 2018
https://issues.dlang.org/show_bug.cgi?id=18026

ag0aep6g <ag0aep6g@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |ice
                 CC|                            |ag0aep6g@gmail.com

--- Comment #10 from ag0aep6g <ag0aep6g@gmail.com> ---
(In reply to JR from comment #9)
> > git clone https://github.com/zorael/kameloso -b 2080-overflow1

Reduced further to a single file (but still with Phobos dependencies):

----
enum Type
{
    x000,x001,x002,x003,x004,x005,x006,x007,x008,x009,
    x010,x011,x012,x013,x014,x015,x016,x017,x018,x019,
    x020,x021,x022,x023,x024,x025,x026,x027,x028,x029,
    x030,x031,x032,x033,x034,x035,x036,x037,x038,x039,
    x040,x041,x042,x043,x044,x045,x046,x047,x048,x049,
    x050,x051,x052,x053,x054,x055,x056,x057,x058,x059,
    x060,x061,x062,x063,x064,x065,x066,x067,x068,x069,
    x070,x071,x072,x073,x074,x075,x076,x077,x078,x079,
    x080,x081,x082,x083,x084,x085,x086,x087,x088,x089,
    x090,x091,x092,x093,x094,x095,x096,x097,x098,x099,
    x100,x101,x102,x103,x104,x105,x106,x107,x108,x109,
    x110,x111,x112,x113,x114,x115,x116,x117,x118,x119,
    x120,x121,x122,x123,x124,x125,x126,x127,x128,x129,
    x130,x131,x132,x133,x134,x135,x136,x137,x138,x139,
    x140,x141,x142,x143,x144,x145,x146,x147,x148,x149,
    x150,x151,x152,x153,x154,x155,x156,x157,x158,x159,
    x160,x161,x162,x163,x164,x165,x166,x167,x168,x169,
    x170,x171,x172,x173,x174,x175,x176,x177,x178,x179,
    x180,x181,x182,x183,x184,x185,x186,x187,x188,x189,
    x190,x191,x192,x193,x194,x195,x196,x197,x198,x199,
    x200,x201,x202,x203,x204,x205,x206,x207,x208,x209,
    x210,x211,x212,x213,x214,x215,x216,x217,x218,x219,
    x220,x221,x222,x223,x224,x225,x226,x227,x228,x229,
    x230,x231,x232,x233,x234,x235,x236,x237,x238,x239,
    x240,x241,x242,x243,x244,x245,x246,x247,x248,x249,
    x250,x251,x252,x253,x254,x255,x256,x257,x258,x259,
    x260,x261,x262,x263,x264,x265,x266,x267,x268,x269,
    x270,x271,x272,x273,x274,x275,x276,x277,x278,x279,
    x280,x281,x282,x283,x284,x285,x286,x287,x288,x289,
    x290,x291,x292,x293,x294,x295,x296,x297,x298,x299,
    x300,x301,x302,x303,x304,x305,x306,x307,x308,x309,
    x310,x311,x312,x313,x314,x315,x316,x317,x318,x319,
    x320,x321,x322,x323,x324,x325,x326,x327,x328,x329,
    x330,x331,x332,x333,x334,x335,x336,x337,x338,x339,
    x340,x341,x342,x343,x344,x345,x346,x347,x348,x349,
    x350,x351,x352,x353,x354,x355,x356,x357,x358,x359,
    x360,x361,x362,x363,x364,x365,x366,x367,x368,x369,
    x370,x371,x372,x373,x374,x375,x376,x377,x378,x379,
    x380,x381,x382,x383,x384,x385,x386,x387,x388,x389,
    x390,x391,x392,x393,x394,x395,x396,x397,x398,x399,
    x400,x401,x402,x403,x404,x405,x406,x407,x408,x409,
    x410,x411,x412,x413,x414,x415,x416,x417,x418,x419,
    x420,x421,x422,x423,x424,x425,x426,x427,x428,x429,
    x430,x431,x432,x433,x434,x435,x436,x437,x438,x439,
    x440,x441,x442,x443,x444,x445,x446,x447,x448,x449,
    x450,x451,x452,x453,x454,x455,x456,x457,x458,x459,
    x460,x461,x462,x463,x464,x465,x466,x467,x468,x469,
    x470,x471,x472,x473,x474,x475,x476,x477,x478,x479,
    x480,x481,x482,x483,x484,x485,x486,x487,x488,x489,
    x490,x491,x492,x493,x494,x495,x496,x497,x498,x499,
    x500,x501,x502,x503,x504,x505,x506,x507,x508,x509,
    x510,x511,x512,x513,x514,x515,x516,x517,x518,x519,
    x520,x521,x522,x523,x524,x525,x526,x527,x528,x529,
    x530,x531,x532,x533,x534,x535,x536,x537,x538,x539,
    x540,x541,x542,x543,x544,x545,x546,x547,x548,x549,
    x550,x551,
}

import std.concurrency: send;
import std.format: format;

struct PeekPlugins {}

struct IRCEvent
{
    Type type;
    byte sender;
    string channel;
    string content;
    string aux;
    uint num;
    long time;
}

@Type
void onSetCommand()
{
    alias s = send!(PeekPlugins, shared IRCPlugin, IRCEvent);
}

interface IRCPlugin {}
class AdminPlugin : IRCPlugin {}

class WHOISRequestImpl
{
    void foo()
    {
        IRCEvent event;
        "[%s] @ %s".format(event);
    }
}
----

Fails a bit less reliably, but still 7 out of 10 times.

--
« First   ‹ Prev
1 2 3