bearophile can say "i told you so" (re uint->int implicit conv)
Adam D. Ruppe
destructionator at gmail.com
Thu Mar 28 13:03:07 PDT 2013
I was working on a project earlier today that stores IP addresses
in a database as a uint. For some reason though, some addresses
were coming out as 0.0.0.0, despite the fact that if(ip == 0)
return; in the only place it actually saves them (which was my
first attempted quick fix for the bug).
Turns out the problem was this:
if (arg == typeid(uint)) {
int e = va_arg!uint(_argptr);
a = to!string(e);
}
See, I copy/pasted it from the int check, but didn't update the
type on the left hand side. So it correctly pulled a uint out of
the varargs, but then assigned it to an int, which the compiler
accepted silently, so to!string() printed -blah instead of
bigblah... which then got truncated by the database, resulting in
zero being stored.
I've since changed it to be "auto e = ..." and it all works
correctly now.
Anyway I thought I'd share this just because one of the many
times bearophile has talked about this as a potentially buggy
situation, I was like "bah humbug"... and now I've actually been
there!
I still don't think I'm for changing the language though just
because of potential annoyances in other places unsigned works
(such as array.length) but at least I've actually felt the other
side of the argument in real world code now.
More information about the Digitalmars-d
mailing list