-release compiler switch and associative arrays
Vijay Nayar
madric at gmail.com
Tue Oct 11 07:45:38 PDT 2011
On Sun, 09 Oct 2011 12:24:24 +0100, Graham Cole wrote:
> I understand from the documentation that the "-release" compiler switch
> turns off "array bounds checking for system and trusted functions".
>
> Is it correct that the following code should seg fault when compiled
> with "-release" ?
>
> string[string] h;
> h["abc"] = "def";
> string s = h["aaa"];
>
> I.e. retrieving from an associative array for a non existent key.
>
> I would have thought that an exception should be generated in this case
> when compiled with "-release" (as it is when compiled without).
>
> This code behaves the same when compiled by both D1 and D2.
>
> Should I report this as a bug ?
Howdy Mr. Cole,
The "-release" flag disables runtime checks of data ranges and bounds of
things like arrays and pointers. These checks take a little bit of time,
but they help you catch an error as early as possible.
Without the "-release" flag, the checks are removed, so there are two
possibilities when you index an array index.
A. The memory address is out of bounds for the program as a whole, and
results in a segfault.
B. The memory address is in range for the the program as a whole, but
has no been initialized or refers to data in a completely different
variable.
Errors of the second type are especially sinister and very hard to
debug. Consider the following program:
void main() {
int[] ages = [28, 23, 40];
assert(ages[0] == 28);
ages[3] = 54;
assert(ages[3] == 54);
}
$ dmd -release bounds.d
$ ./bounds
# No segfault because the address is within the address space
# for the program allowed by the OS.
$ dmd bounds.d
$ ./bounds
core.exception.RangeError at bounds(6): Range violation
----------------
./bounds(onRangeError+0x28) [0x805f908]
./bounds(_d_array_bounds+0x16) [0x805d516]
./bounds() [0x805ae8e]
./bounds(_Dmain+0x6c) [0x805ae40]
./bounds(_D2rt6dmain24mainUiPPaZi7runMainMFZv+0x1a) [0x805d96e]
./bounds(_D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv+0x20) [0x805d608]
./bounds(_D2rt6dmain24mainUiPPaZi6runAllMFZv+0x32) [0x805d9b2]
./bounds(_D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv+0x20) [0x805d608]
./bounds(main+0x94) [0x805d5b4]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7) [0xb7681e37]
./bounds() [0x805ad21]
----------------
- Vijay
More information about the Digitalmars-d-learn
mailing list