On Monday, 6 April 2015 at 05:15:43 UTC, Walter Bright wrote:
On 4/5/2015 7:13 PM, Andrei Alexandrescu wrote:
I've spent the better part of yesterday and today debugging a
complex matter
involving pointers, reduced to this:
../dmd/src/dmd -conf= -I../druntime/import -w -dip25 -m64 -O
-release -main
-unittest generated/osx/release/64/libphobos2.a -defaultlib=
-debuglib= -L-lcurl
-run std/experimental/allocator/kernighan_ritchie.d
In this configuration, surprisingly there's no bounds checks
inserted. I need to
explicitly add -boundcheck=on.
Why the change? I've fought tooth and nail for keeping bounds
checking in
release mode and with optimizations on, precisely because I
think it's a check
that's valuable enough to warrant explicit disabling.
Could someone please explain. This is a shame.
I read the code to figure out what was happening.
At some point, -release was changed so that bounds checking was
turned off for all but @safe code.
You made that change back in 2009.
https://issues.dlang.org/show_bug.cgi?id=3407
-release used to turn off all bounds checking. Andrei wanted it
to stay in safe code at least so you added -noboundscheck to
appease those that wanted it off even in safe code then you made
it do bounds checking by default in safe code even if -release
was specified. There was never an option to turn on bounds
checking for all code in release mode (not until -boundscheck=on
was added). Whenever we'd discuss -noboundcheck on the forums
you'd have 5 people with 5 different ideas about what that option
did. It was very confusing.
A new switch was added, -boundscheck=[on|safeonly|off]. It took
me a while to find it at:
http://dlang.org/dmd-linux.html
because whoever added it didn't realize that the list was
alphabetized and stuck it in there after -map.
Yep, I didn't notice that.
I don't know why the change was made.
Several reasons which I'll reproduce here from bugzilla[1]:
---
1. What -noboundscheck actually does is confusing. Its purpose is
to turn off bounds checking in @safe code (and all other code)
which comes as a surprise to a lot of people. -release turns off
bounds checking in non-@safe code (which also surprises some
people) but leaves it on for @safe code.
2. There is currently no way to turn on bounds checking for
release builds currently.
3. There is currently no way to turn off bounds checking for
non-@safe code without pulling in everything -release does (or
turning off bounds checking for @safe code too).
---
No bounds checking defaults were affected by my change (or
shouldn't have been, if they were it's a bug). What Andrei wants
couldn't be done before this option was added.
1. https://issues.dlang.org/show_bug.cgi?id=12550