[cfe-dev] CLang 2.1 doesn't catch assert within if
Charles Davis
cdavis at mymail.mines.edu
Fri Oct 7 22:16:01 PDT 2011
On Oct 7, 2011, at 11:02 PM, Don Quixote de la Mancha wrote:
> You NEVER EVER want to do the following:
>
> if ( condition )
> assert( must_be_true );
>
> following_line();
>
> If NDEBUG is defined as for a release or profile build, you'll get the
> following in your preprocessed code, which will be very hard to debug:
>
> if ( condition )
> following_line();
No it won't. It will look like this:
if ( condition )
(void)0;
following_line();
That's because, when NDEBUG is defined, assert(3) is defined like so:
#define assert(cond) (void)0
> Even better is to make the if statement part of the assert:
>
> assert( condition && must_be_true );
Actually, that's worse. Now if the condition is false, instead of skipping the assert, the assertion will now fail. What you really meant is:
assert( !(condition) || (must_be_true) );
Now the assert won't fail if the condition is false. If it is true, it will attempt to evaluate (must_be_true) like before. (I put it in parentheses because 'must_be_true' might be an expression like 'this && that', which won't work quite right without them.)
Chip
More information about the cfe-dev
mailing list