I was taking a look at the assert() reference page and I got stuck while I read the given example:
/* assert example */
#include <stdio.h>
#include <assert.h>
int main ()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
assert (datafile);
fclose (datafile);
return 0;
}
In this example, assert is used to abort the program execution if datafile compares equal to 0, which happens when the previous call to fopen was not successful.
I totally agree that if fopen() fails, assert() will abort execution. However I'm concerned about the rightness of this example:
In my opinion assert() is there to detect cases that can't normally happen (like passing a NULL pointer to a function whose documentation states it is forbidden).
In this example, failing to open a file is not something that can't normally happen. In fact, I can see dozens of reasons why this would fail. The file couldn't exist, the program could run without required privileges, and so on.
I would rather have done something like:
/* not longer an assert example */
#include <stdio.h>
#include <assert.h>
int main ()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
if (datafile != NULL)
{
// Do something, whatever.
fclose (datafile);
} else
{
// Report the error somehow.
}
return 0;
}
Is my understanding of how assert() should be used incorrect ?
EDIT AND GOOD NEWS !
It seems the referred site is ruled by rigorous people. Here is the mail I got back from one of the site maintainer:
Hi Julien, I have to agree, the example code was poorly chosen. It has now been just re