target/riscv: fix undefined operation
authorAntonio Borneo <borneo.antonio@gmail.com>
Mon, 19 Sep 2022 13:28:15 +0000 (15:28 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Fri, 23 Sep 2022 21:24:49 +0000 (21:24 +0000)
commitfd2a44ab55e7c54ee9e594717aba72d04e85e716
tree3fbc82047e7e433f3218d8b5b9bb15dd1cc5e006
parentaff48a6a31019af17959a7da33909d1cea6de61a
target/riscv: fix undefined operation

Scan-build reports:
Logic error: Result of operation is garbage or undefined
riscv.c:1614 The result of the left shift is undefined due
to shifting by '4294967281', which is greater or
equal to the width of type 'target_addr_t'

This is a false warning due to clang that considers the impossible
case of 32 bits hart (xlen = 32) in SATP_MODE_SV48 mode
(info->va_bits = 48).
Under such case:
riscv.c:1614 ... ((target_addr_t)1 << (xlen - (info->va_bits - 1))) ...
the shift amount wraps around the unsigned type and assumes the
value 4294967281 (0xfffffff1).

Use assert() to prevent clang from complaining.

Change-Id: I08fdd2a806c350d061641e28cf15a51b397db099
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/7209
Reviewed-by: Tim Newsome <tim@sifive.com>
Reviewed-by: Jan Matyas <matyas@codasip.com>
Tested-by: jenkins
src/target/riscv/riscv.c