error summary末尾“0 errors from 0 contexts”表示无运行时错误,是程序内存安全的唯一可靠信号;非零值说明存在未被抑制的非法访问等错误,需结合-v参数和suppressed信息进一步排查。

ERROR SUMMARY末尾那行数字到底代表什么
它只统计“被报告出来且未被抑制”的错误上下文数量,不是错误类型数,也不是内存块数,更不是崩溃次数。比如同一段越界读在循环里执行100次,ERROR SUMMARY通常仍显示 1 errors from 1 contexts——Valgrind默认去重合并同类错误。
关键点:
-
0 errors from 0 contexts是干净的唯一可靠信号;只要这个不为零,就得查 - 括号里
suppressed: X from Y表示被 suppress 文件过滤掉的错误数,不等于“没问题”,只是你主动忽略 - 如果看到
suppressed: 12 from 3,说明有3类错误被压制了12次,得翻 suppress 文件确认是否合理 - 加
-v参数才能看到被压制项的来源(比如哪个 suppress 规则匹配了)
为什么ERROR SUMMARY是0,但HEAP SUMMARY还说definitely lost
因为 ERROR SUMMARY 和内存泄漏检测是两套机制:ERROR SUMMARY 只计非法访问、UAF、未初始化值等运行时错误;而 definitely lost 属于退出前的堆状态分析,归在 LEAK SUMMARY 里,不计入 ERROR SUMMARY。
换句话说:
-
Invalid read of size 4→ 进 ERROR SUMMARY -
40 bytes in 1 block are definitely lost→ 进 LEAK SUMMARY,不影响 ERROR SUMMARY 计数 - 两者都为 0,才表示既没运行时错误,也没泄漏
ERROR SUMMARY为0但程序还是段错误,怎么办
这说明 Valgrind 没捕获到触发崩溃的非法操作——常见原因有:
- 崩溃发生在 Valgrind 无法插桩的代码里,比如内联汇编、某些信号处理函数、或 JIT 编译的代码段
- 用了
--tool=memcheck但实际需要--tool=helgrind(多线程竞争)或--tool=drd - 程序直接调用
exit()或_exit()提前终止,绕过了 Memcheck 的退出检查流程 - 栈溢出太深,压垮了 Valgrind 自己的监控栈,导致失效(少见但可能)
想让ERROR SUMMARY更准,必须加的参数有哪些
默认行为会漏掉部分问题,尤其对 C++ 和复杂控制流。真正有用的最小组合是:
-
--track-origins=yes:让未初始化值报错时带源头(否则只报使用点,找不到赋值位置) -
--leak-check=full:虽然不影响 ERROR SUMMARY 数字,但能暴露释放不匹配等间接导致崩溃的问题 -
--read-var-info=yes:配合 DWARF 调试信息,把非法地址映射回变量名(需-g编译) -
--freelist-vol=10000000:防止大内存分配后 freelist 被清空,导致 UAF 检测失效(尤其测试长时间运行服务)
最常被忽略的是 --track-origins=yes ——它会让性能下降 5–10 倍,但没有它,90% 的未初始化值问题只能看到“用在了 printf”,看不到“谁给的垃圾值”。











