c-与Heisenbug相反,分段故障仅在调试时出现,但程序运行良好



我写了一个简单的C程序,其中有两个数据结构实现为ADT,所以我为它们动态分配内存

一切都很好,直到我决定在结构中添加一个int值,没有动态分配,经典的简单静态内存分配,但自从我添加了它之后,我开始在一个非常安全的函数中使用segfault,这个函数根本不应该segfault。

我曾考虑过内存分配错误,所以我尝试不释放和重用我正在使用的指针变量,而是使用另一个变量,这样程序运行得很好。由于我不得不处理这种错误,我很生气,我重新启用了我之前说的免费软件,重新编译并用valgrind运行了一次。

令我惊讶的是,绝对没有内存泄漏,没有分段故障,没有任何形式的中断,只是关于Conditional jump or move depends on uninitialised value(s)的警告,但这是一种需要的行为(if (pointer == NULL) { }(,所以我直接从命令行运行了可执行文件,再次,一切都很好,所以情况是这样的:

结构中没有新int值的程序:

  • 编译:检查
  • 运行:检查
  • Valgrind分析:没有内存泄漏,只是警告
  • 调试(gdb(:检查

在结构中使用新的int值进行编程:

  • 编译:检查
  • 运行:检查
  • Valgrind分析:没有内存泄漏,只是警告
  • 调试(gdb(:Segfault

所以我认为这与Heisenbug相反,Heisenbug是一个只在调试时才会出现的bug,我该如何修复它?

好吧,多亏了@weather vane和@some程序员,我注意到实际上我没有初始化valgrind抱怨的变量,我误解了valgrind警告,我把它读成了You should not use a if to check if variables are NULL

最新更新