]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/internal/obj/riscv: add check for invalid shift amount input
authorWayne Zuo <wdvxdr@golangcn.org>
Thu, 12 Jan 2023 11:37:18 +0000 (19:37 +0800)
committerWayne Zuo <wdvxdr@golangcn.org>
Thu, 19 Jan 2023 23:30:35 +0000 (23:30 +0000)
Current RISCV64 assembler do not check the invalid shift amount. This CL
adds the check to avoid generating invalid instructions.

Fixes #57755

Change-Id: If33877605e161baefd98c50db1f71641ca057507
Reviewed-on: https://go-review.googlesource.com/c/go/+/461755
Reviewed-by: Joel Sing <joel@sing.id.au>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Run-TryBot: Wayne Zuo <wdvxdr@golangcn.org>

src/cmd/asm/internal/asm/testdata/riscv64error.s
src/cmd/internal/obj/riscv/obj.go

index d3e43e721db55e7068a47cf4b3bdd1a2b18968b2..cdb8a028bd1e93b1c329ed75678f30ca900d287b 100644 (file)
@@ -26,5 +26,17 @@ TEXT errors(SB),$0
        MOVD    F0, F1, F2                      // ERROR "illegal MOV instruction"
        MOV     X10, X11, X12                   // ERROR "illegal MOV instruction"
        MOVW    X10, X11, X12                   // ERROR "illegal MOV instruction"
+       SLLI    $64, X5, X6                     // ERROR "shift amount out of range 0 to 63"
+       SRLI    $64, X5, X6                     // ERROR "shift amount out of range 0 to 63"
+       SRAI    $64, X5, X6                     // ERROR "shift amount out of range 0 to 63"
+       SLLI    $-1, X5, X6                     // ERROR "shift amount out of range 0 to 63"
+       SRLI    $-1, X5, X6                     // ERROR "shift amount out of range 0 to 63"
+       SRAI    $-1, X5, X6                     // ERROR "shift amount out of range 0 to 63"
+       SLLIW   $32, X5, X6                     // ERROR "shift amount out of range 0 to 31"
+       SRLIW   $32, X5, X6                     // ERROR "shift amount out of range 0 to 31"
+       SRAIW   $32, X5, X6                     // ERROR "shift amount out of range 0 to 31"
+       SLLIW   $-1, X5, X6                     // ERROR "shift amount out of range 0 to 31"
+       SRLIW   $-1, X5, X6                     // ERROR "shift amount out of range 0 to 31"
+       SRAIW   $-1, X5, X6                     // ERROR "shift amount out of range 0 to 31"
 
        RET
index 95cd3659e8624b6b5eec4117eaafaf30b76b0385..cbf894817d9c83de7e8ee0408064cdbf1e7e3312 100644 (file)
@@ -2146,6 +2146,16 @@ func instructionsForProg(p *obj.Prog) []*instruction {
                // FNEGD rs, rd -> FSGNJND rs, rs, rd
                ins.as = AFSGNJND
                ins.rs1 = uint32(p.From.Reg)
+
+       case ASLLI, ASRLI, ASRAI:
+               if ins.imm < 0 || ins.imm > 63 {
+                       p.Ctxt.Diag("%v: shift amount out of range 0 to 63", p)
+               }
+
+       case ASLLIW, ASRLIW, ASRAIW:
+               if ins.imm < 0 || ins.imm > 31 {
+                       p.Ctxt.Diag("%v: shift amount out of range 0 to 31", p)
+               }
        }
        return inss
 }