Bug 16212 – Segfault using "with" for field access inside switch statement
Status
RESOLVED
Resolution
WORKSFORME
Severity
regression
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2016-06-27T20:30:00Z
Last change time
2016-07-09T06:28:20Z
Assigned to
nobody
Creator
kirsybuu
Comments
Comment #0 by kirsybuu — 2016-06-27T20:30:19Z
struct S {
int field;
}
void main() {
S s = S(3);
switch (1) with (s) {
case 1:
field = 555; // segfault
break;
default:
break;
}
}
Linux 64-bit DMD 2.071.0 and 2.070.0:
$ dmd -g switchwithbug.d
$ gdb switchwithbug
(gdb) r
Program received signal SIGSEGV, Segmentation fault.
do_lookup_x (new_hash=new_hash@entry=129119144,
old_hash=old_hash@entry=0x7fffffffdcf0,
result=result@entry=0x7fffffffdd00, scope=0x7fff0000022b, i=i@entry=0,
flags=flags@entry=1, skip=skip@entry=0x0,
undef_map=undef_map@entry=0x7ffff7ffe1c8) at dl-lookup.c:83
83 dl-lookup.c: No such file or directory.
(gdb) bt
#0 do_lookup_x (new_hash=new_hash@entry=129119144,
old_hash=old_hash@entry=0x7fffffffdcf0,
result=result@entry=0x7fffffffdd00, scope=0x7fff0000022b, i=i@entry=0,
flags=flags@entry=1, skip=skip@entry=0x0,
undef_map=undef_map@entry=0x7ffff7ffe1c8) at dl-lookup.c:83
#1 0x00007ffff7de4961 in _dl_lookup_symbol_x (
undef_name=0x40cd71 "pthread_mutex_destroy", undef_map=0x7ffff7ffe1c8,
ref=ref@entry=0x7fffffffddb8, symbol_scope=0x7ffff7ffe520,
version=0x7ffff7fd3b18, type_class=type_class@entry=1, flags=1,
skip_map=skip_map@entry=0x0) at dl-lookup.c:737
#2 0x00007ffff7de9527 in _dl_fixup (l=<optimized out>,
reloc_arg=<optimized out>) at ../elf/dl-runtime.c:111
#3 0x00007ffff7df04d5 in _dl_runtime_resolve ()
at ../sysdeps/x86_64/dl-trampoline.S:45
#4 0x000000000043e1b5 in thread_term ()
#5 0x0000000000433503 in gc_term ()
#6 0x00000000004265a0 in rt_term ()
#7 0x0000000000423421 in rt.dmain2._d_run_main() ()
#8 0x00000000004233a1 in rt.dmain2._d_run_main() ()
#9 0x0000000000423312 in _d_run_main ()
#10 0x0000000000422b80 in main ()
DMD 2.069.2 and 2.069.0: No issue!
DMD 2.068.0, 2.067.1, 2.067.0, and even 2.065.0:
Program received signal SIGSEGV, Segmentation fault.
0x000000000041d3b3 in D main () at switchwithbug.d:8
8 field = 555;
Disassembly shows that "__withSym" hidden variable is not initialized:
S s = S(3);
0x000000000041d3a8 <_Dmain+8>: movl $0x3,-0x10(%rbp)
switch (1) with (s) {
case 1:
field = 555;
0x000000000041d3af <_Dmain+15>: mov -0x8(%rbp),%rax
0x000000000041d3b3 <_Dmain+19>: movl $0x22b,(%rax)
break;
0x000000000041d3b9 <_Dmain+25>: xor %eax,%eax
default:
break;
}
}
This bug isn't limited to DMD either, making me think it is a front-end issue:
$ gdc --version
gdc (crosstool-NG 1.20.0 - 20150405-2.066.1-f378f9ab41) 4.9.2
Program received signal SIGSEGV, Segmentation fault.
strcmp () at ../sysdeps/x86_64/multiarch/../strcmp.S:132
132 ../sysdeps/x86_64/multiarch/../strcmp.S: No such file or directory.
(gdb) bt
#0 strcmp () at ../sysdeps/x86_64/multiarch/../strcmp.S:132
#1 0x00007ffff7de3e6c in check_match (sym=0x7ffff70dec08) at dl-lookup.c:177
#2 0x00007ffff7de47e6 in do_lookup_x (new_hash=new_hash@entry=245674643,
old_hash=old_hash@entry=0x7fffffffdb60,
result=result@entry=0x7fffffffdb70, scope=<optimized out>,
i=<optimized out>, i@entry=0, flags=flags@entry=1, skip=skip@entry=0x0,
undef_map=undef_map@entry=0x7ffff7ffe1c8) at dl-lookup.c:249
#3 0x00007ffff7de4961 in _dl_lookup_symbol_x (undef_name=0x4012d3 "munmap",
undef_map=0x7ffff7ffe1c8, ref=ref@entry=0x7fffffffdc28,
symbol_scope=0x7ffff7ffe520, version=0x7ffff7fd2030,
type_class=type_class@entry=1, flags=1, skip_map=skip_map@entry=0x0)
at dl-lookup.c:737
#4 0x00007ffff7de9527 in _dl_fixup (l=<optimized out>,
reloc_arg=<optimized out>) at ../elf/dl-runtime.c:111
#5 0x00007ffff7df04d5 in _dl_runtime_resolve ()
at ../sysdeps/x86_64/dl-trampoline.S:45
#6 0x000000000042daf9 in Dtor (this=...)
at /home/build/tmp/build/.build/src/gcc-4.9.2/libphobos/libdruntime/gc/gc.d:3149
#7 Dtor (this=...)
at /home/build/tmp/build/.build/src/gcc-4.9.2/libphobos/libdruntime/gc/gc.d:1433
#8 gc.gc.GC.Dtor() (this=...)
---Type <return> to continue, or q <return> to quit---
at /home/build/tmp/build/.build/src/gcc-4.9.2/libphobos/libdruntime/gc/gc.d:285
#9 0x0000000000418d96 in gc_term ()
at /home/build/tmp/build/.build/src/gcc-4.9.2/libphobos/libdruntime/gc/proxy.d:148
#10 0x0000000000407cb0 in rt_term ()
at /home/build/tmp/build/.build/src/gcc-4.9.2/libphobos/libdruntime/rt/dmain2.d:195
#11 0x0000000000407d29 in runAll (this=0x7fffffffdda0)
at /home/build/tmp/build/.build/src/gcc-4.9.2/libphobos/libdruntime/rt/dmain2.d:415
#12 0x00000000004079af in rt.dmain2._d_run_main() (
this=this@entry=0x7fffffffdda0, dg=...)
at /home/build/tmp/build/.build/src/gcc-4.9.2/libphobos/libdruntime/rt/dmain2.d:386
#13 0x0000000000407b36 in _d_run_main (argc=1, argv=0x7fffffffdf08,
mainFunc=<optimized out>)
at /home/build/tmp/build/.build/src/gcc-4.9.2/libphobos/libdruntime/rt/dmain2.d:419
#14 0x0000000000402bf8 in main (argc=1, argv=0x7fffffffdf08)
at /home/kirsybuu/x86_64-gdcproject-linux-gnu/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/include/d/__entrypoint.di:62
Comment #1 by ketmar — 2016-06-28T10:02:33Z
in master, it now says:
Error: 'switch' skips declaration of 'with' temporary at z40.d(6)
it was introduced in commit 1a26535fd627ca398d2609228bce20905440360d (fix Issue 14532).
Comment #2 by ketmar — 2016-06-28T10:03:32Z
so i suppose that this bug can be closes as "fixed", but i'll wait for someone else to check it too before closing.
Comment #3 by bugzilla — 2016-07-09T06:28:20Z
Yes, this was fixed recently by fixing another issue.