提问人:fadedbee 提问时间:10/18/2023 更新时间:10/18/2023 访问量:46
如何在结构中初始化填充,以便 Valgrind 停止抱怨
How to initialise the padding in structs, so that Valgrind stops complaining
问:
使用如下代码:
struct sock_fprog bpf = {
.len = 3,
.filter = code,
};
setsockopt(sock, SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF, &bpf, sizeof(bpf));
Valgrind抱怨道:
==1903595== Syscall param socketcall.setsockopt(optval) points to uninitialised byte(s)
==1903595== at 0x4DFFA6A: setsockopt_syscall (setsockopt.c:29)
==1903595== by 0x4DFFA6A: setsockopt (setsockopt.c:95)
==1903595== by 0x113026: udp_bind4 (udp.c:75)
==1903595== by 0x11307A: udp_find_or_create_fd (udp.c:84)
...
==1903595== Address 0x1ffefffe82 is on thread 1's stack
==1903595== in frame #1, created by udp_bind4 (udp.c:20)
==1903595==
这是因为,即使在 -O0 时,.len 和 .code 之间的 6 个字节填充也是未初始化的。
我可以通过以下解决方法修复它:
union {
uint8_t buf[16];
struct sock_fprog fprog;
} bpf = {0};
bpf.fprog.len = 3;
bpf.fprog.filter = code;
setsockopt(sock, SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF, &bpf, sizeof(bpf));
但它很丑陋,我有很多带有填充的结构导致这些 Valgrind 错误。
使用填充为零,但在许多情况下,我需要使用非常量值。static
我有什么选择可以阻止 Valgrind 抱怨这些,而不会消除任何真正的阳性结果?
答:
2赞
Paul Floyd
10/18/2023
#1
这类似于
https://bugs.kde.org/show_bug.cgi?id=435375
一种解决方法是将结构体设置为 0。您可以通过包含“valgrind.h”并使用 RUNNING_ON_VALGRIND 宏来设置条件。
在 Valgrind 中很难解决这种事情。我们必须处理每一种套接字结构。
评论
0赞
fadedbee
10/18/2023
问题是我丢失了简洁的结构初始化语法,需要为每个结构成员添加一个赋值语句。其中一些结构体(例如)有很多字段。memset
msghdr
1赞
user3386109
10/18/2023
@fadedbee struct 初始化语法并不是那么简洁。 并不比bpf.len = 3;
.len = 3,
1赞
Paul Floyd
10/19/2023
您需要 memset 以确保所有内容都已初始化,孔和填充等,然后设置所需的值。
评论