printf参数不匹配导致异常输出的原因咨询
printf输出多余随机值的原因分析
你遇到的问题本质是printf格式符数量与传入参数数量不匹配导致的未定义行为:
- 你的格式字符串里写了3个
%x(用于输出十六进制整数),但只传给printf两个int参数(i和j)。 - printf作为可变参数函数,会严格按照格式字符串的要求从栈上读取数据。前两个
%x正常读取i和j的值,第三个%x会去栈上读取参数列表之后的随机内存内容——这些内容是栈上的残留数据(比如之前函数调用留下的栈帧碎片、未初始化的内存区域),所以每次运行结果都不一样。
这种情况正是你学习安全知识时接触到的格式化字符串漏洞的典型场景:如果攻击者能够控制printf的格式字符串,就可以通过这种方式读取栈上的敏感数据(比如内存中的密码、程序的地址空间信息),甚至通过特定格式符修改栈内存,执行恶意代码。
修复方法很简单:
- 要么删除多余的
%x,让格式符数量和参数数量一致:int i = 1, j = 2; printf(" %x %x \n", i, j); - 要么补充对应的参数,比如额外传一个int值:
int i = 1, j = 2, k = 0; printf(" %x %x %x \n", i, j, k);
内容的提问来源于stack exchange,提问作者KWing
相关产品推荐
相关产品推荐

