Skip to content

Commit 8515d9c

Browse files
committed
runtime: randomize package initialization order in race mode
This is one small step to force people to not depend on the order of initialization of packages which are not explicitly ordered by import directives. Similar to randomizing map iteration order, this makes sure people aren't depending on the behavior of the current release, so that we can change the order in future releases without breaking everyone. Maybe one day we can randomize always, but for now we do it just in race mode. (We would need to measure the impact on startup time before we enabled it always.) RELNOTE=yes Change-Id: I99026394796125974c5f2c3660a88becb92c9df3 Reviewed-on: https://go-review.googlesource.com/c/go/+/170318 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
1 parent fd788a8 commit 8515d9c

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

src/runtime/proc.go

+9
Original file line numberDiff line numberDiff line change
@@ -5209,6 +5209,15 @@ func doInit(t *initTask) {
52095209
throw("recursive call during initialization - linker skew")
52105210
default: // not initialized yet
52115211
t.state = 1 // initialization in progress
5212+
if raceenabled {
5213+
// Randomize initialization order of packages t depends on.
5214+
// TODO: enable always instead of just for race?
5215+
s := *(*[]uintptr)(unsafe.Pointer(&slice{array: add(unsafe.Pointer(t), 3*sys.PtrSize), len: int(t.ndeps), cap: int(t.ndeps)}))
5216+
for i := len(s) - 1; i > 0; i-- {
5217+
j := int(fastrandn(uint32(i + 1)))
5218+
s[i], s[j] = s[j], s[i]
5219+
}
5220+
}
52125221
for i := uintptr(0); i < t.ndeps; i++ {
52135222
p := add(unsafe.Pointer(t), (3+i)*sys.PtrSize)
52145223
t2 := *(**initTask)(p)

0 commit comments

Comments
 (0)