Valgrind memcheck 在商业库中发现大量条件跳转和无效读取

Valgrind memcheck finds lots of conditional jumps and invalid reads in commercial library

我正在调试链接到商业 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 不再打印这些(至少在我放弃它之前)。问题是:我是否可以考虑保存为忽略之类的错误,它们是否通常出现在打包软件中,或者它们甚至可能是误报(例如,因为库是通过优化编译的)?

我会说:

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

引用此处的一个答案可能会解释字符串操作中遇到的误报:

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 '''

之后的内存区域中读取垃圾