No bounds checking for dynamic arrays at compile time?
SomeDude
lovelydear at mailmetrash.com
Wed Dec 12 22:06:11 PST 2012
On Thursday, 13 December 2012 at 04:11:10 UTC, Pacoup wrote:
> I've been newly exploring D for a very short while now, and,
> exploring Array functionality, I came upon this funny bit of
> code off of a badly written tutorial.
>
> import std.stdio;
>
> void main()
> {
> int[] intArray;
>
> intArray[0] = 42;
> intArray[1] = 54;
> intArray[2] = 91;
>
> writefln("The length of intArray is %d.", intArray.length);
> }
>
> This compiles, believe it or not, and doesn't throw any errors
> or warnings whatsoever, but obviously for people who know D,
> this will throw a core.exception.RangeError: Range violation
> when run.
>
> Why? Because Dynamic Arrays in D are not dynamic
> à-la-JavaScript, they can just be resized. The missing line
> comes directly after the array declaration:
>
> intArray.length = 3;
>
> Now, given that doing int[] myArray initializes a dynamic array
> with length 0, why is there no bounds checking on this? Why is
> the compiler not even throwing a warning telling me the dynamic
> array's length has not been initialized or that I'm trying to
> access data which is potentially out of bounds?
>
> Static arrays throw out of bounds errors on compilation when
> there's a mismatch, but why not dynamic arrays?
>
> I thought D was supposed to be a language allowing safer
> programming than C. This isn't very convincing for such an
> elementary feature of the language.
I guess the author of the tutorial should be made aware of his
mistake, before he spreads bad lessons to newcomers.
More information about the Digitalmars-d
mailing list