Create class on stack

Johan Engelen via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 8 14:15:05 PDT 2017


On Monday, 7 August 2017 at 13:40:18 UTC, Moritz Maxeiner wrote:
>
> Thanks, I wasn't aware of this. I tried fooling around scope 
> classes and DIP1000 for a bit and was surprised that this is 
> allowed:

Thanks for the test case :-)
It was fun to see that ASan can catch this bug too. Because 
writing the blog post about ASan will take quite some time still, 
I've pasted the demonstration below (there is a big big big 
caveat that will need more work from LDC's side, but you'll have 
to wait until the blog article).

Simplified your code for the demonstration:
```
class A {
     int i;
}

void inc(A a) @safe {
     a.i += 1; // Line 6
}

auto makeA() @safe {  // Line 9
     import std.algorithm : move;
     scope a = new A();
     return move(a);
}

void main() @safe {
     auto a = makeA();
     a.inc(); // Line 17
}
```

```
> ldc2 -fsanitize=address -disable-fp-elim scopeclass.d -g -O1 
> -dip1000
> ASAN_OPTIONS=detect_stack_use_after_return=1 ./scopeclass 2>&1 
> | ddemangle

=================================================================
==11446==ERROR: AddressSanitizer: stack-use-after-return on 
address 0x000104929050 at pc 0x0001007a9837 bp 0x7fff5f457510 sp 
0x7fff5f457508
READ of size 4 at 0x000104929050 thread T0
     #0 0x1007a9836 in @safe void scopeclass.inc(scopeclass.A) 
scopeclass.d:6
     #1 0x1007a9a20 in _Dmain scopeclass.d:17
     #2 0x1008e40ce in 
_D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv 
(scopeclass:x86_64+0x10013c0ce)
     #3 0x7fff9729b5ac in start (libdyld.dylib:x86_64+0x35ac)

Address 0x000104929050 is located in stack of thread T0 at offset 
80 in frame
     #0 0x1007a984f in pure nothrow @nogc @safe scopeclass.A 
scopeclass.makeA() scopeclass.d:9
```



More information about the Digitalmars-d-learn mailing list