printf参数不足

printf参数不足,第1张

概述我的问题是关于缺少参数的printf之后的行为: printf("%s blah blah %d", int); // integer was given as argument (and not int written) 我已经知道,如果格式的参数不足,行为就是 未定义. 问题是printf结果或整个程序是否未定义? >当%s试图从未经授权的内存地址读取时,可能会发生崩溃. (它发生在我身上) 我的问题是关于缺少参数的printf之后的行为:

printf("%s blah blah %d",int); // integer was given as argument (and not int written)

我已经知道,如果格式的参数不足,行为就是
未定义.

问题是printf结果或整个程序是否未定义?

>当%s试图从未经授权的内存地址读取时,可能会发生崩溃. (它发生在我身上)
> printf完成后会发生崩溃吗? (打印一些垃圾字符串和整数)

编辑:

澄清我不是在询问编译错误或警告,执行此行时程序也不会崩溃.问题是这行可以使程序在此行已经执行后随机崩溃.

解决方法 基本上适用于整个计划. Printf开始从堆栈中取出参数,在这种情况下,需要一个值得过多的int.这通常类似于返回地址.因此,当printf返回时,它将返回到堆栈上接下来的任何随机数.通常的结果 – 如果你很幸运 – 是一个分段错误.

因为它将参数压入堆栈,所以它会将它们d出,所以它会尝试先获取int.

如果你不幸运,它会找到一个可寻址的代码块.这导致了第二种情况,其中地址成为随机字符散列的地址.现在它将尝试打印一个字符串,直到它找到一个随机的Nul字符.

更新

正如约阿希姆指出的那样,具体问题由调用约定决定,所以让我们做一个明确的例子.当要调用printf函数时,首先按下返回地址或最后按下它.我们假设它首先被推送(在通常的架构上更常见),所以这个调用需要PUSH返回地址,格式字符串的PUSH地址,PUSH是一个int值 – 让我们说42.这给了我们这个堆栈:

RTN ADDRADDR OF STRING42

并使堆栈指针SP指向堆栈上的下一个位置.

现在printf开始解释字符串.它查找int参数的地址,并找出它的SP-1.所以string参数的地址必须是SP-2 …但这是格式字符串的地址,因为没有字符串参数.然后当它查找格式字符串的地址时,它想要找到SP-3,但这是返回地址,可执行代码的地址.在大多数任何机器上,这都应该导致分段错误.

如果你通过调用约定的其他选项,你会发现它们中的每一个看起来都是错误的,因为无论如何,printf认为它需要引用堆栈中的三个东西,而不是它有两个.

总结

以上是内存溢出为你收集整理的printf参数不足全部内容,希望文章能够帮你解决printf参数不足所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1209807.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存