https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87041

            Bug ID: 87041
           Summary: GCC 8 regression: -Wformat "reading through null
                    pointer" on unreachable code
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: achurch+gcc at achurch dot org
  Target Milestone: ---

In GCC 8, the following code compiled with -O1 -Wformat warns about passing
NULL to a %s format token even though the call can never be executed:

extern int printf(const char *, ...);
void foo(void) {
    const char * const s = 0;
    if (s) printf("%s\n", s);
}

foo.c: In function 'foo':
foo.c:4:5: warning: reading through null pointer (argument 2) [-Wformat=]
     if (s) printf("%s\n", s);
     ^~

This breaks testing macros of the following style, which worked fine through
GCC 7.3.0:

#define CHECK_STREQUAL(value, expected)  do {                             \
    const char * const _value = value;                                    \
    const char * const _expected = expected;                              \
    if (!_value && _expected) FAIL("Got NULL, expected [%s]", _expected); \
    if (_value && !_expected) FAIL("Got [%s], expected NULL", _value);    \
    if (_value && _expected && strcmp(_value, _expected) != 0)            \
        FAIL("Got [%s], expected [%s]", _value, _expected);               \
} while (0)

Here, passing NULL for the value of "expected" triggers the warning on the
final FAIL() invocation, even though that case will never be executed when
"expected" is NULL.

The warning disappears at -O0 or if the variable is not const (e.g., "const
char *s" instead of "const char * const s").

Reply via email to