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