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

10 c linux gcc compiler-errors

当我尝试fprintf(stderr,Usage)在Ubuntu 上编译时,我遇到了这个错误:

 error: format not a string literal and no format arguments [-Werror=format-security
Run Code Online (Sandbox Code Playgroud)

但是当我在其他Linux发行版(RedHat,Fedora,SUSE)上编译成功编译时.

有人有想法吗?

nos*_*nos 19

你应该用 fputs(Usage, stderr);

如果您不进行格式化,则无需使用fprintf.如果要使用fprintf,请使用fprintf(stderr, "%s", Usage);

Ubuntu上的默认编译器标志包括-Wformat -Wformat-security产生此错误的内容.

该标志用作防止引入安全相关错误的预防措施,想象如果您以某种方式执行此操作会发生什么:

char *Usage = "Usage %s, [options] ... ";
...
fprintf(stderr, Usage);
Run Code Online (Sandbox Code Playgroud)

这与fprintf(stderr, "Usage %s, [options] ... ]");错误相同 .

现在Usage字符串包含格式说明符,%s但是您没有提供该参数fprintf,导致未定义的行为,可能导致程序崩溃或允许它被利用.如果传递给fprintf的字符串来自用户输入,则更相关.

但是,如果你这样做fprintf(stderr,"%s", "Usage %s, [options] ... ]");没有这样的问题.2. %s不会被解释为格式指定符.gcc可以警告这一点,默认的Ubuntu编译器标志使它成为编译器错误.


R..*_*R.. 8

使用fputs(Usage)fprintf(stderr, "%s", Usage).将消息字符串传递给printf-family函数的习惯是危险的,因为除非知道不包含格式说明符,否则字符串中的任何可能的格式说明符都将被解释并导致未定义的行为(因为它们没有与之对应的参数) ,这几乎总会转化为安全漏洞.