8

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

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

问题是:

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

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

    谢谢你。

4

4 回答 4

16

添加选项

--undef-value-errors=no 

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

有关更多信息,请参阅 Valgrind 的手册页

于 2015-11-25T18:00:47.297 回答
3

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

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

从上面链接的网页:

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

于 2013-09-11T14:34:40.267 回答
2

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

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

./config -d no-static shared zlib -Wa,--noexecstack -DPURIFY -O0 -ggdb3
于 2013-09-13T08:12:27.043 回答
1

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

于 2013-09-11T18:17:31.253 回答