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

            Bug ID: 79554
           Summary: Zero length format string passed to fprintf under if
                    statement causes error message
           Product: gcc
           Version: 4.8.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: cnconlinux at gmail dot com
  Target Milestone: ---

I've written a macro which throws compilation error while there is no error at
all. strcmp makes a check to avoid passing empty format string to fprintf
function, but compiler doesn't know about it because it's a macro. But even
making a pointer to constant string doesn't work.

I want gcc to check for format-security, but it must ignore such situations. If
gcc knows the value of argument, it could evaluate strcmp (both arguments are
constant strings) to check if fprint function will run.

Error message:
error: format not a string literal and no format arguments
[-Werror=format-security]

Example 1:

#define PRINT_CHANGE(fmt, args...) \
    do { \
        fprintf(DEBUG_STREAM, "%s(", __FUNCTION__);  \
        if (strcmp(fmt, "") != 0) { \
            fprintf(DEBUG_STREAM, fmt_, ##args); \
        } \
        fprintf(DEBUG_STREAM, ")\n"); \
    } while (0)

PRINT_CHANGE("");

Example 2:

#define PRINT_CHANGE(fmt, args...) \
    do { \
        fprintf(DEBUG_STREAM, "%s(", __FUNCTION__);  \
        const char *fmt_ = fmt;  \
        if (strcmp(fmt_, "") != 0) { \
            fprintf(DEBUG_STREAM, fmt_, ##args); \
        } \
        fprintf(DEBUG_STREAM, ")\n"); \
    } while (0)

PRINT_CHANGE("");

Reply via email to