|
Use assert()
Submitted by bgl |
Hopefully, most of you will already know and love this technique.
However, for those of you still forming good programming habits,
read on.
Too many people write code without using assert(). The paranoid
ones will put in tests for invalid arguments and return an error
code, which no-one then checks for. The sloppy one will just let
the code crash, or worse, subtly mis-behave. (Crashing is better
because it's usually easier to find than subtle corruption bugs).
The C (and C++) construct "assert()" is found in and
can be used to check things that should always be true. It can
be used for testing that arguments are OK, for testing that an
algorithm indeed returns an item with the right property, and
worst case for triggering a known debugger break (by asserting
something which is not true).
The good thing about assert() is that it breaks you into the
debugger immediately when a bug is detected, where you can look
at all the variables, the stack trace, and figure out why it got
there. Once you never hit any of your assert()s (and that should,
obviously, be the normal state) you can build the release version
with #define NDEBUG 1, and all those assert()s will be taken out
of the code by the preprocessor, and not suck up cycles checking
for bugs in released (thus already debugged) code.
Simple (somewhat silly, not compile-tested) example:
#include <assert.h
struct node {
struct node * next;
void * item;
};
struct node * find_node_for_item(struct node * list, void * item)
{
assert(list != NULL); /* this function must be called on */
assert(item != NULL); /* valid arguments only */
while (list != NULL) {
if (list-item == item) return list;
list = list-next;
}
/* this function should not be called for items that
do not exist, so trigger a debugger break */
assert(1 == 0);
return NULL;
} |
|
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
|