优化如何触发valgrind误报?

use*_*176 2 optimization valgrind

引用Valgrind教程:

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

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

哪种类型的优化会导致这种情况,它们又不是真正的问题吗?

Emp*_*ian 5

哪种类型的优化会导致这种情况,它们又不是真正的问题吗?

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

  • 确定指针是4字节对齐的,并且
  • 一次读取4个字节,然后使用位旋转技巧确定这4个字节中的任何一个是否为0。

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

现在,对于Valgrind而言,此特定实例不再是问题,因为它重定向strlen到其自己的副本。

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