[Issue 5212] New: Safer typesafe variadics
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sat Nov 13 10:14:34 PST 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5212
Summary: Safer typesafe variadics
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: bearophile_hugs at eml.cc
--- Comment #0 from bearophile_hugs at eml.cc 2010-11-13 10:13:23 PST ---
With DMD 2.050 this D2 program usually asserts at run-time:
class Foo {
int[] args;
this(int[] args_...) {
args = args_;
}
}
Foo foo() {
return new Foo(1, 2, 3); // passes stack data to Foo
}
void main() {
assert(foo().args == [1, 2, 3]);
}
That's the root cause of a bug found by a person in the D.learn group:
http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=22697
Just adding a dup inside the this() avoids the bug. Also, the bug is avoided if
Foo receives arguments like this:
Foo foo() {
return new Foo([1, 2, 3]);
}
So this nature of typesafe variadic arguments is bug-prone. There are various
ways to avoid this problem.
One possible solution is to modify the semantics of this kind of arguments
pass, so the code inside the function foo always see an args array allocated on
the heap (it may perform a run-time test, and dup the given arguments only if
the data is on the stack, so in the second example it doesn't dup and saves a
little of RAM and running time).
To restore the original efficient semantics of the typesafe variadics a "scope"
attribute may be added (as the one used to avoid a closure):
class Foo {
int[] args;
this(scope int[] args_...) { // unsafe but fast
args = args_;
}
}
This is safer than the current semantics because, as usual in D design, the
safe way is the built-in one and the faster one is on request.
This is just one of the possible ways to avoid this problem.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list