github.com/roboticscm/goman@v0.0.0-20210203095141-87c07b4a0a55/src/runtime/race/testdata/slice_test.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package race_test 6 7 import ( 8 "testing" 9 ) 10 11 func TestRaceSliceRW(t *testing.T) { 12 ch := make(chan bool, 1) 13 a := make([]int, 2) 14 go func() { 15 a[1] = 1 16 ch <- true 17 }() 18 _ = a[1] 19 <-ch 20 } 21 22 func TestNoRaceSliceRW(t *testing.T) { 23 ch := make(chan bool, 1) 24 a := make([]int, 2) 25 go func() { 26 a[0] = 1 27 ch <- true 28 }() 29 _ = a[1] 30 <-ch 31 } 32 33 func TestRaceSliceWW(t *testing.T) { 34 a := make([]int, 10) 35 ch := make(chan bool, 1) 36 go func() { 37 a[1] = 1 38 ch <- true 39 }() 40 a[1] = 2 41 <-ch 42 } 43 44 func TestNoRaceArrayWW(t *testing.T) { 45 var a [5]int 46 ch := make(chan bool, 1) 47 go func() { 48 a[0] = 1 49 ch <- true 50 }() 51 a[1] = 2 52 <-ch 53 } 54 55 func TestRaceArrayWW(t *testing.T) { 56 var a [5]int 57 ch := make(chan bool, 1) 58 go func() { 59 a[1] = 1 60 ch <- true 61 }() 62 a[1] = 2 63 <-ch 64 } 65 66 func TestNoRaceSliceWriteLen(t *testing.T) { 67 ch := make(chan bool, 1) 68 a := make([]bool, 1) 69 go func() { 70 a[0] = true 71 ch <- true 72 }() 73 _ = len(a) 74 <-ch 75 } 76 77 func TestNoRaceSliceWriteCap(t *testing.T) { 78 ch := make(chan bool, 1) 79 a := make([]uint64, 100) 80 go func() { 81 a[50] = 123 82 ch <- true 83 }() 84 _ = cap(a) 85 <-ch 86 } 87 88 func TestRaceSliceCopyRead(t *testing.T) { 89 ch := make(chan bool, 1) 90 a := make([]int, 10) 91 b := make([]int, 10) 92 go func() { 93 _ = a[5] 94 ch <- true 95 }() 96 copy(a, b) 97 <-ch 98 } 99 100 func TestNoRaceSliceWriteCopy(t *testing.T) { 101 ch := make(chan bool, 1) 102 a := make([]int, 10) 103 b := make([]int, 10) 104 go func() { 105 a[5] = 1 106 ch <- true 107 }() 108 copy(a[:5], b[:5]) 109 <-ch 110 } 111 112 func TestRaceSliceCopyWrite2(t *testing.T) { 113 ch := make(chan bool, 1) 114 a := make([]int, 10) 115 b := make([]int, 10) 116 go func() { 117 b[5] = 1 118 ch <- true 119 }() 120 copy(a, b) 121 <-ch 122 } 123 124 func TestRaceSliceCopyWrite3(t *testing.T) { 125 ch := make(chan bool, 1) 126 a := make([]byte, 10) 127 go func() { 128 a[7] = 1 129 ch <- true 130 }() 131 copy(a, "qwertyqwerty") 132 <-ch 133 } 134 135 func TestNoRaceSliceCopyRead(t *testing.T) { 136 ch := make(chan bool, 1) 137 a := make([]int, 10) 138 b := make([]int, 10) 139 go func() { 140 _ = b[5] 141 ch <- true 142 }() 143 copy(a, b) 144 <-ch 145 } 146 147 func TestNoRaceSliceWriteSlice2(t *testing.T) { 148 ch := make(chan bool, 1) 149 a := make([]float64, 10) 150 go func() { 151 a[2] = 1.0 152 ch <- true 153 }() 154 _ = a[0:5] 155 <-ch 156 } 157 158 func TestRaceSliceWriteSlice(t *testing.T) { 159 ch := make(chan bool, 1) 160 a := make([]float64, 10) 161 go func() { 162 a[2] = 1.0 163 ch <- true 164 }() 165 a = a[5:10] 166 <-ch 167 } 168 169 func TestNoRaceSliceWriteSlice(t *testing.T) { 170 ch := make(chan bool, 1) 171 a := make([]float64, 10) 172 go func() { 173 a[2] = 1.0 174 ch <- true 175 }() 176 _ = a[5:10] 177 <-ch 178 } 179 180 func TestNoRaceSliceLenCap(t *testing.T) { 181 ch := make(chan bool, 1) 182 a := make([]struct{}, 10) 183 go func() { 184 _ = len(a) 185 ch <- true 186 }() 187 _ = cap(a) 188 <-ch 189 } 190 191 func TestNoRaceStructSlicesRangeWrite(t *testing.T) { 192 type Str struct { 193 a []int 194 b []int 195 } 196 ch := make(chan bool, 1) 197 var s Str 198 s.a = make([]int, 10) 199 s.b = make([]int, 10) 200 go func() { 201 for range s.a { 202 } 203 ch <- true 204 }() 205 s.b[5] = 5 206 <-ch 207 } 208 209 func TestRaceSliceDifferent(t *testing.T) { 210 c := make(chan bool, 1) 211 s := make([]int, 10) 212 s2 := s 213 go func() { 214 s[3] = 3 215 c <- true 216 }() 217 // false negative because s2 is PAUTO w/o PHEAP 218 // so we do not instrument it 219 s2[3] = 3 220 <-c 221 } 222 223 func TestRaceSliceRangeWrite(t *testing.T) { 224 c := make(chan bool, 1) 225 s := make([]int, 10) 226 go func() { 227 s[3] = 3 228 c <- true 229 }() 230 for _, v := range s { 231 _ = v 232 } 233 <-c 234 } 235 236 func TestNoRaceSliceRangeWrite(t *testing.T) { 237 c := make(chan bool, 1) 238 s := make([]int, 10) 239 go func() { 240 s[3] = 3 241 c <- true 242 }() 243 for range s { 244 } 245 <-c 246 } 247 248 func TestRaceSliceRangeAppend(t *testing.T) { 249 c := make(chan bool, 1) 250 s := make([]int, 10) 251 go func() { 252 s = append(s, 3) 253 c <- true 254 }() 255 for range s { 256 } 257 <-c 258 } 259 260 func TestNoRaceSliceRangeAppend(t *testing.T) { 261 c := make(chan bool, 1) 262 s := make([]int, 10) 263 go func() { 264 _ = append(s, 3) 265 c <- true 266 }() 267 for range s { 268 } 269 <-c 270 } 271 272 func TestRaceSliceVarWrite(t *testing.T) { 273 c := make(chan bool, 1) 274 s := make([]int, 10) 275 go func() { 276 s[3] = 3 277 c <- true 278 }() 279 s = make([]int, 20) 280 <-c 281 } 282 283 func TestRaceSliceVarRead(t *testing.T) { 284 c := make(chan bool, 1) 285 s := make([]int, 10) 286 go func() { 287 _ = s[3] 288 c <- true 289 }() 290 s = make([]int, 20) 291 <-c 292 } 293 294 func TestRaceSliceVarRange(t *testing.T) { 295 c := make(chan bool, 1) 296 s := make([]int, 10) 297 go func() { 298 for range s { 299 } 300 c <- true 301 }() 302 s = make([]int, 20) 303 <-c 304 } 305 306 func TestRaceSliceVarAppend(t *testing.T) { 307 c := make(chan bool, 1) 308 s := make([]int, 10) 309 go func() { 310 _ = append(s, 10) 311 c <- true 312 }() 313 s = make([]int, 20) 314 <-c 315 } 316 317 func TestRaceSliceVarCopy(t *testing.T) { 318 c := make(chan bool, 1) 319 s := make([]int, 10) 320 go func() { 321 s2 := make([]int, 10) 322 copy(s, s2) 323 c <- true 324 }() 325 s = make([]int, 20) 326 <-c 327 } 328 329 func TestRaceSliceVarCopy2(t *testing.T) { 330 c := make(chan bool, 1) 331 s := make([]int, 10) 332 go func() { 333 s2 := make([]int, 10) 334 copy(s2, s) 335 c <- true 336 }() 337 s = make([]int, 20) 338 <-c 339 } 340 341 func TestRaceSliceAppend(t *testing.T) { 342 c := make(chan bool, 1) 343 s := make([]int, 10, 20) 344 go func() { 345 _ = append(s, 1) 346 c <- true 347 }() 348 _ = append(s, 2) 349 <-c 350 } 351 352 func TestRaceSliceAppendWrite(t *testing.T) { 353 c := make(chan bool, 1) 354 s := make([]int, 10) 355 go func() { 356 _ = append(s, 1) 357 c <- true 358 }() 359 s[0] = 42 360 <-c 361 } 362 363 func TestRaceSliceAppendSlice(t *testing.T) { 364 c := make(chan bool, 1) 365 s := make([]int, 10) 366 go func() { 367 s2 := make([]int, 10) 368 _ = append(s, s2...) 369 c <- true 370 }() 371 s[0] = 42 372 <-c 373 } 374 375 func TestRaceSliceAppendSlice2(t *testing.T) { 376 c := make(chan bool, 1) 377 s := make([]int, 10) 378 s2foobar := make([]int, 10) 379 go func() { 380 _ = append(s, s2foobar...) 381 c <- true 382 }() 383 s2foobar[5] = 42 384 <-c 385 } 386 387 func TestRaceSliceAppendString(t *testing.T) { 388 c := make(chan bool, 1) 389 s := make([]byte, 10) 390 go func() { 391 _ = append(s, "qwerty"...) 392 c <- true 393 }() 394 s[0] = 42 395 <-c 396 } 397 398 func TestNoRaceSliceIndexAccess(t *testing.T) { 399 c := make(chan bool, 1) 400 s := make([]int, 10) 401 v := 0 402 go func() { 403 _ = v 404 c <- true 405 }() 406 s[v] = 1 407 <-c 408 } 409 410 func TestNoRaceSliceIndexAccess2(t *testing.T) { 411 c := make(chan bool, 1) 412 s := make([]int, 10) 413 v := 0 414 go func() { 415 _ = v 416 c <- true 417 }() 418 _ = s[v] 419 <-c 420 } 421 422 func TestRaceSliceIndexAccess(t *testing.T) { 423 c := make(chan bool, 1) 424 s := make([]int, 10) 425 v := 0 426 go func() { 427 v = 1 428 c <- true 429 }() 430 s[v] = 1 431 <-c 432 } 433 434 func TestRaceSliceIndexAccess2(t *testing.T) { 435 c := make(chan bool, 1) 436 s := make([]int, 10) 437 v := 0 438 go func() { 439 v = 1 440 c <- true 441 }() 442 _ = s[v] 443 <-c 444 } 445 446 func TestRaceSliceByteToString(t *testing.T) { 447 c := make(chan string) 448 s := make([]byte, 10) 449 go func() { 450 c <- string(s) 451 }() 452 s[0] = 42 453 <-c 454 } 455 456 func TestRaceSliceRuneToString(t *testing.T) { 457 c := make(chan string) 458 s := make([]rune, 10) 459 go func() { 460 c <- string(s) 461 }() 462 s[9] = 42 463 <-c 464 } 465 466 func TestRaceConcatString(t *testing.T) { 467 s := "hello" 468 c := make(chan string, 1) 469 go func() { 470 c <- s + " world" 471 }() 472 s = "world" 473 <-c 474 } 475 476 func TestRaceCompareString(t *testing.T) { 477 s1 := "hello" 478 s2 := "world" 479 c := make(chan bool, 1) 480 go func() { 481 c <- s1 == s2 482 }() 483 s1 = s2 484 <-c 485 }