fprintf, error: format not a string literal and no format arguments [-Werror=format-security

27,609

Solution 1

You should use fputs(Usage, stderr);

There is no need to use fprintf if you arn't doing formatting. If you want to use fprintf, use fprintf(stderr, "%s", Usage);

The default compiler flags on Ubuntu includes -Wformat -Wformat-security which is what gives this error.

That flag is used as a precaution against introducing security related bugs, imagine what would happen if you somehow did this:

char *Usage = "Usage %s, [options] ... ";
...
fprintf(stderr, Usage);

This would be the same as fprintf(stderr, "Usage %s, [options] ... ]"); which is wrong.

Now the Usage string includes a format specifier, %s, but you do not provide that argument to fprintf, resulting in undefined behavior, possibly crashing your program or allowing it to be exploited. This is more relevant if the string you pass to fprintf comes from user input.

But if you do fprintf(stderr,"%s", "Usage %s, [options] ... ]"); There is no such problem. The 2. %s will not be interpreted as a format specifer. gcc can warn about this, and the default Ubuntu compiler flags makes it a compiler error.

Solution 2

Use fputs(Usage) or fprintf(stderr, "%s", Usage). The idiom of passing a message string to a printf-family function is dangerous because, unless it's known not to contain format specifiers, any possible format specifiers in the string will be interpreted and result in undefined behavior (since they have no arguments corresponding to them), and this will almost always translate into security bugs.

Share:
27,609

Related videos on Youtube

devnull
Author by

devnull

Trying to find the purpose of life.

Updated on October 18, 2020

Comments

  • devnull
    devnull about 2 years

    when I try to compile fprintf(stderr,Usage) on Ubuntu I got this error:

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

    but when I compiled that on other linux distributions (RedHat, Fedora, SUSE) that is compiled successfully.

    Anyone has an idea?

    • wildplasser
      wildplasser over 9 years
      try fprintf(stderr, "%s", Usage);
    • Daniel Fischer
      Daniel Fischer over 9 years
      Different compiler options. On Ubuntu, you use -Werror=format-security, on the others not.
    • nullptr
      what are the compiler versions you try, and what is Usage?
  • Ted
    Ted over 1 year
    Can you explain what GCC bug you are referring to? The changes proposed above (eg, using fputs) are not making the compiler happy. They are preventing bugs by avoiding the complex formatting logic when it is not wanted. For literals the compiler checks that the conversion directives match the arguments eliminating many bugs. But for variable format strings the programmer is on their own, which can lead to bad outcomes.

Related