On Thu, 2026-10-22 at 21:10 +0100, Peter Maydell wrote:
> In prop_marchid_set() we set mxlen to either 32 or 64, and then
> calculate
> invalid_val = 1LL << (mxlen - 1);
>
> which shifts the signed value 1LL up into its sign bit when mxlen is
> 64, which Coverity complains about.
>
> This is not UB for QEMU because we use -fwrapv, but it makes more
> sense to use an explicitly unsigned 1ULL here when we clearly want to
> be treating it as an unsigned value and the 'invalid_val' variable is
> of type uint64_t.
>
> Resolves: Coverity CID 1547552
> Fixes: d6a427e2c0b24 ("target/riscv/cpu.c: restrict 'marchid' value")
> Signed-off-by: Peter Maydell <[email protected]>
Reviewed-by: Alistair Francis <[email protected]>
Alistair
> ---
> target/riscv/cpu.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 08a4d14ea1f..d47a69bea7d 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -2298,7 +2298,7 @@ static void prop_marchid_set(Object *obj,
> Visitor *v, const char *name,
> g_assert_not_reached();
> }
>
> - invalid_val = 1LL << (mxlen - 1);
> + invalid_val = 1ULL << (mxlen - 1);
>
> if (value == invalid_val) {
> error_setg(errp, "Unable to set marchid with MSB (%u) bit
> set "