如何优化旅行valgrind误报?

时间:2013-12-27 23:09:52

标签: optimization valgrind

引用Valgrind教程:

  

优化的代码可能导致valgrind错误地报告未初始化的值错误。作者知道如何解决这个问题,但这会让valgrind慢得多(而且已经很慢了)。建议的解决方法是在尝试使用valgrind调试代码时不进行优化。在调试时不优化是一个很好的经验法则。

(资料来源:https://people.gnome.org/~newren/tutorials/developing-with-gnome/html/ch03s03.html

什么类型的优化会导致这种情况,它们如何不是真正的问题?

1 个答案:

答案 0 :(得分:5)

  

什么类型的优化会导致这种情况,它们如何不是真正的问题?

一个特定的例子:glibc有strlen()

  • 确定指针是4字节对齐的
  • 一次读取4个字节,然后使用bit-twiddling技巧来确定这4个字节中的任何一个是否为0。

这是“安全的”,因为它永远不会导致崩溃(从4字节对齐的指针中读取4个字节永远不会越过页边界),但它可能会“超读”超过已分配块的末尾(例如,如果字符串来自strdup("hello") - 这里只分配了6个字节,但strlen将读取8)。

现在,这个特殊实例对于Valgrind来说不是问题,因为它将strlen重定向到它自己的副本。

但是类似的循环展开可能会在您自己的代码中进行优化,然后Valgrind会报告误报。