[Bug target/107846] error: result of '8000 << 8' requires 22 bits to represent, but 'short int' only has 16 bits

david.faust at oracle dot com gcc-bugzilla@gcc.gnu.org
Wed Nov 23 18:26:22 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107846

--- Comment #1 from David Faust <david.faust at oracle dot com> ---
I think this is a bug in the test itself (or with these macros from libbpf).

libbpf/src/bpf_endian.h
#define ___bpf_mvb(x, b, n, m) ((__u##b)(x) << (b-(n+1)*8) >> (b-8) << (m*8))

#define ___bpf_swab16(x) ((__u16)(                      \
                          ___bpf_mvb(x, 16, 0, 1) |     \
                          ___bpf_mvb(x, 16, 1, 0)))

# define __bpf_constant_htons(x)        ___bpf_swab16(x)

In tools/testing/selftests/bpf/progs/test_tc_tunnel.c:

static const int cfg_port = 8000;
static const int cfg_udp_src = 20000;
...

then at e.g. line 276

        if (tcph.dest != __bpf_constant_htons(cfg_port))
                return TC_ACT_OK;

Expanding this __bpf_constant_htons macro:

__bpf_constant_htons (cfg_port)
__bpf_constant_htons (8000)
((__u16)(8000) << (16-(0+1)*8) >> (16-8) << (1*8)
((__u16)(8000) << (16-(1)*8) >> (8) << 8)
((__u16)(8000) << (8) >> 8 << 8
((__u16)(8000) << 8)

...which raises the shift-overflow warning.


More information about the Gcc-bugs mailing list