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