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

Sean Kelly sean at invisibleduck.org
Thu Jan 21 09:24:52 PST 2010


Yeah, I was mostly responding to your earlier comment that casting  
didn't work for you. If you really wanted to cast it would be to  
ptrdiff_t anyway.

I agree that there's a more fundamental problem though. Weren't we  
going to make implicit narrowing conversions an error?  I know it  
isn't in the spirit of c, but c allows all sorts of horrible nonsense.

Sent from my iPhone

On Jan 21, 2010, at 8:22 AM, Andrei Alexandrescu <andrei at erdani.com>  
wrote:

> On a 64-bit system you have a portability problem. Generally casts  
> are bad because they specify the target type when you actually want  
> a different manipulation (in this case, changing signedness).
>
> std.traits has a function called "unsigned" that takes an integral  
> of any length and returns the corresponding unsigned integral. I'll  
> define also "signed". With that and with the change to abs(), abs(j  
> - i) is an error (static assert), and will actually suggest that you  
> use abs(signed(j - i)) in its error message.
>
> At any rate, all these fixes don't make me feel much better. Bugs  
> are easy to come by and difficult to find (my initial code involved  
> an associative array, and AAs have their _own_ bugs that made me  
> suspicious).
>
> In brief, D still has big problems with handling signed and unsigned  
> integrals.
>
>
> Andrei
>
> Sean Kelly wrote:
>> 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
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos


More information about the phobos mailing list