C Valgrind是否存在已知的误报问题?

C Valgrind是否存在已知的误报问题?,c,debugging,gcc,profiling,valgrind,C,Debugging,Gcc,Profiling,Valgrind,Valgrind是否存在已知的假阳性?我用fmemopen函数得到了一个“条件跳转或移动取决于未初始化的值”,用C编写并用GCC编译。我能确定它是真的吗 编辑:是否存在不在抑制文件中的已知问题?在一个程序中,是否有一些事情是可以做的,这些不是真正的错误,但Valgrind会说它们是错误?如果存在已知问题,最好列出一个列表。是的,Valgrind存在误报,这就是为什么它有针对特定glibc和gcc版本的抑制文件。如果您将较旧的valgrind与较新的gcc和glibc一起使用,即valgrind

Valgrind是否存在已知的假阳性?我用
fmemopen
函数得到了一个“条件跳转或移动取决于未初始化的值”,用C编写并用GCC编译。我能确定它是真的吗


编辑:是否存在不在抑制文件中的已知问题?在一个程序中,是否有一些事情是可以做的,这些不是真正的错误,但Valgrind会说它们是错误?如果存在已知问题,最好列出一个列表。

是的,Valgrind存在误报,这就是为什么它有针对特定glibc和gcc版本的抑制文件。如果您将较旧的valgrind与较新的gcc和glibc一起使用,即valgrind 3.3与glibc 2.9一起使用,则可能会出现误报

话虽如此,您仍然需要研究这个问题,并找出它是否真的是假阳性(如果事实证明是这样,您可以自己编写一个抑制),或者它是您程序中的一个真正的错误


这里没有快速简单的方法来说明发生了什么,但在本例中,我怀疑您正在将未初始化的值从代码传递到库代码。尝试Valgrind选项--track origins=yes。它将显示未初始化值的来源。如果它是您的代码,可能您应该初始化它。如果它在库中,则可能是误报,或者库调用参数的错误值可能是导致误报的原因,因此请检查这些错误。

Valgrind附带了一些默认错误抑制功能,但它们绝不涵盖所有库

错误检查工具检测预装在GNU/Linux系统上的基本库(如GNU C库和X11客户端库)中的许多问题。您无法轻松修复这些错误,但您不想看到这些错误(是的,有很多!),因此Valgrind会读取一个错误列表,以便在启动时抑制这些错误。生成系统时,./configure脚本将创建默认抑制文件


你可以创建你自己知道与代码无关的东西。

Debian SSL的动机不是因为用Valgrind修复了一些误报吗?

我怎么才能真正发现它是否是误报呢?我会说,假设所有报告的问题实际上都是问题,直到你毫无疑问地验证了这一点。当问题实际上在您自己的代码中是一个真正的问题时,很容易将其视为误报或另一个库中的错误或其他任何东西而忽略。请记住:选择可能未被破坏;-)当然,会有一些情况下,它确实是一个假阳性…是的,肯定。假设这是你的bug,除非你能证明不是:)谢谢--track origins=yes,必须升级版本才能使用它。那么Valgrind版本号跟踪glibc版本号吗?取决于你所说的“假阳性”。这是在OpenSSL中故意使用未初始化的内存,作为许多随机性来源之一。Valgrind关于它的警告是完全正确的(尽管它是无害的)。@BaffeBoyois:它不是无害的,Debian臭名昭著的bug证明了这一点。如果Debian Mem将缓冲区设置为零会破坏安全密钥生成,那么编译器对堆栈内存分配方式的更改(或者malloc中的库更改,如果它来自堆)也会很容易导致内存全部为零并破坏安全密钥生成。将未初始化内存用于任何目的,包括获取熵,都是一个严重的错误。@R:Debian错误并不是因为他们停止使用未初始化内存作为源时,剩下的熵太少。这是因为,当他们试图停止使用未初始化的内存时,他们修补了错误的东西,并且意外地也停止了使用大多数其他熵源。只要删除未初始化的内存就可以了。