【问题标题】:Valgrind memcheck finds lots of conditional jumps and invalid reads in commercial libraryValgrind memcheck 在商业库中发现大量条件跳转和无效读取
【发布时间】:2015-02-26 11:47:41
【问题描述】:

我正在调试一个链接到商业 API 库(在 Linux 下)的程序。我正在使用 valgrind memcheck,因为我遇到了奇怪的行为,这可能是由于写入超出了分配的内存块:

valgrind --tool=memcheck --error-limit=no --log-file=memcheck.log ./executable

然而,首先映入我眼帘的是许多类型的错误

Use of uninitialised value of size (4/8/16)

Invalid read of size (4/8/16)

Conditional jump or move depends on uninitialised value(s)

其中一些(但不是全部)出现在 __intel_sse2_strcpy__intel_sse2_strlen 中。此外,根据 valgrind 的说法,确实存在内存泄漏。 出现在图书馆中。当我编译库附带的示例之一时,它们也会出现,因此它们不是我的编程错误。此外,它们始终出现在不同版本的库中。由于该库是封闭源代码,我似乎无法澄清错误是否致命。

实际上,这让我很难识别自己潜在的错误。看到这么多警告我有点惊讶,因为我倾向于修复我自己的程序,直到 memcheck 不再打印这些(至少在我放弃之前)。问题是:我是否可以考虑保存忽略之类的错误,它们是否通常出现在打包软件中,或者它们甚至可能是误报(例如因为库是经过优化编译的)?

【问题讨论】:

  • 显然,您应该通过供应商的技术支持来解决这个问题。
  • 是的,但我不希望这方面(从经验上)得到很多真正的帮助,即使我们谈论的数学库是一个昂贵的产品。
  • 谢谢,这可能会有所帮助。但是,如果是这样,我遇到的问题可能会出现在同一个库中。

标签: c valgrind


【解决方案1】:

我会说:

  1. 不,您不能认为可以安全地忽略它们。 Valgrind 很好。
  2. 是的,如果原始开发人员从未在他们的代码中使用过 Valgrind 或类似工具,它们可能会很常见,预计会有一些成功是合理的。
  3. 我不认为它们是假阳性,这种情况很少见。

【讨论】:

    【解决方案2】:

    从这里引用一个答案,这可能解释了字符串操作中遇到的误报:

    https://www.intel.com/content/www/us/en/developer/articles/troubleshooting/false-positive-diagnostic-on-string-operations-reported-by-intel-inspector.html

    ''' 某些字符串操作使用向量(SIMD)指令来计算字符串长度。他们读取 32 字节块中的字符串指针,并检查它读取的每个块中的 NULL 字符。如果字符串大小不是 32 的倍数,则读取 NULL ''' 之后的内存区域中的垃圾

    【讨论】:

      最近更新 更多