diff options
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/cover/cover_test.go | 9 | ||||
| -rw-r--r-- | src/cmd/cover/testdata/align.go | 11 | ||||
| -rw-r--r-- | src/cmd/cover/testdata/align_test.go | 10 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/data.go | 7 |
4 files changed, 37 insertions, 0 deletions
diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index a1149e9e6e..a19e0d0924 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -638,3 +638,12 @@ func main() { t.Errorf("unexpected success; want failure due to newline in file path") } } + +func TestAlignment(t *testing.T) { + // Test that cover data structures are aligned appropriately. See issue 58936. + testenv.MustHaveGoRun(t) + t.Parallel() + + cmd := testenv.Command(t, testenv.GoToolPath(t), "test", "-cover", filepath.Join(testdata, "align.go"), filepath.Join(testdata, "align_test.go")) + run(cmd, t) +} diff --git a/src/cmd/cover/testdata/align.go b/src/cmd/cover/testdata/align.go new file mode 100644 index 0000000000..2e8a45345d --- /dev/null +++ b/src/cmd/cover/testdata/align.go @@ -0,0 +1,11 @@ +// Copyright 2026 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 p + +var badSlice [8265]byte + +func init() { + badSlice[0] = 4 +} diff --git a/src/cmd/cover/testdata/align_test.go b/src/cmd/cover/testdata/align_test.go new file mode 100644 index 0000000000..e908c5a1cb --- /dev/null +++ b/src/cmd/cover/testdata/align_test.go @@ -0,0 +1,10 @@ +// Copyright 2026 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 p + +import "testing" + +func TestFoo(t *testing.T) { +} diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 683df3bb67..a045ff5eea 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -2022,6 +2022,13 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.covctrs", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.ecovctrs", 0), sect) + // If we started this blob at an odd alignment, then covctrs will + // not be correctly aligned. Each individual entry is aligned properly, + // but the start marker may be before any padding inserted to enforce + // that alignment. Fix that here. See issue 58936. + covCounterDataStartOff += covCounterDataLen % 4 + covCounterDataLen -= covCounterDataLen % 4 + // Coverage instrumentation counters for libfuzzer. if len(state.data[sym.SLIBFUZZER_8BIT_COUNTER]) > 0 { sect := state.allocateNamedSectionAndAssignSyms(&Segdata, ".go.fuzzcntrs", sym.SLIBFUZZER_8BIT_COUNTER, sym.Sxxx, 06) |
