[Issue 14639] New: Assigning init value to struct uses stack, causing segfault
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sun May 31 23:49:30 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=14639
Issue ID: 14639
Summary: Assigning init value to struct uses stack, causing
segfault
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: DMD
Assignee: nobody at puremagic.com
Reporter: tomerfiliba at gmail.com
Consider the following snippet:
struct Biggy {
ulong[50000] a;
}
__gshared Biggy biggy;
void main() {
biggy = Biggy.init;
}
produces the following code
Dump of assembler code for function _Dmain:
...
=> 0x000000000047fa04 <+4>: movabs $0x6faef0,%rsi
0x000000000047fa0e <+14>: movabs $0x7d6a90,%rdi
0x000000000047fa18 <+24>: mov $0x1b774,%ecx
0x000000000047fa1d <+29>: rep movsq %ds:(%rsi),%es:(%rdi)
which is fine. However, adding a @disable this(this) to Biggy, i.e.,
struct Biggy {
ulong[50000] a;
@disable this(this);
}
produces
Dump of assembler code for function _Dmain:
...
=> 0x000000000047fba4 <+4>: movabs $0x7d6a88,%rsi
0x000000000047fbae <+14>: mov $0x1b774,%ecx
0x000000000047fbb3 <+19>: pushq (%rsi)
0x000000000047fbb5 <+21>: sub $0x8,%rsi
0x000000000047fbb9 <+25>: loop 0x47fbb3 <_Dmain+19>
0x000000000047fbbb <+27>: movabs $0x7d6a90,%rdi
0x000000000047fbc5 <+37>: callq 0x47fb70
<_D7themain5Biggy8opAssignMFNaNbNcNiNjNfS7themain5BiggyZS7themain5Biggy>
0x000000000047fbca <+42>: add $0xdbba0,%rsp
which, as you can see, copies Biggy.init onto the *stack* and then calls
opAssign on it. Notice that Biggy does not define opAssign, and even if it did,
it doesn't make sense to *copy* the type's init to a temp location.
Now since Biggy is big (~400KB), and the function is run on a stack-constrained
fiber, we got a very peculiar segfault.
Is there any reason for this odd behavior? I would have used memcpy, but
&Biggy.init won't compile.
-tomer (weka.io)
--
More information about the Digitalmars-d-bugs
mailing list