in/out with -release

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Sat Mar 5 10:12:30 PST 2011


On Sat, 05 Mar 2011 10:15:48 -0700, user wrote:

> On 03/04/2011 09:22 PM, Jonathan M Davis wrote:
>> On Friday 04 March 2011 20:14:32 Kai Meyer wrote:
>>> I have an 'enforce' function call in an 'in' block for a function.
>>> When I compile with "-release -O -inline", the in/out blocks appear to
>>> be skipped. It's a simple verification for a dynamic array to not have
>>> a length of 0. In debug mode, the test condition hits the enforce in
>>> the 'in' block, but in release mode it does not. In both release and
>>> debug mode, the same exact enforce function works properly.
>>>
>>> So am I to understand that -release will skip in/out blocks entirely?
>>
>> Of course. It uses asserts. asserts are disabled in -release. Asserts
>> are for debugging, testing, and verifying code when developing, not for
>> code which is released. So, you get the benefit of the test when you
>> don't have -release and the benefit of speed when you do have -release.
>> If an assertion fails, your code logic is invalid. It's for validating
>> your code, not user input or whatnot.
>>
>> enforce, on the other hand, is not a language primitive. It's not
>> intended for testing or debugging. It's intended to be used in
>> production code to throw an exception when its condition fails. If an
>> enforce fails, that generally means that you had bad input somewhere or
>> that an operation failed or whatnot. It's not intended for testing the
>> logic of your code like assert is intended to do. It's simply a
>> shorthand way to throw an exception when your program runs into a
>> problem.
>>
>> - Jonathan M Davis
> 
> I don't think I understand your response entirely. I understand that
> asserts are disabled in -release mode. I understand that enforce is a
> function that comes with std.exception, and the code isn't hard to
> follow.
> 
> What I'm confused about is the in block, and why it is skipped in
> -release mode. You say "It uses asserts." I didn't put an assert in my
> in block, I put an enforce. So I'm guessing that you are indicating that
> the in block is treated like an assert, and is disabled with the
> -release flag.
> 
> But I think after reading your post you've helped clarify that what I'm
> checking (that you can't pop an empty stack) based on user input is
> something I should be checking with an enforce inside the function, and
> not an assert or enforce inside the in block.
> 
> I still think I would like it if you could be a little more explicit
> about the in/out blocks. Are they always disabled entirely (skipped)
> with -release, or just certain things?
> 
> Thanks for your help!
> 
> -Kai Meyer

That's right.  in, out and invariant blocks are not included in release 
mode.

-Lars


More information about the Digitalmars-d-learn mailing list