gpt4 book ai didi

c - Netlink 接收缓冲区对齐

转载 作者:太空狗 更新时间:2023-10-29 12:08:39 26 4
gpt4 key购买 nike

静态分析器 PVS-Studio 在 nh = (struct nlmsghdr *) buf 中报告,

The pointer 'buf' is cast to a more strictly aligned pointer type.

我认为警告是正确的。这是一个严重的问题吗?这代码需要在各种架构上可移植。我该如何解决这个?

我知道一些方法:

  • 在堆上分配缓冲区;
  • 使用stdalign特征,但它们不是 C99,
  • cmsghdr api 使用一个union 来处理对齐,但我不确定 netlink 是否这样做

还有其他选择吗?

下面的代码取自 netlink manpage .

int len;
char buf[8192]; /* 8192 to avoid message truncation on
platforms with page size > 4096 */
struct iovec iov = { buf, sizeof(buf) };
struct sockaddr_nl sa;
struct msghdr msg;
struct nlmsghdr *nh;

msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
len = recvmsg(fd, &msg, 0);

for (nh = (struct nlmsghdr *) buf; NLMSG_OK (nh, len);
nh = NLMSG_NEXT (nh, len)) {
/* The end of multipart message */
if (nh->nlmsg_type == NLMSG_DONE)
return;

if (nh->nlmsg_type == NLMSG_ERROR)
/* Do some error handling */
...

/* Continue with parsing payload */
...
}

谢谢。

最佳答案

获取分配的struct nlmsghdr 的指针而不是char buf[8192] 不是更好吗?

例如:

int len;
struct nlmsghdr buf;
struct iovec iov = { &buf, sizeof(buf) };
struct sockaddr_nl sa;
struct msghdr msg;
struct nlmsghdr *nh;

msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
len = recvmsg(fd, &msg, 0);

for (nh = &buf; NLMSG_OK (nh, len);
nh = NLMSG_NEXT (nh, len)) {
/* The end of multipart message */
if (nh->nlmsg_type == NLMSG_DONE)
return;

if (nh->nlmsg_type == NLMSG_ERROR)
/* Do some error handling */
...

/* Continue with parsing payload */
...
}

关于c - Netlink 接收缓冲区对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57745580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com