Reading misc. tutorials related to SDL development I’ve found two different examples, doing the same thing, but in a different manner. I was wondering which of the two are you considering to be correct, judging from the perspective of code “security” and maintainability .
In the first example the programmer isn’t using assert at all, but the code looks OK (at least for my eye):
int main(){
SDL_Surface *screen;
/** Initialize SDL */
if(SDL_Init(SDL_INIT_VIDEO)!=0){
fprintf(stderr,"Unable to initialize SDL: %s",SDL_GetError());
}
atexit(SDL_Quit);
/** Sets video mode */
screen=SDL_SetVideoMode(640,480,16,SDL_HWSURFACE);
if(screen==NULL){
fprintf(stderr,"Unable to set video mode: %s",SDL_GetError());
}
return (0);
}
In the second example the programmer [other] is using a different approach, something like (the code isn’t exactly copy-paste):
int main(){
SDL_Surface* screen;
/** Initialize SDL */
assert(SDL_Init(SDL_INIT_VIDEO)==0);
atexit(SDL_Quit);
/** Sets video mode */
screen=SDL_SetVideoMode(640,480,16,SDL_HWSURFACE);
assert(screen!=NULL);
return (0);
}
Is it OK to “substitute” in the if conditions (from the first example) with asserts like in the second example ?
What’s the right strategy (if there’s any) ?
It is not OK to do this substitution. The second example is wrong, because
assert(x)gets expanded to nothing in non-debug builds (whenNDEBUGis defined). This implies that the pointer checks inassertabove are removed from the code in release builds. That is definitely wrong.So, when should one use
assert? It is useful for documenting and debugging. In a way, you’re saying, “I am sure that this condition is true, and am putting it here as anassertto catch bad code during debugging, and to document the condition to the readers of the code”.So, there is a BIG difference between the two examples. For things like checking the return value of
malloc,assertis wrong because there is no guarantee that they will return non-NULL, and as I have mentioned above,assert(x)means “I am completely surexis true”, and not just “Ifxis not true, it is bad”. For this, one usesif(x) good(); else bad();control.SDL_InitandSDL_SetVideoModecan return-1andNULLrespectively.