【问题标题】:Are there known false positives issues with Valgrind?Valgrind 是否存在已知的误报问题?
【发布时间】:2010-10-22 05:57:48
【问题描述】:

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

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

【问题讨论】:

    标签: c debugging gcc profiling valgrind


    【解决方案1】:

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

    话虽如此,您仍然需要调查问题并确定它是否真的是误报(如果事实证明是这种情况,您可以自己为它写一个抑制)或者它是一个真正的错误你的程序。

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

    【讨论】:

    • 我怎样才能真正确定它是否是误报?
    • 我会说假设所有报告的问题实际上都是问题,直到您毫无疑问地验证它是问题。很容易将某些东西视为误报或另一个库中的错误,或者当问题实际上是您自己的代码中的真正问题时。请记住:select 可能没有损坏 ;-) 当然,在某些情况下它确实是误报...
    • 是的,当然。假设这是您的错误,除非您可以证明:)
    • 感谢 --track-origins=yes ,必须升级版本才能使用它。
    • 那么 Valgrind 版本号是否跟踪 glibc 版本号?
    【解决方案2】:

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

    错误检查工具可检测基本库中的大量问题,例如 GNU C 库和 X11 客户端库,这些库预装在您的 GNU/Linux 系统上。你不能轻易地修复这些,但你不想看到这些错误(是的,有很多!)所以 Valgrind 读取错误列表以在启动时抑制。构建系统时,./configure 脚本会创建一个默认的抑制文件。

    您可以创建自己的error suppressions,您知道它与您的代码无关。

    【讨论】:

      【解决方案3】:

      Debian SSL 的动机不是通过使用 Valgrind 修复一些误报吗?

      【讨论】:

      • 取决于“误报”的含义。这是在 OpenSSL 中故意使用未初始化的内存,作为许多随机性来源之一。 Valgrind 对它的警告是完全正确的(尽管它是无害的)。
      • @BaffeBoyois:正如 Debian 臭名昭著的错误所证明的那样,这并不是无害的。如果 Debian 将缓冲区设置为零破坏了安全密钥生成,则编译器更改堆栈内存的分配方式(或 malloc 中的库更改,如果它来自堆)可能同样容易导致内存全为零并破坏安全密钥生成。将未初始化的内存用于任何目的,包括获取熵,都是一个严重的错误。
      • @R: Debian 的错误并不是因为他们停止使用未初始化的内存作为源时剩下的熵太少了。那是,当他们试图停止使用未初始化的内存时,他们修补了错误的东西,并且意外地也停止了使用大多数其他熵源。只需删除未初始化的内存就可以了。
      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2017-10-18
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      相关资源
      最近更新 更多