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_pid
和 nl_groups
初始化为零是否安全?
valgrind 抱怨 msg 参数有一些未初始化的字节,
与 snl 无关。
它是 buf 指向的内存,其中包含未初始化的字节。
您可以使用 --track-origins=yes 来确认未初始化字节的位置
已创建。
我认为套接字编程中用于发送消息的常见模式是:
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_pid
和 nl_groups
初始化为零是否安全?
valgrind 抱怨 msg 参数有一些未初始化的字节, 与 snl 无关。 它是 buf 指向的内存,其中包含未初始化的字节。
您可以使用 --track-origins=yes 来确认未初始化字节的位置 已创建。