我用C:
制作了这个小代码#include <stdio.h>
int alo();
int main()
{
printf ("%d",alo());
}
int alo(int i, int x)
{
return (x);
}
但似乎当我在没有给alo
任何参数的情况下运行它时,它会打印一个完全随机的数字。
我只是想知道,因为我认为它不能100%随机,这实际上是多少,它来自何处,以及我是否可以预测它。请注意,这是纯粹的好奇心。
我想它有一些东西可以处理内存阅读,但这个特定的bug究竟是如何起作用的呢?
答案 0 :(得分:5)
你的alo
函数接受(即需要!)两个参数,但你没有任何参数调用它。在这种情况下,行为是未定义的。
你在没有原型的情况下声明了你的函数(在main
之前)。这意味着您有责任在alo
的所有调用中提供正确数量的正确类型的参数。编译器不会帮助您验证此类调用的正确性。
出于这个原因,一个好主意是总是用原型声明你的函数
int alo(int i, int x);
这样编译器可以帮助您确保正确调用函数。
在实践中,alo
的实现盲目地遵循其参数传递约定并读取应该包含参数x
的值的存储位置。结果值从alo
返回。
用于传递x
的存储位置取决于实现细节。它可以是存储区域或CPU寄存器。在从alo
返回呼叫之前,无论残留/垃圾值是否存在于该存储位置。
答案 1 :(得分:-1)
好的,谷歌:
你拥有硬件架构,(CPU,寄存器,内存等), 汇编, 机器码 指令系统, 调试器, 堆, 召集会议, 参数, 参数
当您了解上述内容后,您就可以在其显示的计算机上调查UB。下一个框架,下一个架构,下周,它可能表现不同:(