gpt4 book ai didi

c - 给定堆栈和寄存器的状态,我们能否预测 printf 未定义行为的结果

转载 作者:行者123 更新时间:2023-11-30 21:45:16 24 4
gpt4 key购买 nike

下面是一些用于类测验的简单 C 代码:

#include <stdio.h>

int main() {
float a = 2.3;
printf("%d\n", a);
return 0;
}

编译并运行于:

Apple LLVM 版本 6.1.0 (clang-602.0.53)(基于 LLVM 3.6.0svn)
目标:x86_64-apple-darwin14.5.0

此代码的输出是未定义。我试图通过使用调试器(gdb 中的 X 命令)检查 a 附近的内存来预测输出。例如,当a的地址为0x7fff5fbffb98时,则&a附近的上下文如下:

0x7fff5fbffb98: 1075000115
0x7fff5fbffb9c: 0
0x7fff5fbffba0: 1606417336
0x7fff5fbffba4: 32767
0x7fff5fbffba8: -1754266167
0x7fff5fbffbac: 32767
0x7fff5fbffbb0: -1754266167
0x7fff5fbffbb4: 32767

那么printf的输出是1606417352。我知道使用不正确的说明符时的输出是未定义的。出于好奇,我预计这种未定义行为的输出与正在运行的堆栈或寄存器中的某些内存相关,但我还没有弄清楚如何将其关联起来。

那么哪个地址或寄存器用于设置这个printf的输出?换句话说,给定运行堆栈的状态以及所有寄存器中的所有值,我们可以预测(如果可以的话如何预测)这种未定义行为的输出?

最佳答案

您尝试使用%d作为float:

d 说明符用于有符号十进制整数

f 说明符用于十进制浮点

使用错误的说明符会导致 Undefined behavior

您依赖于自动变量的地址:

I try to predict the output by viewing the memory near a

a是一个自动变量,每次编译代码时它的地址都会改变,因此每次编译代码时memory-near-a也会改变。

因此,“查看 a 附近的内存”也会导致未定义的行为。

解决方案:

你与未定义的行为无关(在本例中),所以忘记它以节省时间,它会让你的生活更轻松。

关于c - 给定堆栈和寄存器的状态,我们能否预测 printf 未定义行为的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35861906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com