cmd/compile: teach prove about len's & cap's max based on the element size

Change-Id: I88056fada1ff488c199fce54cf737dbdd091214d
Reviewed-on: https://go-review.googlesource.com/c/go/+/695095
Auto-Submit: Jorropo <jorropo.pgm@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Jorropo 2025-08-12 12:49:13 +02:00 committed by Gopher Robot
parent 9763ece873
commit 9fcb87c352
2 changed files with 22 additions and 1 deletions

View file

@ -1619,7 +1619,16 @@ func initLimit(v *Value) limit {
lim = lim.unsignedMax(1) lim = lim.unsignedMax(1)
// length operations // length operations
case OpStringLen, OpSliceLen, OpSliceCap: case OpSliceLen, OpSliceCap:
f := v.Block.Func
elemSize := uint64(v.Args[0].Type.Elem().Size())
if elemSize > 0 {
heapSize := uint64(1)<<(uint64(f.Config.PtrSize)*8) - 1
maximumElementsFittingInHeap := heapSize / elemSize
lim = lim.unsignedMax(maximumElementsFittingInHeap)
}
fallthrough
case OpStringLen:
lim = lim.signedMin(0) lim = lim.signedMin(0)
} }

View file

@ -2330,6 +2330,18 @@ func issue74473(s []uint) {
} }
} }
func setCapMaxBasedOnElementSize(x []uint64) int {
c := uintptr(cap(x))
max := ^uintptr(0) >> 3
if c > max { // ERROR "Disproved Less"
return 42
}
if c <= max { // ERROR "Proved Leq"
return 1337
}
return 0
}
//go:noinline //go:noinline
func useInt(a int) { func useInt(a int) {
} }