• Cupertino Miranda's avatar
    selftests/bpf: Fix a few tests for GCC related warnings. · 5ddafcc3
    Cupertino Miranda authored
    This patch corrects a few warnings to allow selftests to compile for
    GCC.
    
    -- progs/cpumask_failure.c --
    
    progs/bpf_misc.h:136:22: error: ‘cpumask’ is used uninitialized
    [-Werror=uninitialized]
      136 | #define __sink(expr) asm volatile("" : "+g"(expr))
          |                      ^~~
    progs/cpumask_failure.c:68:9: note: in expansion of macro ‘__sink’
       68 |         __sink(cpumask);
    
    The macro __sink(cpumask) with the '+' contraint modifier forces the
    the compiler to expect a read and write from cpumask. GCC detects
    that cpumask is never initialized and reports an error.
    This patch removes the spurious non required definitions of cpumask.
    
    -- progs/dynptr_fail.c --
    
    progs/dynptr_fail.c:1444:9: error: ‘ptr1’ may be used uninitialized
    [-Werror=maybe-uninitialized]
     1444 |         bpf_dynptr_clone(&ptr1, &ptr2);
    
    Many of the tests in the file are related to the detection of
    uninitialized pointers by the verifier. GCC is able to detect possible
    uninitialized values, and reports this as an error.
    The patch initializes all of the previous uninitialized structs.
    
    -- progs/test_tunnel_kern.c --
    
    progs/test_tunnel_kern.c:590:9: error: array subscript 1 is outside
    array bounds of ‘struct geneve_opt[1]’ [-Werror=array-bounds=]
      590 |         *(int *) &gopt.opt_data = bpf_htonl(0xdeadbeef);
          |         ^~~~~~~~~~~~~~~~~~~~~~~
    progs/test_tunnel_kern.c:575:27: note: at offset 4 into object ‘gopt’ of
    size 4
      575 |         struct geneve_opt gopt;
    
    This tests accesses beyond the defined data for the struct geneve_opt
    which contains as last field "u8 opt_data[0]" which clearly does not get
    reserved space (in stack) in the function header. This pattern is
    repeated in ip6geneve_set_tunnel and geneve_set_tunnel functions.
    GCC is able to see this and emits a warning.
    The patch introduces a local struct that allocates enough space to
    safely allow the write to opt_data field.
    
    -- progs/jeq_infer_not_null_fail.c --
    
    progs/jeq_infer_not_null_fail.c:21:40: error: array subscript ‘struct
    bpf_map[0]’ is partly outside array bounds of ‘struct <anonymous>[1]’
    [-Werror=array-bounds=]
       21 |         struct bpf_map *inner_map = map->inner_map_meta;
          |                                        ^~
    progs/jeq_infer_not_null_fail.c:14:3: note: object ‘m_hash’ of size 32
       14 | } m_hash SEC(".maps");
    
    This example defines m_hash in the context of the compilation unit and
    casts it to struct bpf_map which is much smaller than the size of struct
    bpf_map. It errors out in GCC when it attempts to access an element that
    would be defined in struct bpf_map outsize of the defined limits for
    m_hash.
    This patch disables the warning through a GCC pragma.
    
    This changes were tested in bpf-next master selftests without any
    regressions.
    Signed-off-by: default avatarCupertino Miranda <cupertino.miranda@oracle.com>
    Cc: jose.marchesi@oracle.com
    Cc: david.faust@oracle.com
    Cc: Yonghong Song <yonghong.song@linux.dev>
    Cc: Eduard Zingerman <eddyz87@gmail.com>
    Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
    Link: https://lore.kernel.org/r/20240510183850.286661-2-cupertino.miranda@oracle.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    5ddafcc3
dynptr_fail.c 35.1 KB