Keith Randall would like Cherry Mui to review this change.
cmd/link: align covctrs symbol
If we start the covctrs 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.
Fixes #58936
diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go
index 431c056..a5e5bdd 100644
--- a/src/cmd/cover/cover_test.go
+++ b/src/cmd/cover/cover_test.go
@@ -638,3 +638,12 @@
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 0000000..2e8a453
--- /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 0000000..e908c5a
--- /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 5b6dabb..a1d36ae 100644
--- a/src/cmd/link/internal/ld/data.go
+++ b/src/cmd/link/internal/ld/data.go
@@ -2049,6 +2049,13 @@
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)
| Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
| Code-Review | +2 |
covCounterDataStartOff += covCounterDataLen % 4Perhaps use `Rnd` helper function, and just combine to line 2046. (Rnd takes int64. Conversion back and forth seems unfortunate. Maybe we can make Rnd generic now.)
| Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
covCounterDataStartOff += covCounterDataLen % 4Perhaps use `Rnd` helper function, and just combine to line 2046. (Rnd takes int64. Conversion back and forth seems unfortunate. Maybe we can make Rnd generic now.)
I worry a bit about the common case when there are no cover counters.
Then we're potentially rounding up covctrs/ecovctrs past the end of the section?
The CL as is at least does nothing if there are no cover counters.
| Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
covCounterDataStartOff += covCounterDataLen % 4Keith RandallPerhaps use `Rnd` helper function, and just combine to line 2046. (Rnd takes int64. Conversion back and forth seems unfortunate. Maybe we can make Rnd generic now.)
I worry a bit about the common case when there are no cover counters.
Then we're potentially rounding up covctrs/ecovctrs past the end of the section?The CL as is at least does nothing if there are no cover counters.
Acknowledged
| Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
| Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
cmd/link: align covctrs symbol
If we start the covctrs 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.
Fixes #58936
| Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |