Valgrind:禁用条件跳转(或整个库)检查

Posted

技术标签:

【中文标题】Valgrind:禁用条件跳转(或整个库)检查【英文标题】:Valgrind: disable conditional jump (or whole library) check 【发布时间】:2013-09-15 14:01:43 【问题描述】:

我正在使用 OpenSSL API 开发应用程序。众所周知,OpenSSL 使用大量全局变量,这些变量被 Valgrind 视为错误(“条件跳转或移动......”等)。因此 Valgrind 的输出被来自共享库的错误阻塞。这对于调试目的非常不方便,因为每次我得到:

检测到的错误总数超过 X 个。我不再报道了。 最终错误计数将不准确。去修复你的程序!

问题是:

    我可以在 Valgrind 中禁用派对库(在我的情况下为 -lssl-lcrypto)内存检查吗?

    或者我可以只关注“绝对丢失”的错误吗?

    谢谢。

【问题讨论】:

您可能想了解 Valgrind 的选项 --suppressions=<filename>: valgrind.org/docs/manual/manual-core.html#manual-core.suppress 【参考方案1】:

添加选项

--undef-value-errors=no 

对我有用(隐藏所有“条件跳转或移动取决于未初始化的值”)。

有关更多信息,请参阅 Valgrind 的man page。

【讨论】:

【参考方案2】:

Valgrind 可以配置为抑制库中的错误。

您可以在此处找到详细信息:http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress

来自上面链接的网页:

注意:到目前为止,添加抑制的最简单方法是使用核心命令行选项中描述的 --gen-suppressions=yes 选项。这会自动生成抑制。但是,为了获得最佳结果,您可能需要手动编辑 --gen-suppressions=yes 的输出,在这种情况下,建议通读本节。

【讨论】:

【参考方案3】:

您需要使用 PURIFY 标志(CFLAGS 中的 -DPURIFY)编译 OpenSSL 以消除错误。不要在最终的应用程序中使用以这种方式编译的版本,仅用于调试目的,因为它会减少在各个地方使用的熵。

例如,在调试模式下编译 OpenSSL:

./config -d no-static shared zlib -Wa,--noexecstack -DPURIFY -O0 -ggdb3

【讨论】:

谢谢!我使用了那个标志,但如果不是你的建议,我会把它们带入发布【参考方案4】:

请注意,如果您禁用/禁止 OpenSSL 中的所有检查,您也可能会禁用由您自己的错误代码生成的警告。例如,当您将未完全初始化的结构传递给 OpenSSL 函数时,这也可能导致“条件跳转或移动...”错误,您可能希望看到这些错误。

【讨论】:

感谢您的建议。正确使用 OpenSSL 真的很难。

以上是关于Valgrind:禁用条件跳转(或整个库)检查的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind:条件跳转或移动取决于未初始化的值,即使我初始化内存

valgrind--CPP程序内存泄露检查工具

Valgrind:致命错误:memcheck.h:没有这样的文件或目录

条件跳转问题

告诉 valgrind 为文件生成抑制语句

ubuntu上的静态链接pthread导致未初始化的值跳转(valgrind)[重复]