A little bug
Andrej Mitrovic
andrej.mitrovich at gmail.com
Sun Dec 25 18:06:07 PST 2011
I've found this sort of bug in xfBuild:
import std.stdio;
class Deps { }
struct Mod {
Deps deps;
}
void main() {
Mod[] compileArray;
foreach (i; 0 .. 2) {
compileArray ~= Mod(new Deps);
}
foreach (mod; compileArray) {
mod.deps = null;
}
foreach (mod; compileArray) {
writeln(mod.deps is null); // surprise!
}
}
This will print "false, false". It's interesting how easy it is to
lose sight of value semantics. I only discovered this bug by chance
and would have easily missed it by eye. The fix is to use "foreach
(ref mod; compileArray)". Even though mod.deps ends up being a
reference to an object, it's the reference itself that ends up being
nulled, not the object itself. E.g.:
class Deps { }
struct Mod {
Deps deps;
}
void main() {
Mod mod1 = Mod(new Deps);
Mod mod2 = mod1;
assert(mod1.deps is mod2.deps);
mod1.deps = null;
assert(mod1.deps !is mod2.deps);
}
Anyway I thought this was interesting. I wonder if this sort of bug is
lurking in some other D codebases out there..
More information about the Digitalmars-d
mailing list