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

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

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

问题是:

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

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

    谢谢。

【问题讨论】:

标签: c linux memory-leaks openssl valgrind


【解决方案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 真的很难。
      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 2016-09-27
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      相关资源
      最近更新 更多