Array operation doesn't check array bounds
Kai Meyer
kai at unixlords.com
Mon Apr 4 08:29:48 PDT 2011
On 04/03/2011 05:06 PM, Jonathan M Davis wrote:
> On 2011-04-03 04:10, simendsjo wrote:
>> int[] a = [1,2,3];
>>
>> int[4] b;
>> assert(b == [0,0,0,0]);
>> b = a[] * 3; // oops... a[] * 3 takes element outside a's bounds
>> assert(b[$-1] == 0); // fails.. last element is *(a.ptr+3) * 3
>
> Array bounds checking is done on code which is not compiled with the -
> noboundscheck flag and which is either not built with -release or is @safe.
>
> I assume that you're not compiling with -noboundscheck (which turns off all
> array bounds checking). So, you're likely compiling with -release on code
> which isn't @safe. @system is the default, so unless you've marked your code
> @safe or you're not compiling with -release, I wouldn't expect there to be any
> bounds checking. If you want to guarantee that there's always bounds checking,
> then you need to mark your code @safe and not use -noboundscheck. However,
> given how little of Phobos is currently @safe or @trusted, odds are that
> trying to mark your code @safe will get _really_ annoying at this point. And
> to fix that, we'd likely need conditional @safe and conditional @trusted for
> the same reasons that we need conditional pure. And those haven't been taken
> care of yet (there isn't even an official plan to as far as I know - though
> hopefully there will be).
>
> - Jonathan M Davis
This is the really verbose answer to the question I thought you were
asking as well.
I think this problem is better expressed like this:
import std.stdio;
void main()
{
int[] a = [1,2,3];
int[4] b;
int[4] c = [0,1,2,3];
int[5] d = [0,1,2,3,4];
assert(b == [0,0,0,0]);
b = c[] * 3; // like foreach(val; c) b.append(val*3);
writef("%s %s %s\n", a, b, c);
b = a[] * 3; // No error
writef("%s %s %s\n", a, b, c);
b = a[]; // object.Exception: lengths don't match for array copy
writef("%s %s %s\n", a, b, c);
writef("%s\n", a[] * 3); // bounds.d(15): Error: Array operation
a[] * 3 not implemented
assert(b[$-1] == 0);
}
I think bearophile addressed this, but I can't quite tell.
So now I'm curious, why does the multiply operation break the bounds
check? Also, why does it fail to print? The result can be stored in
another array, so I would think it would print.
More information about the Digitalmars-d-learn
mailing list