我正在调试一个链接到商业 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 不再打印这些警告(至少在我放弃它之前)。问题是:我是否可以考虑诸如保存忽略之类的错误,它们是否经常出现在打包软件中,或者它们甚至可能是误报(例如,因为库是通过优化编译的)?
最佳答案
我会说:
- 不,您不能认为忽略它们是安全的。 Valgrind 很好。
- 是的,如果原始开发人员从未在其代码中使用过 Valgrind 或类似工具,那么它们可能非常常见,因此可以合理地预期会出现一些点击。
- 我不认为它们是误报,这种情况很少见。
关于c - Valgrind memcheck 在商业库中发现大量条件跳转和无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28741650/