digitalmars.D.bugs - [Issue 11044] New: Escaping references to lazy argument are allowed
- d-bugmail puremagic.com (49/49) Sep 15 2013 http://d.puremagic.com/issues/show_bug.cgi?id=11044
http://d.puremagic.com/issues/show_bug.cgi?id=11044 Summary: Escaping references to lazy argument are allowed Product: D Version: unspecified Platform: All OS/Version: All Status: NEW Keywords: accepts-invalid Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: maxim maxim-fomin.ru --- Currently lazy parameter implies creating delegate which references local variable. Allowing to escape lazy argument without allocating local variable at heap leads to leaked pointers to some stack zone which is a memory error. extern(C) int printf(const char*,...) safe; auto foo(lazy double i) safe { return { return i; } ; } auto bar() safe { double i = 4.0; return foo(i); } void baz() safe { double[2] i = 3.14; // this value overwrites 4.0 // replace with char[16] val = 'f'; // to print deterministic garbage } void main() safe { auto x = bar(); baz(); printf("%f\n", x()); } This prints 3.14 which is wrong. Potentially compiler can recognize that lazy argument escapes and allocate i = 4.0 on heap, but due to separate compilation model, it cannot do this in general case, so the code should be rejected. This is a more complex variation of known 'ref-ref' bug which consists in returning reference to local object which has gone out of scope: ref int foo(ref int i) { return i; } ref int bar() { int val; return foo(i); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 15 2013