fprintf, error: format not a string literal and no format arguments [-Werror=format-security
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.
Related videos on Youtube

Comments
-
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 over 9 yearstry
fprintf(stderr, "%s", Usage);
-
Daniel Fischer over 9 yearsDifferent compiler options. On Ubuntu, you use
-Werror=format-security
, on the others not. -
nullptrwhat are the compiler versions you try, and what is
Usage
?
-
-
Ted over 1 yearCan 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.