[phobos] [Fwd: "Unsigned-related bugs never occur in real code."]

Don Clugston dclugston at googlemail.com
Thu Jan 21 07:59:11 PST 2010


The problem is that this code passes:

void main()
{
   float x = 0;
   x += 2u - 5u;
   assert(x == uint.max - 3);
}
But it's pretty unexpected and unhelpful behaviour.
It *doesn't* pass if you set:   x = x + 2u - 5u. But x += y is
equivalent to:   x = x + cast(typeof(x))y;  and since there's an
explicit cast, no error message is generated.



2010/1/21 Sean Kelly <sean at invisibleduck.org>:
> I got a reasonable answer by casting to int before calling abs():
>
> import std.math, std.stdio;
>
> void main() {
>   auto a = [ 4, 4, 2, 3, 2 ];
>   float avgdist = 0;
>   uint count;
>
>   foreach (i, e1; a) {
>       foreach (j, e2; a) {
>           if (i == j) continue;
>           if (e1 != e2) continue;
>           ++count;
>           writeln("adding ", cast(int)(i - j));
>           avgdist += abs(cast(int)(i - j));
>       }
>   }
>
>   writeln(count, " ", avgdist / count);
> }
>
> On Jan 21, 2010, at 12:41 AM, Andrei Alexandrescu wrote:
>
>> The problem persists even if I remove the call to abs(). At least its removal makes things look more suspicious.
>>
>> Andrei
>>
>> Don Clugston wrote:
>>> 2010/1/21 Sean Kelly <sean at invisibleduck.org>:
>>>> My first inclination would be for abs to only accept signed values.  Unsigned values don't really seem appropriate for unchecked math operations.
>>> I agree, it doesn't make sense to take the absolute value of something
>>> which doesn't have a sign. With range checking, it ought to be
>>> possible to implicitly cast from uint to int, which would allow all of
>>> the sensible uses. Unfortunately, implicit casting and templates don't
>>> interact well. So I think abs() might need to go back to being a
>>> non-template function.
>>>> On Jan 20, 2010, at 8:50 PM, Andrei Alexandrescu wrote:
>>>>
>>>>> Is there anything we can do about this?
>>>>>
>>>>> Andrei
>>>>>
>>>>> -------- Original Message --------
>>>>> Subject: "Unsigned-related bugs never occur in real code."
>>>>> Date: Wed, 20 Jan 2010 20:42:50 -0800
>>>>> From: Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org>
>>>>> Organization: Digital Mars
>>>>> Newsgroups: digitalmars.D
>>>>>
>>>>> "It's an academic problem. Don't worry about it and move on."
>>>>>
>>>>> That's what Walter kept on telling me. Yet I've spent the better part of
>>>>> an hour reducing a bug down to the following:
>>>>>
>>>>> import std.math, std.stdio;
>>>>>
>>>>> void main() {
>>>>>   auto a = [ 4, 4, 2, 3, 2 ];
>>>>>   float avgdist = 0;
>>>>>   uint count;
>>>>>
>>>>>   foreach (i, e1; a) {
>>>>>       foreach (j, e2; a) {
>>>>>           if (i == j) continue;
>>>>>           if (e1 != e2) continue;
>>>>>           ++count;
>>>>>           avgdist += abs(i - j);
>>>>>       }
>>>>>   }
>>>>>
>>>>>   writeln(count, " ", avgdist / count);
>>>>> }
>>>>>
>>>>> May this post be an innocent victim of the war against unsigned-related
>>>>> bugs.
>>>>>
>>>>>
>>>>> Andrei
>>>>> _______________________________________________
>>>>> phobos mailing list
>>>>> phobos at puremagic.com
>>>>> http://lists.puremagic.com/mailman/listinfo/phobos
>>>> _______________________________________________
>>>> phobos mailing list
>>>> phobos at puremagic.com
>>>> http://lists.puremagic.com/mailman/listinfo/phobos
>>>>
>>> _______________________________________________
>>> phobos mailing list
>>> phobos at puremagic.com
>>> http://lists.puremagic.com/mailman/listinfo/phobos
>> _______________________________________________
>> phobos mailing list
>> phobos at puremagic.com
>> http://lists.puremagic.com/mailman/listinfo/phobos
>
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
>


More information about the phobos mailing list