Gcc-16 detects out of bounds reference in this code.
In function ‘nix_inl_selftest_work_cb’,
inlined from ‘inl_outb_soft_exp_poll’ at
../drivers/common/cnxk/roc_nix_inl_dev.c:1173:4,
inlined from ‘nix_inl_outb_poll_thread’ at
../drivers/common/cnxk/roc_nix_inl_dev.c:1201:6:
../drivers/common/cnxk/roc_nix_inl_dev.c:43:19: warning: array subscript 1 is
outside array bounds of ‘uint64_t[1]’ {aka ‘long unsigned int[1]’}
[-Warray-bounds=]
43 | uintptr_t work = gw[1];
| ^~~~
../drivers/common/cnxk/roc_nix_inl_dev.c: In function
‘nix_inl_outb_poll_thread’:
../drivers/common/cnxk/roc_nix_inl_dev.c:1172:34: note: at offset 8 into object
‘tmp’ of size 8
1172 | uint64_t tmp = ~(uint32_t)0x0;
| ^~~
Fixes: bea5d990a93b ("net/cnxk: support outbound soft expiry notification")
Cc: [email protected]
Signed-off-by: Stephen Hemminger <[email protected]>
---
drivers/common/cnxk/roc_nix_inl_dev.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/drivers/common/cnxk/roc_nix_inl_dev.c
b/drivers/common/cnxk/roc_nix_inl_dev.c
index 1eb96f913a..3a4f1ac1e7 100644
--- a/drivers/common/cnxk/roc_nix_inl_dev.c
+++ b/drivers/common/cnxk/roc_nix_inl_dev.c
@@ -1169,12 +1169,10 @@ inl_outb_soft_exp_poll(struct nix_inl_dev *inl_dev,
uint32_t ring_idx)
(entry.s.data0 << 7));
if (sa != NULL) {
- uint64_t tmp = ~(uint32_t)0x0;
- inl_dev->work_cb(&tmp, sa, NIX_INL_SOFT_EXPIRY_THRD,
NULL, port_id);
- __atomic_store_n(ring_base + tail_l + 1, 0ULL,
- __ATOMIC_RELAXED);
- __atomic_fetch_add((uint32_t *)ring_base, 1,
- __ATOMIC_ACQ_REL);
+ uint64_t tmp[2];
+ inl_dev->work_cb(tmp, sa, NIX_INL_SOFT_EXPIRY_THRD,
NULL, port_id);
+ __atomic_store_n(ring_base + tail_l + 1, 0ULL,
__ATOMIC_RELAXED);
+ __atomic_fetch_add((uint32_t *)ring_base, 1,
__ATOMIC_ACQ_REL);
} else
plt_err("Invalid SA");
--
2.51.0