如何让 valgrind 忽略特定行?

How to make valgrind ignore certain line?

例如

==26460== 2 bytes in 1 blocks are still reachable in loss record 2 of 105
==26460==    at 0x4C28BE3: malloc (vg_replace_malloc.c:299)
==26460==    by 0x580D889: strdup (in /usr/lib64/libc-2.17.so)
==26460==    by 0x4F50AF: init (init.c:468)
==26460==    by 0x406D75: main (main.c:825)

我不想检查 init.c:468: mode = strdup,我确定这只会 malloc 一次,并且会持续整个过程生命周期。

是否可以让 valgrind 不检查这一行?

正如我在评论中所说:我建议不要这样做。

但是 Valgrind 确实具有抑制警告的功能。 专用于该目的的功能支持抑制特定消息的最便捷方式:

--gen-suppressions=yes

这显然会为 each/any 生成的消息输出精确的抑制语法。

参见常见问题中的 5.1:
http://valgrind.org/docs/manual/faq.html#faq.writesupp

(我喜欢他们的风格:
"F:Can you write ... for me?" 我期待一个完全足够的
"A:No." 但他们确实回答了
"A: Yes ..."。超酷。)

你应该修复漏洞;这样做要好得多。

您无法阻止 Valgrind 检查泄漏,但您可以通过抑制泄漏来阻止它报告泄漏。

使用:

valgrind --gen-suppressions=yes --leak-check=all -- tested-program …

然后您可以将抑制保存在一个文件中,比如 tp.suppressions,随后您可以使用:

valgrind --suppressions=tp.suppressions -- tested-program …

如果您像我一样在 Mac 上工作,并且使用前沿系统,您通常会发现有必要抑制系统启动代码的泄漏 — 在 [=13= 之前分配的内存] 被调用,因此您无法控制。

OTOH,macOS 新版本发布后,再次获取 Valgrind 运行 是例行公事。我升级到 macOS High Sierra 10.13;由于无法识别内核,Valgrind 再次停止工作。