首页 > 解决方案 > valgrind 在 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 */
};

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

标签: clinuxsocketsnetwork-programmingvalgrind

解决方案


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

您可以使用 --track-origins=yes 来确认在哪里创建了未初始化的字节。


推荐阅读