blob: 8f82dad4b5928153de86e6483ac2c21f7ae51a7b [file] [log] [blame] [edit]
// 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.
//go:build goexperiment.runtimesecret && (arm64 || amd64) && linux
package secret_test
import (
"runtime"
"runtime/secret"
"testing"
)
func TestInterleavedAllocFrees(t *testing.T) {
// Interleave heap objects that are kept alive beyond secret.Do
// with heap objects that do not live past secret.Do.
// The intent is for the clearing of one object (with the wrong size)
// to clobber the type header of the next slot. If the GC sees a nil type header
// when it expects to find one, it can throw.
type T struct {
p *int
x [1024]byte
}
for range 10 {
var s []*T
secret.Do(func() {
for i := range 100 {
t := &T{}
if i%2 == 0 {
s = append(s, t)
}
}
})
runtime.GC()
runtime.GC()
runtime.KeepAlive(s)
}
}