你应该用
fputs(Usage, stderr);
如果您不进行格式化,则无需使用fprintf。如果要使用fprintf,请使用
fprintf(stderr, "%s", Usage);
Ubuntu上的默认编译器标志包括
-Wformat -Wformat-security产生此错误的原因。
该标志用作防止引入与安全相关的错误的预防措施,想象一下如果您以某种方式这样做会发生什么:
char *Usage = "Usage %s, [options] ... ";...fprintf(stderr, Usage);
这与
fprintf(stderr, "Usage %s, [options] ... ]");错误是一样的 。
现在,该
Usage字符串包含一个格式说明符,
%s但您不向提供该参数
fprintf,从而导致未定义的行为,有可能使您的程序崩溃或被其利用。如果您传递给fprintf的字符串来自用户输入,则此设置更为相关。
但是,如果这样做
fprintf(stderr,"%s", "Usage %s, [options] ... ]");,就不会有这样的问题。2.
%s不会被解释为格式说明符。gcc可以发出警告,默认的Ubuntu编译器标志使其成为编译器错误。



