c - 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_pid
和nl_groups
归零是否安全sendto()
?
解决方案
valgrind 抱怨 msg 参数有一些未初始化的字节,而不是 snl。它是 buf 指向的内存,其中包含未初始化的字节。
您可以使用 --track-origins=yes 来确认在哪里创建了未初始化的字节。
推荐阅读
- postgresql - 如何转换整数,使它们在 PostgreSQL SELECT 中有 n 个小数位
- eclipse - Windows 中 Eclipse 中的 Apache Storm Starter 2.2.0 - 尝试从 localhost NimbusLeaderNotFound 获取领导者 nimbus 信息时出现异常
- algorithm - 有没有一种有效的方法可以在函数图中找到最短路径?
- python - 熊猫数据框的索引目前是两列的“分组依据”,但我希望它们作为自己的列,并带有标准数字索引
- jquery - 如何模仿 POST 在 R 中抓取网站
- r - 在 R Markdown 中显示图像的正确方法是什么?
- android - 使用提供枚举列表的 IN 运算符查询房间数据库
- javascript - 如何根据象限公式进行测验/调查
- java - 如何存储地图
在数据库中 - python - 使用参差不齐的索引列表对数组进行索引并执行总和/均值减少