aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/cover/cover_test.go9
-rw-r--r--src/cmd/cover/testdata/align.go11
-rw-r--r--src/cmd/cover/testdata/align_test.go10
-rw-r--r--src/cmd/link/internal/ld/data.go7
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)