Bounds check

bearophile via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri May 23 10:30:51 PDT 2014


Chris:

> The following:
>
> import std.stdio;
>
> void main() {
>   int[5] arg;
>   arg[10] = 3;              // Compiler says (of course): 
> Error: array index 10 is out of bounds arg[0 .. 5]
> }
>
> import std.stdio;
>
> void main() {
>   int[5] arg;
>   foreach (i; 0..10) {
>     arg[i] = i;
>   }
> }
>
> Compiler says nothing, but we get a runtime error 'Range 
> violation'.
>
> Bug or design?

Spotting the second bug is beyond the very limited analysis 
capabilities of the D compiler. But a slightly different but 
still rather common kind of code (where the index is not mutable) 
could be spotted as buggy by the compiler:


void main() {
     int[5] data;
     foreach (const i; 0 .. 10)
         data[i] = 0;
     foreach (immutable i; 0 .. 10)
         data[i] = 0;
     int[10] big;
     foreach (const i, x; big)
         data[i] = x;
}

(In D it's very good to tag as const/immutable the indexes of 
arrays, as work around a design bug of D foreach).

But the compiler must recognize this as correct code:


void main() {
     int[5] data;
     foreach (const i; 0 .. 10)
         if (i < 5)
             data[i] = 0;
}


So can we add this logic in the compiler?

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list