一尘不染

fprintf,错误:格式不是字符串文字,并且没有格式参数[-Werror = format-security

linux

当我尝试fprintf(stderr,Usage)在Ubuntu 上编译时,出现此错误:

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

但是当我在其他Linux发行版(RedHat,Fedora,SUSE)上编译该文件时,该文件已成功编译。

有人有主意吗?


阅读 794

收藏
2020-06-07

共1个答案

一尘不染

你应该用 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编译器标志使其成为编译器错误。

2020-06-07