代码如下:
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 之间的六个字节的填充也未初始化。
我可以通过以下解决方法修复它:
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 抱怨这些,而不压制任何真正的积极因素?
这类似于
https://bugs.kde.org/show_bug.cgi?id=435375
一种解决方法是将结构体 memset 为 0。您可以通过包含“valgrind.h”并使用 RUNNING_ON_VALGRIND 宏来设置该条件。
在 Valgrind 中很难修复此类问题。我们必须处理每一种套接字结构。