valgrind 的 error summary 行末数字表示未被抑制的严重错误总数,仅含 invalid read、use of uninitialised value、definitely lost 等,不含 still reachable;可用 --error-exitcode 控制退出码,配合脚本判断;分类型统计需手动过滤输出。

Valgrind 默认输出末尾会统计错误总数
运行 valgrind --tool=memcheck ./your_program 后,只要程序退出(无论正常或崩溃),Valgrind 会在输出最底部打印类似这样的汇总行:
==12345== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
其中 3 errors 就是它检测到的**未被抑制的错误总数**。这个数字只计数 Invalid read、Use of uninitialised value、Definitely lost 等严重问题,不包括 still reachable 这类信息性提示。
用 --error-exitcode 让错误数影响返回值
如果要在脚本里自动判断是否有错误,不能只靠解析输出文本——因为输出可能被重定向或混杂调试日志。更可靠的方式是让 Valgrind 在发现错误时返回非零退出码:
-
valgrind --error-exitcode=1 --tool=memcheck ./a.out:只要报告 ≥1 个错误,进程退出码就是1 - 退出码为
0表示「没发现任何错误」(注意:不表示代码绝对安全,只表示 Memcheck 没触发告警) - 这个选项不影响错误计数本身,只是把总数映射成 shell 可捕获的状态
想精确知道每类错误各有多少?用 --gen-suppressions=all + 手动统计
Valgrind 不直接提供分类型错误计数(比如“2 个 invalid read,1 个 leak”)。但你可以用以下方式逼近:
- 加参数
--gen-suppressions=all运行一次,它会在输出中把每个错误都生成一条 suppression 规则,每条规则开头都是{,你可以用grep -c "^{"统计行数(近似错误数) - 更准一点:过滤所有以
==开头、包含Invalid read/Definitely lost的行,再用wc -l - 注意:重复触发的同一错误上下文会被合并计为 1 个 context,所以
ERROR SUMMARY里的 “3 errors from 3 contexts” 表示三个独立位置;而 “3 errors from 1 context” 表示同一处被触发了三次
常见误解:为什么 ERROR SUMMARY 显示 0 却仍有内存泄漏提示?
这是因为 Valgrind 把问题分级了:
-
definitely lost、indirectly lost算作错误,计入总数 -
possibly lost、still reachable**不计入**ERROR SUMMARY的 error 数,只在详细报告里列出 - 如果你关心内存是否释放干净,得额外看
HEAP SUMMARY下的in use at exit和total heap usage行,不能只盯ERROR SUMMARY
真正容易被忽略的是:很多团队只检查 ERROR SUMMARY 是否为 0,却放过了 still reachable —— 它往往意味着全局缓存、单例对象或日志缓冲区没清理,长期运行会累积占用。











