github.com/hlts2/go@v0.0.0-20170904000733-812b34efaed8/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 TestRacePointerSliceCopyRead(t *testing.T) { 148 ch := make(chan bool, 1) 149 a := make([]*int, 10) 150 b := make([]*int, 10) 151 go func() { 152 _ = a[5] 153 ch <- true 154 }() 155 copy(a, b) 156 <-ch 157 } 158 159 func TestNoRacePointerSliceWriteCopy(t *testing.T) { 160 ch := make(chan bool, 1) 161 a := make([]*int, 10) 162 b := make([]*int, 10) 163 go func() { 164 a[5] = new(int) 165 ch <- true 166 }() 167 copy(a[:5], b[:5]) 168 <-ch 169 } 170 171 func TestRacePointerSliceCopyWrite2(t *testing.T) { 172 ch := make(chan bool, 1) 173 a := make([]*int, 10) 174 b := make([]*int, 10) 175 go func() { 176 b[5] = new(int) 177 ch <- true 178 }() 179 copy(a, b) 180 <-ch 181 } 182 183 func TestNoRacePointerSliceCopyRead(t *testing.T) { 184 ch := make(chan bool, 1) 185 a := make([]*int, 10) 186 b := make([]*int, 10) 187 go func() { 188 _ = b[5] 189 ch <- true 190 }() 191 copy(a, b) 192 <-ch 193 } 194 195 func TestNoRaceSliceWriteSlice2(t *testing.T) { 196 ch := make(chan bool, 1) 197 a := make([]float64, 10) 198 go func() { 199 a[2] = 1.0 200 ch <- true 201 }() 202 _ = a[0:5] 203 <-ch 204 } 205 206 func TestRaceSliceWriteSlice(t *testing.T) { 207 ch := make(chan bool, 1) 208 a := make([]float64, 10) 209 go func() { 210 a[2] = 1.0 211 ch <- true 212 }() 213 a = a[5:10] 214 <-ch 215 } 216 217 func TestNoRaceSliceWriteSlice(t *testing.T) { 218 ch := make(chan bool, 1) 219 a := make([]float64, 10) 220 go func() { 221 a[2] = 1.0 222 ch <- true 223 }() 224 _ = a[5:10] 225 <-ch 226 } 227 228 func TestNoRaceSliceLenCap(t *testing.T) { 229 ch := make(chan bool, 1) 230 a := make([]struct{}, 10) 231 go func() { 232 _ = len(a) 233 ch <- true 234 }() 235 _ = cap(a) 236 <-ch 237 } 238 239 func TestNoRaceStructSlicesRangeWrite(t *testing.T) { 240 type Str struct { 241 a []int 242 b []int 243 } 244 ch := make(chan bool, 1) 245 var s Str 246 s.a = make([]int, 10) 247 s.b = make([]int, 10) 248 go func() { 249 for range s.a { 250 } 251 ch <- true 252 }() 253 s.b[5] = 5 254 <-ch 255 } 256 257 func TestRaceSliceDifferent(t *testing.T) { 258 c := make(chan bool, 1) 259 s := make([]int, 10) 260 s2 := s 261 go func() { 262 s[3] = 3 263 c <- true 264 }() 265 // false negative because s2 is PAUTO w/o PHEAP 266 // so we do not instrument it 267 s2[3] = 3 268 <-c 269 } 270 271 func TestRaceSliceRangeWrite(t *testing.T) { 272 c := make(chan bool, 1) 273 s := make([]int, 10) 274 go func() { 275 s[3] = 3 276 c <- true 277 }() 278 for _, v := range s { 279 _ = v 280 } 281 <-c 282 } 283 284 func TestNoRaceSliceRangeWrite(t *testing.T) { 285 c := make(chan bool, 1) 286 s := make([]int, 10) 287 go func() { 288 s[3] = 3 289 c <- true 290 }() 291 for range s { 292 } 293 <-c 294 } 295 296 func TestRaceSliceRangeAppend(t *testing.T) { 297 c := make(chan bool, 1) 298 s := make([]int, 10) 299 go func() { 300 s = append(s, 3) 301 c <- true 302 }() 303 for range s { 304 } 305 <-c 306 } 307 308 func TestNoRaceSliceRangeAppend(t *testing.T) { 309 c := make(chan bool, 1) 310 s := make([]int, 10) 311 go func() { 312 _ = append(s, 3) 313 c <- true 314 }() 315 for range s { 316 } 317 <-c 318 } 319 320 func TestRaceSliceVarWrite(t *testing.T) { 321 c := make(chan bool, 1) 322 s := make([]int, 10) 323 go func() { 324 s[3] = 3 325 c <- true 326 }() 327 s = make([]int, 20) 328 <-c 329 } 330 331 func TestRaceSliceVarRead(t *testing.T) { 332 c := make(chan bool, 1) 333 s := make([]int, 10) 334 go func() { 335 _ = s[3] 336 c <- true 337 }() 338 s = make([]int, 20) 339 <-c 340 } 341 342 func TestRaceSliceVarRange(t *testing.T) { 343 c := make(chan bool, 1) 344 s := make([]int, 10) 345 go func() { 346 for range s { 347 } 348 c <- true 349 }() 350 s = make([]int, 20) 351 <-c 352 } 353 354 func TestRaceSliceVarAppend(t *testing.T) { 355 c := make(chan bool, 1) 356 s := make([]int, 10) 357 go func() { 358 _ = append(s, 10) 359 c <- true 360 }() 361 s = make([]int, 20) 362 <-c 363 } 364 365 func TestRaceSliceVarCopy(t *testing.T) { 366 c := make(chan bool, 1) 367 s := make([]int, 10) 368 go func() { 369 s2 := make([]int, 10) 370 copy(s, s2) 371 c <- true 372 }() 373 s = make([]int, 20) 374 <-c 375 } 376 377 func TestRaceSliceVarCopy2(t *testing.T) { 378 c := make(chan bool, 1) 379 s := make([]int, 10) 380 go func() { 381 s2 := make([]int, 10) 382 copy(s2, s) 383 c <- true 384 }() 385 s = make([]int, 20) 386 <-c 387 } 388 389 func TestRaceSliceAppend(t *testing.T) { 390 c := make(chan bool, 1) 391 s := make([]int, 10, 20) 392 go func() { 393 _ = append(s, 1) 394 c <- true 395 }() 396 _ = append(s, 2) 397 <-c 398 } 399 400 func TestRaceSliceAppendWrite(t *testing.T) { 401 c := make(chan bool, 1) 402 s := make([]int, 10) 403 go func() { 404 _ = append(s, 1) 405 c <- true 406 }() 407 s[0] = 42 408 <-c 409 } 410 411 func TestRaceSliceAppendSlice(t *testing.T) { 412 c := make(chan bool, 1) 413 s := make([]int, 10) 414 go func() { 415 s2 := make([]int, 10) 416 _ = append(s, s2...) 417 c <- true 418 }() 419 s[0] = 42 420 <-c 421 } 422 423 func TestRaceSliceAppendSlice2(t *testing.T) { 424 c := make(chan bool, 1) 425 s := make([]int, 10) 426 s2foobar := make([]int, 10) 427 go func() { 428 _ = append(s, s2foobar...) 429 c <- true 430 }() 431 s2foobar[5] = 42 432 <-c 433 } 434 435 func TestRaceSliceAppendString(t *testing.T) { 436 c := make(chan bool, 1) 437 s := make([]byte, 10) 438 go func() { 439 _ = append(s, "qwerty"...) 440 c <- true 441 }() 442 s[0] = 42 443 <-c 444 } 445 446 func TestRacePointerSliceAppend(t *testing.T) { 447 c := make(chan bool, 1) 448 s := make([]*int, 10, 20) 449 go func() { 450 _ = append(s, new(int)) 451 c <- true 452 }() 453 _ = append(s, new(int)) 454 <-c 455 } 456 457 func TestRacePointerSliceAppendWrite(t *testing.T) { 458 c := make(chan bool, 1) 459 s := make([]*int, 10) 460 go func() { 461 _ = append(s, new(int)) 462 c <- true 463 }() 464 s[0] = new(int) 465 <-c 466 } 467 468 func TestRacePointerSliceAppendSlice(t *testing.T) { 469 c := make(chan bool, 1) 470 s := make([]*int, 10) 471 go func() { 472 s2 := make([]*int, 10) 473 _ = append(s, s2...) 474 c <- true 475 }() 476 s[0] = new(int) 477 <-c 478 } 479 480 func TestRacePointerSliceAppendSlice2(t *testing.T) { 481 c := make(chan bool, 1) 482 s := make([]*int, 10) 483 s2foobar := make([]*int, 10) 484 go func() { 485 _ = append(s, s2foobar...) 486 c <- true 487 }() 488 println("WRITE:", &s2foobar[5]) 489 s2foobar[5] = nil 490 <-c 491 } 492 493 func TestNoRaceSliceIndexAccess(t *testing.T) { 494 c := make(chan bool, 1) 495 s := make([]int, 10) 496 v := 0 497 go func() { 498 _ = v 499 c <- true 500 }() 501 s[v] = 1 502 <-c 503 } 504 505 func TestNoRaceSliceIndexAccess2(t *testing.T) { 506 c := make(chan bool, 1) 507 s := make([]int, 10) 508 v := 0 509 go func() { 510 _ = v 511 c <- true 512 }() 513 _ = s[v] 514 <-c 515 } 516 517 func TestRaceSliceIndexAccess(t *testing.T) { 518 c := make(chan bool, 1) 519 s := make([]int, 10) 520 v := 0 521 go func() { 522 v = 1 523 c <- true 524 }() 525 s[v] = 1 526 <-c 527 } 528 529 func TestRaceSliceIndexAccess2(t *testing.T) { 530 c := make(chan bool, 1) 531 s := make([]int, 10) 532 v := 0 533 go func() { 534 v = 1 535 c <- true 536 }() 537 _ = s[v] 538 <-c 539 } 540 541 func TestRaceSliceByteToString(t *testing.T) { 542 c := make(chan string) 543 s := make([]byte, 10) 544 go func() { 545 c <- string(s) 546 }() 547 s[0] = 42 548 <-c 549 } 550 551 func TestRaceSliceRuneToString(t *testing.T) { 552 c := make(chan string) 553 s := make([]rune, 10) 554 go func() { 555 c <- string(s) 556 }() 557 s[9] = 42 558 <-c 559 } 560 561 func TestRaceConcatString(t *testing.T) { 562 s := "hello" 563 c := make(chan string, 1) 564 go func() { 565 c <- s + " world" 566 }() 567 s = "world" 568 <-c 569 } 570 571 func TestRaceCompareString(t *testing.T) { 572 s1 := "hello" 573 s2 := "world" 574 c := make(chan bool, 1) 575 go func() { 576 c <- s1 == s2 577 }() 578 s1 = s2 579 <-c 580 } 581 582 func TestRaceSlice3(t *testing.T) { 583 done := make(chan bool) 584 x := make([]int, 10) 585 i := 2 586 go func() { 587 i = 3 588 done <- true 589 }() 590 _ = x[:1:i] 591 <-done 592 }