Update to go1.24.1
This commit is contained in:
50
test/fixedbugs/issue71932.go
Normal file
50
test/fixedbugs/issue71932.go
Normal file
@@ -0,0 +1,50 @@
|
||||
// run
|
||||
|
||||
// Copyright 2025 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package main
|
||||
|
||||
import "runtime"
|
||||
|
||||
const C = 16
|
||||
|
||||
type T [C * C]byte
|
||||
|
||||
func main() {
|
||||
var ts []*T
|
||||
|
||||
for i := 0; i < 100; i++ {
|
||||
t := new(T)
|
||||
// Save every even object.
|
||||
if i%2 == 0 {
|
||||
ts = append(ts, t)
|
||||
}
|
||||
}
|
||||
// Make sure the odd objects are collected.
|
||||
runtime.GC()
|
||||
|
||||
for _, t := range ts {
|
||||
f(t, C, C)
|
||||
}
|
||||
}
|
||||
|
||||
//go:noinline
|
||||
func f(t *T, i, j uint) {
|
||||
if i == 0 || i > C || j == 0 || j > C {
|
||||
return // gets rid of bounds check below (via prove pass)
|
||||
}
|
||||
p := &t[i*j-1]
|
||||
*p = 0
|
||||
runtime.GC()
|
||||
*p = 0
|
||||
|
||||
// This goes badly if compiled to
|
||||
// q := &t[i*j]
|
||||
// *(q-1) = 0
|
||||
// runtime.GC()
|
||||
// *(q-1) = 0
|
||||
// as at the GC call, q is an invalid pointer
|
||||
// (it points past the end of t's allocation).
|
||||
}
|
||||
Reference in New Issue
Block a user