引用Valgrind教程:
优化的代码可能导致valgrind错误地报告未初始化的值错误。作者知道如何解决这个问题,但这会让valgrind慢得多(而且已经很慢了)。建议的解决方法是在尝试使用valgrind调试代码时不进行优化。在调试时不优化是一个很好的经验法则。
(资料来源:https://people.gnome.org/~newren/tutorials/developing-with-gnome/html/ch03s03.html)
什么类型的优化会导致这种情况,它们如何不是真正的问题?
答案 0 :(得分:5)
什么类型的优化会导致这种情况,它们如何不是真正的问题?
一个特定的例子:glibc有strlen()
这是“安全的”,因为它永远不会导致崩溃(从4字节对齐的指针中读取4个字节永远不会越过页边界),但它可能会“超读”超过已分配块的末尾(例如,如果字符串来自strdup("hello")
- 这里只分配了6个字节,但strlen
将读取8)。
现在,这个特殊实例对于Valgrind来说不是问题,因为它将strlen
重定向到它自己的副本。
但是类似的循环展开可能会在您自己的代码中进行优化,然后Valgrind会报告误报。