Click here to Skip to main content
15,893,508 members
Articles / Programming Languages / C++
Tip/Trick

Verify

Rate me:
Please Sign up or sign in to vote.
5.00/5 (1 vote)
2 Jul 2013BSD2 min read 19.4K   130   5   8
A Practical Alternative to Assert in C++

Background

I confess that in the past, I have abused assert(). I used it for handling nearly all of my errors, and rarely used return values or anything else. When I started taking computer science classes, I was introduced to try, catch, and exceptions, and using them I was able to write more productive and useful code.

However, there is one thing that I believe assert is superior at: aesthetics. When writing code, I much prefer the brevity of the assert macro. It's simpler, takes up less space, and is overall much more pleasing to look at than if statements and throws.

Verify was my solution. A macro which has the brevity of assert, but uses the much more practical Exceptions.

Using the Code

Verify is a two parameter macro. The first parameter is the condition to test, the second is the Exception that will be thrown if the condition is false.

C++
#include "verify.h"

void func1(void* ptr)
{
    verify(ptr != NULL, -1);
}

Verify has three modes:

Standard

The simplest mode, if the condition is false, it throws the Exception. The End.

Debug

Debug mode carries over some features I found useful in the assert macro. If the condition is true, then nothing happens, but if it is false, it prints out the following debug information to the screen:

  • The condition passed to the macro.
  • The exception that was thrown.
  • File name
  • Function name
  • Line number

Then it throws the Exception.

No Verify

The equivalent of NDEBUG for assert. If NVERIFY is defined ahead of the verify header, then verify() has no effect.

Conclusion

And that's pretty much it. Short, sweet, and to the point. If you can think of any improvements or find any problems, please let me know in the comments.

I'd like to thank Charles Nicholson for his article Adventures in Assert, which was a great help in solving several bugs I had in my original code.

License

This article, along with any associated source code and files, is licensed under The BSD License


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionI am confused Pin
geoyar1-Jul-13 5:58
professionalgeoyar1-Jul-13 5:58 
GeneralYou don't seem to understand the concept behind assert and verify Pin
pasztorpisti28-Jun-13 8:58
pasztorpisti28-Jun-13 8:58 
GeneralRe: You don't seem to understand the concept behind assert and verify Pin
Jacob F. W.28-Jun-13 11:22
Jacob F. W.28-Jun-13 11:22 
GeneralRe: You don't seem to understand the concept behind assert and verify Pin
pasztorpisti28-Jun-13 12:26
pasztorpisti28-Jun-13 12:26 
There is quite a clear separation between exception handling and asserts. Asserts are usually used to check preconditions - the state of the program (incoming parameters/maybe parameters and state variables/global variables) before performing an operation/algorithm. I use assert to check for programming errors that should never happen (like in case of ASSERTM("This should never happen.") Smile | :) ), for example when Joseph passes -2 to my function when the function documentation (programmer documentation) says that you have to pass an integer in the range [-1..10]. You can document some of your function parameters simply by putting assert() and assertcm() statements inside your function! Its much better than writing a comment above the function about the valid parameter ranges/combinations! For this reason its ok not to compile asserts into the release code because asserts check for programming mistakes/bugs that don't exist in the final product, do they??? Smile | :)
In contrast exception handling is used to indicate errors that can happen even in the released program even if the program code itself "doesn't contain any bugs", for example when a file can not be opened (maybe because of some disk errors or it simply doesn't exist, you don't have permission, etc...). You have to have this code even in the released product unlike asserts.
Sometimes the best solution is using both an assert and some other kind of runtime error handling that compiles to the program! The assert helps catching a bug early and the runtime error handling helps avoiding a crash (if its possible at all).
Note that exception handling is just one of the error handling mechanism. In some C++ codebases/projects the use of exceptions aren't allowed at all (coding convention) and the code is compiled with exception handling turned off!

Something I forgot from the previous post: A nice assert implementation provides you with a stacktrace as well! This is one of the most useful features of a nice assert! Our assert implementation uploads assert messages + stacktraces to a central machine from every users machine in the company and its often quite easy to find assert reasons by stacktraces.
Note: we have 3 build configs: debug, release+asserts, release. release+asserts is used only internally by testers.
GeneralRe: You don't seem to understand the concept behind assert and verify Pin
Jacob F. W.28-Jun-13 17:23
Jacob F. W.28-Jun-13 17:23 
GeneralRe: You don't seem to understand the concept behind assert and verify Pin
pasztorpisti29-Jun-13 7:02
pasztorpisti29-Jun-13 7:02 
QuestionNot enough... Pin
Mehdi Gholam27-Jun-13 20:18
Mehdi Gholam27-Jun-13 20:18 
AnswerRe: Not enough... Pin
Jacob F. W.27-Jun-13 20:21
Jacob F. W.27-Jun-13 20:21 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.