换句话说,如果没有任何Valgrind错误消息,我可以确定我的程序是未定义的行为吗?
答案 0 :(得分:4)
总之:不。什么 - 甚至不是valgrind - 都是完美的。
答案 1 :(得分:4)
编译完程序后,将定义行为。如果要检测未定义的行为,则需要在工具链的早期开始。
未定义的行为意味着由编译器实现来决定如何实现行为,标准没有规定行为必须是什么。换句话说,询问UB的源代码而不是编译代码是唯一有意义的。
答案 2 :(得分:4)
这里有一个根本性的错误。
Valgrind不是某种静态分析工具,它可以理解C ++语法的语义,因此知道何时调用 C ++标准指定的未定义行为。
Valgrind是一种工具,无论何时在内存中执行作为程序 Undefined Behavior 结果的操作,它都会提醒您。例如,它会检测您何时访问未分配或释放的内存,它将检测您何时使用未初始化(或部分单元化)的值/缓冲区等进行系统调用...
采取医学类比,Valgrind检测未定义行为的症状。没有症状并不意味着没有未定义的行为。
此外,因为Valgrind只检查运行的代码,所以会留下一些未经检查的“代码”。
摆脱未定义的行为非常复杂。如果你的程序不重要,它很可能等同于解决停机问题。但是,这不应该阻止您采取预防措施:
-Wall -Werror
是给定的,-Wextra
对于新的代码库来说很棒(另外)(小学)gcov
检查覆盖范围)(良好做法)完成所有操作后,您可能已发现程序中技术错误的大多数。不幸的是,有些人可能仍潜伏着。有一天,他们可能会在更改优化选项,重构或其他任何内容后暴露出来......对于更强的保证,您将需要另一种语言。