valgrind compains 结构 sockaddr_nl

valgrind compains on struct sockaddr_nl

我认为套接字编程中用于发送消息的常见模式是:

static const struct sockaddr_nl snl = {
   .nl_family = AF_NETLINK
};
return sendto(nl->fd, buf, len, 0, (struct sockaddr *) &snl, sizeof(snl));

其中 struct sockaddr_* 取决于套接字类型。上面的代码会导致valgrind报错:

Syscall param socketcall.sendto(msg) points to uninitialised byte(s)

这显然是因为 struct sockaddr_nl 的其余成员没有初始化。

这是它在我的系统 (ubuntu 16.04) 上的样子:

struct sockaddr_nl {
        __kernel_sa_family_t    nl_family;      /* AF_NETLINK   */
        unsigned short  nl_pad;         /* zero         */
        __u32           nl_pid;         /* port ID      */
        __u32           nl_groups;      /* multicast groups mask */
};

所以我的问题 - 在 sendto() 操作的情况下将 nl_pidnl_groups 初始化为零是否安全?

valgrind 抱怨 msg 参数有一些未初始化的字节, 与 snl 无关。 它是 buf 指向的内存,其中包含未初始化的字节。

您可以使用 --track-origins=yes 来确认未初始化字节的位置 已创建。