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 "

Reply via email to