如何初始化结构中的填充,以便 Valgrind 停止抱怨

问题描述 投票:0回答:1

代码如下:

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 抱怨这些,而不压制任何真正的积极因素?

c struct valgrind padding
1个回答
0
投票

这类似于

https://bugs.kde.org/show_bug.cgi?id=435375

一种解决方法是将结构体 memset 为 0。您可以通过包含“valgrind.h”并使用 RUNNING_ON_VALGRIND 宏来设置该条件。

在 Valgrind 中很难修复此类问题。我们必须处理每一种套接字结构。

© www.soinside.com 2019 - 2024. All rights reserved.