gpt4 book ai didi

c++ - 为什么 Valgrind 不检测未初始化变量的使用?

转载 作者:行者123 更新时间:2023-11-30 01:37:13 30 4
gpt4 key购买 nike

据我了解,当代码包含未初始化变量的使用时,Valgrind 应该报告错误。在下面的这个玩具示例中,printer 未初始化,但程序仍然“愉快地”打印消息。

#include <iostream>

class Printer {
public:
void print() {
std::cout<<"I PRINT"<<std::endl;
}
};


int main() {
Printer* printer;
printer->print();
};

当我用 Valgrind 测试这个程序时,它没有报告任何错误。

这是预期的行为吗?如果是,为什么会这样?

最佳答案

实际上从未使用过该变量。

  1. 方法调用是内联的1,因此变量不作为参数传递。
  2. 方法本身不以任何方式使用 this,因此根本不使用变量。

以上与打开或关闭优化无关。

事实上,在优化的代码中,变量根本不存在——即使是内存分配也不存在。

关于类似案例的问题:Extern variable only in header unexpectedly working, why? .


1 默认情况下,类主体中定义的所有方法都是内联的。

这是未定义的行为吗?

是的。调用该方法需要 this 指向一个实际的、初始化的对象实例,以便格式正确。正如 Nir ​​Friedman 指出的那样,编译器可以自由假设并在此基础上进行优化(IIRC 这种优化甚至可以使用 -O0!)。

我个人希望所讨论的特定代码能够在任何实际条件下工作(因为指针值真的无关紧要),但我永远不会依赖它。 您应该立即修复您的代码。

检测

要检测 Clang/GCC 中未初始化变量的使用情况,请使用选项 -Wuninitialized(或简单地使用包含此标志的 -Wall)。

-Wuninitialized 应该主要涵盖堆栈分配内存的使用,但我猜堆栈分配数组的一些使用可能仍然会丢失。一些编译器可能支持使用 -fsanitize=... 选项对未初始化的读取进行额外的运行时检查,例如 -fsanitize=memory in Clang (谢谢,chtz)。这些检查应涵盖边缘情况以及堆分配内存的使用。

关于c++ - 为什么 Valgrind 不检测未初始化变量的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50075416/

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