mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-01-04 02:38:50 +00:00
a6af044c3f
The problem is that atomicNilMessage.m.mi is accessed both by atomic and non-atomic operations. (Init uses an atomic read to verify that m.mi is non-nil, but then returns a non-atomic m.) Race condition is demonstrated by this test with "go test -race -count=1000": func TestPointer(t *testing.T) { var m atomicNilMessage var mi MessageInfo ch := make(chan *MessageInfo) for i := 0; i < 20; i++ { go func() { r := m.Init(&mi) if &mi != r.mi { // This conditional exists just // ensure r.mi is touched. t.Error("mismatch") } ch <- r.mi }() } for i := 0; i < 20; i++ { <-ch } } I chose not to add the test since it seems a bit overfit to the specific situation. Change-Id: Id4664ef3cd5b29515ed310851b9aeb7561be30d0 Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/188337 Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com> |
||
---|---|---|
.. | ||
cmd | ||
descfmt | ||
descopts | ||
detrand | ||
encoding | ||
errors | ||
fieldnum | ||
filedesc | ||
filetype | ||
flags | ||
impl | ||
mapsort | ||
pragma | ||
set | ||
strs | ||
testprotos | ||
value |