From af03343f934b50f64389aa4222a2a111a125f69f Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 8 Sep 2025 22:04:40 -0700 Subject: [PATCH] cmd/compile: fix bounds check report For constant-index, variable length situations. Inadvertant shadowing of the yVal variable. Oops. Fixes #75327 Change-Id: I3403066fc39b7664222a3098cf0f22b5761ea66a Reviewed-on: https://go-review.googlesource.com/c/go/+/702015 Reviewed-by: Cuong Manh Le Reviewed-by: David Chase Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI --- src/cmd/compile/internal/amd64/ssa.go | 2 +- src/cmd/compile/internal/arm/ssa.go | 2 +- src/cmd/compile/internal/arm64/ssa.go | 2 +- src/cmd/compile/internal/loong64/ssa.go | 2 +- src/cmd/compile/internal/mips/ssa.go | 2 +- src/cmd/compile/internal/mips64/ssa.go | 2 +- src/cmd/compile/internal/ppc64/ssa.go | 2 +- src/cmd/compile/internal/riscv64/ssa.go | 2 +- src/cmd/compile/internal/s390x/ssa.go | 2 +- src/cmd/compile/internal/x86/ssa.go | 2 +- test/fixedbugs/issue75327.go | 33 +++++++++++++++++++++++++ 11 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 test/fixedbugs/issue75327.go diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go index 8c8c7d9027..6331501dc9 100644 --- a/src/cmd/compile/internal/amd64/ssa.go +++ b/src/cmd/compile/internal/amd64/ssa.go @@ -1306,7 +1306,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.OpAMD64LoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - x86.REG_AX) + yVal = int(v.Args[0].Reg() - x86.REG_AX) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/src/cmd/compile/internal/arm/ssa.go b/src/cmd/compile/internal/arm/ssa.go index 91ef31c215..a3bfb491b8 100644 --- a/src/cmd/compile/internal/arm/ssa.go +++ b/src/cmd/compile/internal/arm/ssa.go @@ -777,7 +777,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.OpARMLoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - arm.REG_R0) + yVal = int(v.Args[0].Reg() - arm.REG_R0) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index 83293db9b9..402ec493c2 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -1319,7 +1319,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.OpARM64LoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - arm64.REG_R0) + yVal = int(v.Args[0].Reg() - arm64.REG_R0) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/src/cmd/compile/internal/loong64/ssa.go b/src/cmd/compile/internal/loong64/ssa.go index 40fa10c6de..100ebf0456 100644 --- a/src/cmd/compile/internal/loong64/ssa.go +++ b/src/cmd/compile/internal/loong64/ssa.go @@ -811,7 +811,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.OpLOONG64LoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - loong64.REG_R4) + yVal = int(v.Args[0].Reg() - loong64.REG_R4) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/src/cmd/compile/internal/mips/ssa.go b/src/cmd/compile/internal/mips/ssa.go index 7390db2945..c338fdc6b3 100644 --- a/src/cmd/compile/internal/mips/ssa.go +++ b/src/cmd/compile/internal/mips/ssa.go @@ -551,7 +551,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.OpMIPSLoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - mips.REG_R1) + yVal = int(v.Args[0].Reg() - mips.REG_R1) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/src/cmd/compile/internal/mips64/ssa.go b/src/cmd/compile/internal/mips64/ssa.go index 37e2274ae8..92788be00c 100644 --- a/src/cmd/compile/internal/mips64/ssa.go +++ b/src/cmd/compile/internal/mips64/ssa.go @@ -542,7 +542,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.OpMIPS64LoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - mips.REG_R1) + yVal = int(v.Args[0].Reg() - mips.REG_R1) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/src/cmd/compile/internal/ppc64/ssa.go b/src/cmd/compile/internal/ppc64/ssa.go index 1086a9ccbf..ace3024480 100644 --- a/src/cmd/compile/internal/ppc64/ssa.go +++ b/src/cmd/compile/internal/ppc64/ssa.go @@ -1947,7 +1947,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.OpPPC64LoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - ppc64.REG_R3) + yVal = int(v.Args[0].Reg() - ppc64.REG_R3) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/src/cmd/compile/internal/riscv64/ssa.go b/src/cmd/compile/internal/riscv64/ssa.go index 3d2f65a75e..88733b0d64 100644 --- a/src/cmd/compile/internal/riscv64/ssa.go +++ b/src/cmd/compile/internal/riscv64/ssa.go @@ -544,7 +544,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.OpRISCV64LoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - riscv.REG_X5) + yVal = int(v.Args[0].Reg() - riscv.REG_X5) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/src/cmd/compile/internal/s390x/ssa.go b/src/cmd/compile/internal/s390x/ssa.go index 86efde4fa0..de00f1ef8c 100644 --- a/src/cmd/compile/internal/s390x/ssa.go +++ b/src/cmd/compile/internal/s390x/ssa.go @@ -608,7 +608,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.OpS390XLoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - s390x.REG_R0) + yVal = int(v.Args[0].Reg() - s390x.REG_R0) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/src/cmd/compile/internal/x86/ssa.go b/src/cmd/compile/internal/x86/ssa.go index 3347b38b28..d0aad08849 100644 --- a/src/cmd/compile/internal/x86/ssa.go +++ b/src/cmd/compile/internal/x86/ssa.go @@ -804,7 +804,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { } case ssa.Op386LoweredPanicBoundsCR: yIsReg = true - yVal := int(v.Args[0].Reg() - x86.REG_AX) + yVal = int(v.Args[0].Reg() - x86.REG_AX) c := v.Aux.(ssa.PanicBoundsC).C if c >= 0 && c <= abi.BoundsMaxConst { xVal = int(c) diff --git a/test/fixedbugs/issue75327.go b/test/fixedbugs/issue75327.go new file mode 100644 index 0000000000..9ca7c24e9b --- /dev/null +++ b/test/fixedbugs/issue75327.go @@ -0,0 +1,33 @@ +// run + +package main + +import ( + "fmt" + "strings" +) + +func main() { + defer func() { + err := recover() + txt := fmt.Sprintf("%s", err) + if !strings.HasSuffix(txt, "with length 1") { + panic("bad error: " + txt) + } + }() + foo([]uint64{0}) +} + +//go:noinline +func foo(haystack []uint64) { + for n := range len(haystack) { + _ = n + _ = haystack[1] + } + + xxx := haystack[0:len(haystack)] + sink(xxx) +} + +//go:noinline +func sink([]uint64) {}