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