Valgrind可以捕获各种未定义的行为吗?

时间:2011-08-09 13:24:28

标签: c++ valgrind undefined-behavior

换句话说,如果没有任何Valgrind错误消息,我可以确定我的程序是未定义的行为吗?

3 个答案:

答案 0 :(得分:4)

总之:不。什么 - 甚至不是valgrind - 都是完美的。

答案 1 :(得分:4)

编译完程序后,将定义行为。如果要检测未定义的行为,则需要在工具链的早期开始。

未定义的行为意味着由编译器实现来决定如何实现行为,标准没有规定行为必须是什么。换句话说,询问UB的源代码而不是编译代码是唯一有意义的。

答案 2 :(得分:4)

这里有一个根本性的错误。

Valgrind不是某种静态分析工具,它可以理解C ++语法的语义,因此知道何时调用 C ++标准指定的未定义行为

Valgrind是一种工具,无论何时在内存中执行作为程序 Undefined Behavior 结果的操作,它都会提醒您。例如,它会检测您何时访问未分配或释放的内存,它将检测您何时使用未初始化(或部分单元化)的值/缓冲区等进行系统调用...

采取医学类比,Valgrind检测未定义行为症状。没有症状并不意味着没有未定义的行为

此外,因为Valgrind只检查运行的代码,所以会留下一些未经检查的“代码”。

摆脱未定义的行为非常复杂。如果你的程序不重要,它很可能等同于解决停机问题。但是,这不应该阻止您采取预防措施:

  • 打开编译器警告:-Wall -Werror是给定的,-Wextra对于新的代码库来说很棒(另外)(小学
  • 使用静态分析工具(其中有几个,因为它们不会报告相同的问题),Clang Static Analyzer,Purify等。( Good Practice
  • 扩展测试套件上运行Valgrind(您可以使用gcov检查覆盖范围)(良好做法
  • 阅读几个编码标准,思考关于他们的建议(不要在威利威利申请),Sutter先到先得,高质量CPP或MISRA更加严格和广泛。一些自动代码审查工具可以检查这样的一组规则。 (很好,并且在个人层面上有所回报)

完成所有操作后,您可能已发现程序中技术错误的大多数。不幸的是,有些人可能仍潜伏着。有一天,他们可能会在更改优化选项,重构或其他任何内容后暴露出来......对于更强的保证,您将需要另一种语言。