Providing implicit conversion of - memory-safety

bachmeier no at spam.net
Wed Jan 24 00:41:09 UTC 2024


On Tuesday, 23 January 2024 at 23:40:55 UTC, Danilo wrote:
> On Tuesday, 23 January 2024 at 17:54:25 UTC, bachmeier wrote:
>> Here's a reduced version of one of the most bizarre bugs I've 
>> dealt with in any language. The only reason I didn't move on 
>> to another language was because I was too busy at the time.
>>
>> The code allows for initial values if the index is less than 
>> 0, otherwise it returns the element.
>>
>> ```
>> import std;
>>
>> double value(T)(T index, double * x) {
>>   if (index - 5 < 0) {
>>     return 0.0;
>>   } else {
>>     return x[index-5];
>>   }
>> }
>>
>> void main() {
>>   double[] v = [1.1, 2.2, 3.3];
>>   // Works
>>   writeln(value(3, v.ptr));
>>   // Lucky: program segfaults
>>   writeln(value(v.length, v.ptr));
>> }
>> ```
>>
>> I noticed this behavior only because the program crashes. Once 
>> I figured out what was going on, I realized that the thousands 
>> of lines of code I had already written needed to be checked 
>> and possibly rewritten. If only I had a compiler to do that 
>> for me.
>
> How did you make it correct?

The fix is very easy once you realize what's going on. index is 
ulong, so index - 5 is ulong (even though it doesn't make any 
sense). All you have to do is change index to index.to!long and 
the problem is solved.


More information about the Digitalmars-d-learn mailing list