You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为第三方库中sendmsg系统调用生成通用Valgrind抑制规则?

Valgrind抑制第三方库sendmsg未初始化字节警告的正确规则

在C++项目中使用Valgrind时,若要抑制第三方库(如示例中的grpc)中sendmsg系统调用产生的未初始化字节警告,可按以下方式处理:

问题场景

你遇到的警告示例如下:

Syscall param sendmsg(msg.msg_iov[12]) points to uninitialised byte(s) 
==9473==    at 0x740E6F7: sendmsg (sendmsg.c:28) 
==9473==    by 0xA2AB34A: tcp_send(int, msghdr const*, int) (in /usr/local/lib/libgrpc.so.15.0.0) 
==9473==    by 0xA2ACB6C: tcp_flush((anonymous namespace)::grpc_tcp*, grpc_error**) (in /usr/local/lib/libgrpc.so.15.0.0) 
Syscall param sendmsg(msg.msg_iov) points to uninitialised byte(s) 
==9473==    at 0x740E6F7: sendmsg (sendmsg.c:28) 
==9473==    by 0xA2AB34A: tcp_send(int, msghdr const*, int) (in /usr/local/lib/libgrpc.so.15.0.0) 
==9473==    by 0xA2ACB6C: tcp_flush((anonymous namespace)::grpc_tcp*, grpc_error**) (in /usr/local/lib/libgrpc.so.15.0.0) 
Syscall param sendmsg(msg.msg_iov[2]) points to uninitialised byte(s) 
==9473==    at 0x740E6F7: sendmsg (sendmsg.c:28) 
==9473==    by 0xA2AB34A: tcp_send(int, msghdr const*, int) (in /usr/local/lib/libgrpc.so.15.0.0) 
==9473==    by 0xA2ACB6C: tcp_flush((anonymous namespace)::grpc_tcp*, grpc_error**) (in /usr/local/lib/libgrpc.so.15.0.0) 

你尝试的两种规则均无效:

{
   sendmsg_uninitialized_bytes
   Memcheck:Param
   sendmsg(msg.msg_iov)
   fun:sendmsg
}
{
   sendmsg_uninitialized_bytes
   Memcheck:Param
   sendmsg(msg.msg_iov*)
   fun:sendmsg
}

原因分析

  • 第一种规则仅能精确匹配不带索引的msg.msg_iov情况,无法覆盖带[N]的警告。
  • 第二种规则的参数模式虽正确,但仅匹配sendmsg函数,范围过于宽泛,且Valgrind需要结合上层调用栈信息才能精准匹配第三方库的调用。

正确的抑制规则

创建抑制文件(如grpc-valgrind-suppressions.supp),写入以下规则:

{
   grpc_sendmsg_uninit_bytes
   Memcheck:Param
   sendmsg(msg.msg_iov*)
   fun:sendmsg
   obj:/usr/local/lib/libgrpc.so.15.0.0
}

若需要更精准的定位(避免误抑制自身代码的问题),可添加上层调用函数:

{
   grpc_sendmsg_uninit_bytes
   Memcheck:Param
   sendmsg(msg.msg_iov*)
   fun:sendmsg
   fun:tcp_send
   obj:/usr/local/lib/libgrpc.so.15.0.0
}

规则说明

  • sendmsg(msg.msg_iov*):通配符*可匹配msg.msg_iov及任意索引形式的msg.msg_iov[N],覆盖所有相关警告。
  • obj:/usr/local/lib/libgrpc.so.15.0.0:限定仅抑制该特定grpc库产生的警告,不影响自身代码。
  • fun:tcp_send:进一步精准定位到grpc库中调用sendmsg的上层函数,避免误匹配其他场景。

使用方法

运行Valgrind时指定抑制文件:

valgrind --suppressions=grpc-valgrind-suppressions.supp ./your_cpp_program

内容的提问来源于stack exchange,提问作者kaixin liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:11:21