On Wed, Jan 22, 2025 at 4:49 AM Daniel Henrique Barboza
<dbarb...@ventanamicro.com> wrote:
>
> Coverity found a DEADCODE issue in rmw_xiregi() claiming that we can't
> reach 'RISCV_EXCP_VIRT_INSTRUCTION_FAULT' at the 'done' label:
>
>  > 2652     done:
>  >>>>      CID 1590357:  Control flow issues  (DEADCODE)
>  >>>>      Execution cannot reach the expression 
> "RISCV_EXCP_VIRT_INSTRUCTION_FAULT"
>      inside this statement: "return (env->virt_enabled &...".
>  > 2653         return (env->virt_enabled && virt) ?
>  > 2654                 RISCV_EXCP_VIRT_INSTRUCTION_FAULT : 
> RISCV_EXCP_ILLEGAL_INST;
>
> This happens because 'virt' is being set to 'false' and it will remain
> as 'false' in any code path where 'done' will be called. The label can
> be safely reduced to:
>
> done:
>      return RISCV_EXCP_ILLEGAL_INST;
>
> And that will leave us with the following usage of a 'goto' skipping a
> single 'return' to do another single 'return':
>
>      } else {
>         goto done;
>      }
>
>      return rmw_xireg_csrind(env, csrno, isel, val, new_val, wr_mask);
>
> done:
>      return RISCV_EXCP_ILLEGAL_INST;
>
> Which we will eliminate it and just do 'return RISCV_EXCP_ILLEGAL_INST'
> instead.
>
> Resolves: Coverity CID 1590357
> Fixes: 5e33a20827 ("target/riscv: Support generic CSR indirect access")
> Signed-off-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com>

Reviewed-by: Alistair Francis <alistair.fran...@wdc.com>

Alistair

> ---
>  target/riscv/csr.c | 8 +-------
>  1 file changed, 1 insertion(+), 7 deletions(-)
>
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index 0e83c3b045..75f21ccabb 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -2621,7 +2621,6 @@ static int rmw_xireg_csrind(CPURISCVState *env, int 
> csrno,
>  static int rmw_xiregi(CPURISCVState *env, int csrno, target_ulong *val,
>                        target_ulong new_val, target_ulong wr_mask)
>  {
> -    bool virt = false;
>      int ret = -EINVAL;
>      target_ulong isel;
>
> @@ -2642,16 +2641,11 @@ static int rmw_xiregi(CPURISCVState *env, int csrno, 
> target_ulong *val,
>      } else if (CSR_VSIREG <= csrno && csrno <= CSR_VSIREG6 &&
>                 csrno != CSR_VSIREG4 - 1) {
>          isel = env->vsiselect;
> -        virt = true;
>      } else {
> -        goto done;
> +        return RISCV_EXCP_ILLEGAL_INST;
>      }
>
>      return rmw_xireg_csrind(env, csrno, isel, val, new_val, wr_mask);
> -
> -done:
> -    return (env->virt_enabled && virt) ?
> -            RISCV_EXCP_VIRT_INSTRUCTION_FAULT : RISCV_EXCP_ILLEGAL_INST;
>  }
>
>  static RISCVException rmw_xireg(CPURISCVState *env, int csrno,
> --
> 2.47.1
>
>

Reply via email to