bearophile can say "i told you so" (re uint->int implicit conv)
Don
turnyourkidsintocash at nospam.com
Tue Apr 2 00:49:03 PDT 2013
On Thursday, 28 March 2013 at 20:03:08 UTC, Adam D. Ruppe wrote:
> 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.
IMHO, array.length is *the* place where unsigned does *not* work.
size_t should be an integer. We're not supporting 16 bit systems,
and the few cases where a size_t value can potentially exceed
int.max could be disallowed.
The problem with unsigned is that it gets used as "positive
integer", which it is not. I think it was a big mistake that D
turned C's "unsigned long" into "ulong", thereby making it look
more attractive. Nobody should be using unsigned types unless
they have a really good reason. Unfortunately, size_t forces you
to use them.
More information about the Digitalmars-d
mailing list