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