GNU Midnight Commander


BUG OF THE MONTH | An error in the condition

V560 A part of conditional expression is always true: (‘\n’ != c). params.c 136.

static int
EatWhitespace (FILE * InFile)
  /* ----------------------------------------------------------------------- **
   * Scan past whitespace (see ctype(3C)) and return the first non-whitespace
   * character, or newline, or EOF.
   *  Input:  InFile  - Input source.
   *  Output: The next non-whitespace character in the input stream.
   *  Notes:  Because the config files use a line-oriented grammar, we
   *          explicitly exclude the newline character from the list of
   *          whitespace characters.
   *        - Note that both EOF (-1) and the nul character ('\0') are
   *          considered end-of-file markers.
   * ----------------------------------------------------------------------- **
    int c;

    for (c = getc (InFile); isspace (c) && ('\n' != c); c = getc (InFile))
    return (c);
}                               /* EatWhitespace */

The fault for all the confusion lies with the authors of the GNU Midnight Commander project, who made their own implementation of isspace in the file charset.h:

#ifdef isspace
#undef isspace
#define isspace(c) ((c)==' ' || (c) == '\t')

The custom macro, in its turn, treats only space and tab characters as whitespace characters. Let’s substitute that macro and see what happens.

for (c = getc (InFile);
     ((c)==' ' || (c) == '\t') && ('\n' != c);
     c = getc (InFile))

The (‘\n’ != c) subexpression is unnecessary (redundant) since it will always evaluate to true.

Please click here to see more bugs from this project.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.