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:条件跳转或移动取决于未初始化的值,即使我初始化内存