当前位置: 首页 > 面试题库 >

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

微生俊名
2023-03-14
问题内容

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

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

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

有人有主意吗?


问题答案:

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



 类似资料:
  • 问题内容: Python 2.6引入的方法与现有%运算符的语法略有不同。哪个更好,什么情况下适合? 以下使用每种方法并具有相同的结果,那么有什么区别? 此外,何时在Python中进行字符串格式化?例如,如果我的日志记录级别设置为,那么执行以下操作是否还会对我有所帮助?如果是这样,有办法避免这种情况吗? 问题答案: 第一个问题在许多方面似乎都更加复杂。一个令人烦恼的事情是它如何可以接受变量或元组。你

  • rank ▲ ✰ vote url 70 354 145 282 url 字符串格式化:%和.format Python2.6推出了[str.format()]方法,和原有的%格式化方式有小小的区别.那个方法更好? 下面的方法有同样的输出,它们的区别是什么? #!/usr/bin/python sub1 = "python string!" sub2 = "an arg" a = "i

  • .format在许多方面看起来更便利.对于%最烦人的是它无法同时传递一个变量和元组.你可能会想下面的代码不会有什么问题: "hi there %s" % name 但是,如果name恰好是(1,2,3),它将会抛出一个TypeError异常.为了保证它总是正确的,你必须这样做: "hi there %s" % (name,) # 提供一个单元素的数组而不是一个参数 但是有点丑..forma

  • 问题内容: 我收到以下错误: 第一个字段是格式。 有任何想法吗? 谢谢。 问题答案: 当您将字符串值插入日期列时,则需要在使用函数期间将其转换为日期。使用此功能时,您将提供字符串的格式。 功能格式: 因此,您的查询将如下所示: 参见带有演示的SQL Fiddle

  • 问题内容: 我知道这是一个非常简单的问题,但我不知道该如何使用Google。 我能怎么做 那要用两次?我假设我必须“命名” the ,然后在参数中使用字典,但是我不确定正确的语法吗? 仅供参考,我知道我可以在参数中使用两次,但这不是重点:) 问题答案: 在Python 2.6+和Python 3中,您可以选择使用较新的字符串格式设置方法。 这样可以避免重复输入参数,或者 如果要命名参数。 这是严格

  • 问题内容: 使用uCanaccess检索保存在桌面中的数据库时出现错误。 我的代码如下: 导入java.util.Scanner; 导入java.sql。*; 公共类dbTest1 { } 我将很乐意为您解决此错误提供任何建议。 谢谢,文斯 问题答案: 好吧,首先,导入您的库(lib文件夹中的jar文件)。http://sourceforge.net/projects/ucanaccess/fil