ASSERT is a very helpful macro for debugging, because it helps root out false assumptions. However, many programmers make the mistake of putting actual assignments inside the macro. Consider the following:
a = GetA();ASSERT(a != NULL);
It is tempting to collapse this code into a single line:
ASSERT((a = GetA()) != NULL);
This will only work in testing a DEBUG build of your code. When building release code, the ASSERT macro compiles to nothing, so the assignment:
a = GetA();
never happens, and can cause crashes.