当前位置: 首页 > 知识库问答 >
问题:

为什么不推荐使用带有单个参数(没有转换说明符)的printf?

韩玉石
2023-03-14

在我正在读的一本书里,写着带有单个参数(没有转换说明符)的< code>printf被弃用。它建议替换为

printf("Hello World!");

puts("Hello World!");

或者

printf("%s", "Hello World!");

有人能告诉我为什么printf("Hello World!") ;是错的吗?书上写着它包含漏洞,这些漏洞是什么?

共有3个答案

葛学民
2023-03-14

除了其他答案,printf(“Hello world!我今天50%快乐”)是一个很容易制作的错误,可能会导致各种讨厌的内存问题(它是UB!)。

“要求”程序员绝对清楚他们想要的是一个逐字的字符串,而不是别的,这只是更简单、更容易和更健壮。

这就是打印(“%s”,“你好世界!我今天50%快乐“)得到你。这完全是万无一失的。

(史蒂夫,当然printf(“他有%d樱桃\n”,樱桃)绝对不是一回事,在这种情况下,程序员不是“逐字字符串”的心态,而是“格式字符串”的心态。

蒋高超
2023-03-14

printf("Hello world");

很好,没有安全漏洞。

问题在于:

printf(p);

其中p是指向用户控制的输入的指针。它容易受到格式字符串攻击:用户可以插入转换规范来控制程序,例如,%x转储内存或%n

请注意,put("Hello world")在行为上不等同于printf("Hello world"),而是等同于printf("Hello world\n")。编译器通常足够聪明,可以优化后一种调用,将其替换为put

宗政斌
2023-03-14

打印(“你好世界!”恕我直言,不容易受到攻击,但请考虑以下几点:

const char *str;
...
printf(str);

如果str恰好指向包含%s格式说明符的字符串,您的程序将表现出未定义的行为(主要是崩溃),而put(str)将按原样显示字符串。

例:

printf("%s");   //undefined behaviour (mostly crash)
puts("%s");     // displays "%s\n"
 类似资料:
  • 在 C (n1570 7.21.6.1/10) 和 C(通过包含 C 标准库)中,向类型与其转换规范不匹配的 printf 提供参数是未定义的行为。一个简单的例子: 格式字符串指定 int,而参数是浮点类型。 这个问题的灵感来自一个用户的问题,他遇到了大量转换不匹配的遗留代码,这显然没有伤害,参见。理论和实践中的未定义行为。 最初,仅仅声明格式不匹配的UB似乎很激烈。很明显,输出可能是错误的,这取

  • 问题内容: 众所周知,Java 中的接口已损坏。造成这种情况的原因很多,我将不再赘述。其他人已经做到了。这也是Java架构师本身的立场。 因此,我的问题是:为什么还不被弃用?如果核心Java团队已确定它已损坏,那么他们还必须考虑过时。他们反对这样做的原因是什么(在Java 8中仍不建议弃用)? 问题答案: 有一个错误在1997年提交给Java的错误数据库有关添加方法,所以将不再是无用的。它以“无法

  • 问题内容: 我曾经在hibernate 3中使用getHibernateTemplate(),现在我转向了Hibernate 4,在这里我找不到以下类: 在这里我已经阅读过有关它的更多信息,不建议使用 http://forum.springsource.org/showthread.php?117227-Missing-Hibernate- Classes-Interfaces-in-spring

  • 问题内容: 我正在将hibernate项目配置为使用第二级缓存提供程序,以便可以利用查询缓存。 我向ehcache添加了一个依赖项: 我认为我要使用的提供程序类是: 在eclipse中查看引用的库时,我在和上都看到了注释。是什么赋予了?我可以使用最新的替代供应商吗? 我正在使用hibernate版本3.4.0.GA,以防万一。 问题答案: 是什么赋予了?我可以使用最新的替代供应商吗? 不推荐使用它

  • 问题内容: 我曾经在hibernate 3中使用getHibernateTemplate(),现在我转向了Hibernate 4,在这里我找不到以下类: 有人可以解释我为什么吗?在hibernate4中,我现在需要执行所有任务,例如提交,关闭,刷新由getHibernateTemplate()方法自动管理的事务? 问题答案: 因为它的主要目的是使Hibernate会话绑定到当前的Spring事务(

  • 自从我开始阅读反应,我了解了JSX和巴别塔。在Babel之前,JSX转换器[React工具]用于将JFX语法转换为浏览器可理解的格式。现在巴别塔取代了它的位置。我的观点是,为什么他们更换了JFX变压器?它有什么缺点吗?