根据手册,它没有:
重要的是要明白你的程序可以随意复制垃圾(未初始化)数据。Memcheck会观察到这一点并跟踪数据,但不会抱怨。只有当程序试图以可能影响程序外部可见行为的方式使用未初始化的数据时,才会发出投诉。
问题是有没有什么重要的原因让你这么做?是否有一个(常用的)构造,它复制会触发误报的未初始化数据?还是有办法让valgrind抱怨?
我担心的是,在C中使用未初始化的变量具有未定义的行为(IIRC),因此,例如,以下函数可能会发出鼻守护进程:
int fubar(void) {
int a;
return a;
}
现在我记错了,只有在某些情况下,它是未定义的,例如,如果你用未初始化的变量做算术:
int fubar(void) {
int a;
a -= a;
return a;
}
所以这里也出现了同样的问题。valgrind允许使用未初始化数据的算法有什么重要的原因吗?注意,特别是如果它是浮点数据,它实际上可以改变外部可观察的行为,因为捕获FP错误可能是启用的。
最佳答案
是的,这种情况经常发生。例如:
struct {
char a;
int b;
} s1, s2;
s1.a = '.';
s1.b = 31337;
memcpy (&s2, &s1, sizeof(s1));
这里,您正在复制未初始化的字节(在
a
和b
之间的填充字节)。我想,沃格林在这里不抱怨是件好事。
一般来说(针对你的算术例子):
Valgrind只在未初始化的数据可能是程序不确定行为的原因时尝试抱怨。或者反过来说:如果它能排除这种情况,它就不会抱怨。因此,例如,当分支或系统调用参数依赖于未初始化的数据时,valgrind会抱怨。你可以把
exit(a)
放在a -= a;
后面来尝试,结果是Syscall param exit_group(status) contains uninitialised byte(s)
即使通常结果在任何情况下都是0。(您可能必须声明
a
volatile以防止从代码中删除它)关于c - 为什么valgrind在复制未初始化的数据时不会提示?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35650109/