| | |
| | |
| | |
| |
|
| | package race_test |
| |
|
| | import ( |
| | "sync" |
| | "testing" |
| | ) |
| |
|
| | func TestRaceSliceRW(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]int, 2) |
| | go func() { |
| | a[1] = 1 |
| | ch <- true |
| | }() |
| | _ = a[1] |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceSliceRW(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]int, 2) |
| | go func() { |
| | a[0] = 1 |
| | ch <- true |
| | }() |
| | _ = a[1] |
| | <-ch |
| | } |
| |
|
| | func TestRaceSliceWW(t *testing.T) { |
| | a := make([]int, 10) |
| | ch := make(chan bool, 1) |
| | go func() { |
| | a[1] = 1 |
| | ch <- true |
| | }() |
| | a[1] = 2 |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceArrayWW(t *testing.T) { |
| | var a [5]int |
| | ch := make(chan bool, 1) |
| | go func() { |
| | a[0] = 1 |
| | ch <- true |
| | }() |
| | a[1] = 2 |
| | <-ch |
| | } |
| |
|
| | func TestRaceArrayWW(t *testing.T) { |
| | var a [5]int |
| | ch := make(chan bool, 1) |
| | go func() { |
| | a[1] = 1 |
| | ch <- true |
| | }() |
| | a[1] = 2 |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceSliceWriteLen(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]bool, 1) |
| | go func() { |
| | a[0] = true |
| | ch <- true |
| | }() |
| | _ = len(a) |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceSliceWriteCap(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]uint64, 100) |
| | go func() { |
| | a[50] = 123 |
| | ch <- true |
| | }() |
| | _ = cap(a) |
| | <-ch |
| | } |
| |
|
| | func TestRaceSliceCopyRead(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]int, 10) |
| | b := make([]int, 10) |
| | go func() { |
| | _ = a[5] |
| | ch <- true |
| | }() |
| | copy(a, b) |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceSliceWriteCopy(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]int, 10) |
| | b := make([]int, 10) |
| | go func() { |
| | a[5] = 1 |
| | ch <- true |
| | }() |
| | copy(a[:5], b[:5]) |
| | <-ch |
| | } |
| |
|
| | func TestRaceSliceCopyWrite2(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]int, 10) |
| | b := make([]int, 10) |
| | go func() { |
| | b[5] = 1 |
| | ch <- true |
| | }() |
| | copy(a, b) |
| | <-ch |
| | } |
| |
|
| | func TestRaceSliceCopyWrite3(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]byte, 10) |
| | go func() { |
| | a[7] = 1 |
| | ch <- true |
| | }() |
| | copy(a, "qwertyqwerty") |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceSliceCopyRead(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]int, 10) |
| | b := make([]int, 10) |
| | go func() { |
| | _ = b[5] |
| | ch <- true |
| | }() |
| | copy(a, b) |
| | <-ch |
| | } |
| |
|
| | func TestRacePointerSliceCopyRead(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]*int, 10) |
| | b := make([]*int, 10) |
| | go func() { |
| | _ = a[5] |
| | ch <- true |
| | }() |
| | copy(a, b) |
| | <-ch |
| | } |
| |
|
| | func TestNoRacePointerSliceWriteCopy(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]*int, 10) |
| | b := make([]*int, 10) |
| | go func() { |
| | a[5] = new(int) |
| | ch <- true |
| | }() |
| | copy(a[:5], b[:5]) |
| | <-ch |
| | } |
| |
|
| | func TestRacePointerSliceCopyWrite2(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]*int, 10) |
| | b := make([]*int, 10) |
| | go func() { |
| | b[5] = new(int) |
| | ch <- true |
| | }() |
| | copy(a, b) |
| | <-ch |
| | } |
| |
|
| | func TestNoRacePointerSliceCopyRead(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]*int, 10) |
| | b := make([]*int, 10) |
| | go func() { |
| | _ = b[5] |
| | ch <- true |
| | }() |
| | copy(a, b) |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceSliceWriteSlice2(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]float64, 10) |
| | go func() { |
| | a[2] = 1.0 |
| | ch <- true |
| | }() |
| | _ = a[0:5] |
| | <-ch |
| | } |
| |
|
| | func TestRaceSliceWriteSlice(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]float64, 10) |
| | go func() { |
| | a[2] = 1.0 |
| | ch <- true |
| | }() |
| | a = a[5:10] |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceSliceWriteSlice(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]float64, 10) |
| | go func() { |
| | a[2] = 1.0 |
| | ch <- true |
| | }() |
| | _ = a[5:10] |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceSliceLenCap(t *testing.T) { |
| | ch := make(chan bool, 1) |
| | a := make([]struct{}, 10) |
| | go func() { |
| | _ = len(a) |
| | ch <- true |
| | }() |
| | _ = cap(a) |
| | <-ch |
| | } |
| |
|
| | func TestNoRaceStructSlicesRangeWrite(t *testing.T) { |
| | type Str struct { |
| | a []int |
| | b []int |
| | } |
| | ch := make(chan bool, 1) |
| | var s Str |
| | s.a = make([]int, 10) |
| | s.b = make([]int, 10) |
| | go func() { |
| | for range s.a { |
| | } |
| | ch <- true |
| | }() |
| | s.b[5] = 5 |
| | <-ch |
| | } |
| |
|
| | func TestRaceSliceDifferent(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | s2 := s |
| | go func() { |
| | s[3] = 3 |
| | c <- true |
| | }() |
| | |
| | |
| | s2[3] = 3 |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceRangeWrite(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | s[3] = 3 |
| | c <- true |
| | }() |
| | for _, v := range s { |
| | _ = v |
| | } |
| | <-c |
| | } |
| |
|
| | func TestNoRaceSliceRangeWrite(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | s[3] = 3 |
| | c <- true |
| | }() |
| | for range s { |
| | } |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceRangeAppend(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | s = append(s, 3) |
| | c <- true |
| | }() |
| | for range s { |
| | } |
| | <-c |
| | } |
| |
|
| | func TestNoRaceSliceRangeAppend(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | _ = append(s, 3) |
| | c <- true |
| | }() |
| | for range s { |
| | } |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceVarWrite(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | s[3] = 3 |
| | c <- true |
| | }() |
| | s = make([]int, 20) |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceVarRead(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | _ = s[3] |
| | c <- true |
| | }() |
| | s = make([]int, 20) |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceVarRange(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | for range s { |
| | } |
| | c <- true |
| | }() |
| | s = make([]int, 20) |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceVarAppend(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | _ = append(s, 10) |
| | c <- true |
| | }() |
| | s = make([]int, 20) |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceVarCopy(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | s2 := make([]int, 10) |
| | copy(s, s2) |
| | c <- true |
| | }() |
| | s = make([]int, 20) |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceVarCopy2(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | s2 := make([]int, 10) |
| | copy(s2, s) |
| | c <- true |
| | }() |
| | s = make([]int, 20) |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceAppend(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10, 20) |
| | go func() { |
| | _ = append(s, 1) |
| | c <- true |
| | }() |
| | _ = append(s, 2) |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceAppendWrite(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | _ = append(s, 1) |
| | c <- true |
| | }() |
| | s[0] = 42 |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceAppendSlice(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | go func() { |
| | s2 := make([]int, 10) |
| | _ = append(s, s2...) |
| | c <- true |
| | }() |
| | s[0] = 42 |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceAppendSlice2(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | s2foobar := make([]int, 10) |
| | go func() { |
| | _ = append(s, s2foobar...) |
| | c <- true |
| | }() |
| | s2foobar[5] = 42 |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceAppendString(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]byte, 10) |
| | go func() { |
| | _ = append(s, "qwerty"...) |
| | c <- true |
| | }() |
| | s[0] = 42 |
| | <-c |
| | } |
| |
|
| | func TestRacePointerSliceAppend(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]*int, 10, 20) |
| | go func() { |
| | _ = append(s, new(int)) |
| | c <- true |
| | }() |
| | _ = append(s, new(int)) |
| | <-c |
| | } |
| |
|
| | func TestRacePointerSliceAppendWrite(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]*int, 10) |
| | go func() { |
| | _ = append(s, new(int)) |
| | c <- true |
| | }() |
| | s[0] = new(int) |
| | <-c |
| | } |
| |
|
| | func TestRacePointerSliceAppendSlice(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]*int, 10) |
| | go func() { |
| | s2 := make([]*int, 10) |
| | _ = append(s, s2...) |
| | c <- true |
| | }() |
| | s[0] = new(int) |
| | <-c |
| | } |
| |
|
| | func TestRacePointerSliceAppendSlice2(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]*int, 10) |
| | s2foobar := make([]*int, 10) |
| | go func() { |
| | _ = append(s, s2foobar...) |
| | c <- true |
| | }() |
| | println("WRITE:", &s2foobar[5]) |
| | s2foobar[5] = nil |
| | <-c |
| | } |
| |
|
| | func TestNoRaceSliceIndexAccess(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | v := 0 |
| | go func() { |
| | _ = v |
| | c <- true |
| | }() |
| | s[v] = 1 |
| | <-c |
| | } |
| |
|
| | func TestNoRaceSliceIndexAccess2(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | v := 0 |
| | go func() { |
| | _ = v |
| | c <- true |
| | }() |
| | _ = s[v] |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceIndexAccess(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | v := 0 |
| | go func() { |
| | v = 1 |
| | c <- true |
| | }() |
| | s[v] = 1 |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceIndexAccess2(t *testing.T) { |
| | c := make(chan bool, 1) |
| | s := make([]int, 10) |
| | v := 0 |
| | go func() { |
| | v = 1 |
| | c <- true |
| | }() |
| | _ = s[v] |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceByteToString(t *testing.T) { |
| | c := make(chan string) |
| | s := make([]byte, 10) |
| | go func() { |
| | c <- string(s) |
| | }() |
| | s[0] = 42 |
| | <-c |
| | } |
| |
|
| | func TestRaceSliceRuneToString(t *testing.T) { |
| | c := make(chan string) |
| | s := make([]rune, 10) |
| | go func() { |
| | c <- string(s) |
| | }() |
| | s[9] = 42 |
| | <-c |
| | } |
| |
|
| | func TestRaceConcatString(t *testing.T) { |
| | s := "hello" |
| | c := make(chan string, 1) |
| | go func() { |
| | c <- s + " world" |
| | }() |
| | s = "world" |
| | <-c |
| | } |
| |
|
| | func TestRaceCompareString(t *testing.T) { |
| | s1 := "hello" |
| | s2 := "world" |
| | c := make(chan bool, 1) |
| | go func() { |
| | c <- s1 == s2 |
| | }() |
| | s1 = s2 |
| | <-c |
| | } |
| |
|
| | func TestRaceSlice3(t *testing.T) { |
| | done := make(chan bool) |
| | x := make([]int, 10) |
| | i := 2 |
| | go func() { |
| | i = 3 |
| | done <- true |
| | }() |
| | _ = x[:1:i] |
| | <-done |
| | } |
| |
|
| | var saved string |
| |
|
| | func TestRaceSlice4(t *testing.T) { |
| | |
| | data := []byte("hello there") |
| | var wg sync.WaitGroup |
| | wg.Add(1) |
| | go func() { |
| | _ = string(data) |
| | wg.Done() |
| | }() |
| | copy(data, data[2:]) |
| | wg.Wait() |
| | } |
| |
|