• Jose E. Marchesi's avatar
    bpf: disable strict aliasing in test_global_func9.c · 73868988
    Jose E. Marchesi authored
    The BPF selftest test_global_func9.c performs type punning and breaks
    srict-aliasing rules.
    
    In particular, given:
    
      int global_func9(struct __sk_buff *skb)
      {
    	int result = 0;
    
    	[...]
    	{
    		const struct C c = {.x = skb->len, .y = skb->family };
    
    		result |= foo((const struct S *)&c);
    	}
      }
    
    When building with strict-aliasing enabled (the default) the
    initialization of `c' gets optimized away in its entirely:
    
    	[... no initialization of `c' ...]
    	r1 = r10
    	r1 += -40
    	call	foo
    	w0 |= w6
    
    Since GCC knows that `foo' accesses s->x, we get a "maybe
    uninitialized" warning.
    
    On the other hand, when strict-aliasing is disabled GCC only optimizes
    away the store to `.y':
    
    	r1 = *(u32 *) (r6+0)
    	*(u32 *) (r10+-40) = r1  ; This is .x = skb->len in `c'
    	r1 = r10
    	r1 += -40
    	call	foo
    	w0 |= w6
    
    In this case the warning is not emitted, because s-> is initialized.
    
    This patch disables strict aliasing in this test when building with
    GCC.  clang seems to not optimize this particular code even when
    strict aliasing is enabled.
    
    Tested in bpf-next master.
    Signed-off-by: default avatarJose E. Marchesi <jose.marchesi@oracle.com>
    Cc: david.faust@oracle.com
    Cc: cupertino.miranda@oracle.com
    Cc: Yonghong Song <yonghong.song@linux.dev>
    Cc: Eduard Zingerman <eddyz87@gmail.com>
    Link: https://lore.kernel.org/r/20240511212213.23418-1-jose.marchesi@oracle.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    73868988
Makefile 30.9 KB