David Miller wrote:
> We always explicitly initialize the flows, and even for local stack
> assignment based initialization, gcc zeros out the padding bytes
> always.
I thought so too until I added the iptables compat functions recently
and noticed uninitialized padding of on-stack structures, which
confused iptables since it also uses memcmp.
This program demonstrates the effect, it doesn't output the expected
"1 2" but "1 4294967042" on my x86_64 (gcc-Version 4.1.2 20060901
(prerelease) (Debian 4.1.1-13)). The initialization doesn't touch
the padding bytes:
0x0000000000400494 <test+8>: movl $0x1,0xfffffffffffffff0(%rbp)
0x000000000040049b <test+15>: movb $0x2,0xfffffffffffffff4(%rbp)
#include <stdio.h>
struct x1 {
unsigned int x;
char y;
};
struct x2 {
unsigned int x;
unsigned int y;
};
void pollute(void)
{
struct x2 x = {
.x = ~0,
.y = ~0,
};
}
void test(void)
{
struct x1 x1 = {
.x = 1,
.y = 2,
};
struct x2 *x2 = (struct x2 *)&x1;
printf("%u %u\n", x2->x, x2->y);
}
int main(int argc, char **argv)
{
pollute();
test();
return 0;
}