1// Copyright 2011 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
5package race_test
6
7import (
8	"bytes"
9	"crypto/sha1"
10	"errors"
11	"fmt"
12	"io"
13	"os"
14	"runtime"
15	"sync"
16	"testing"
17	"time"
18	"unsafe"
19)
20
21type Point struct {
22	x, y int
23}
24
25type NamedPoint struct {
26	name string
27	p    Point
28}
29
30type DummyWriter struct {
31	state int
32}
33type Writer interface {
34	Write(p []byte) (n int)
35}
36
37func (d DummyWriter) Write(p []byte) (n int) {
38	return 0
39}
40
41var GlobalX, GlobalY int = 0, 0
42var GlobalCh chan int = make(chan int, 2)
43
44func GlobalFunc1() {
45	GlobalY = GlobalX
46	GlobalCh <- 1
47}
48
49func GlobalFunc2() {
50	GlobalX = 1
51	GlobalCh <- 1
52}
53
54func TestRaceIntRWGlobalFuncs(t *testing.T) {
55	go GlobalFunc1()
56	go GlobalFunc2()
57	<-GlobalCh
58	<-GlobalCh
59}
60
61func TestRaceIntRWClosures(t *testing.T) {
62	var x, y int
63	ch := make(chan int, 2)
64
65	go func() {
66		y = x
67		ch <- 1
68	}()
69	go func() {
70		x = 1
71		ch <- 1
72	}()
73	<-ch
74	<-ch
75}
76
77func TestNoRaceIntRWClosures(t *testing.T) {
78	var x, y int
79	ch := make(chan int, 1)
80
81	go func() {
82		y = x
83		ch <- 1
84	}()
85	<-ch
86	go func() {
87		x = 1
88		ch <- 1
89	}()
90	<-ch
91
92}
93
94func TestRaceInt32RWClosures(t *testing.T) {
95	var x, y int32
96	ch := make(chan bool, 2)
97
98	go func() {
99		y = x
100		ch <- true
101	}()
102	go func() {
103		x = 1
104		ch <- true
105	}()
106	<-ch
107	<-ch
108}
109
110func TestNoRaceCase(t *testing.T) {
111	var y int
112	for x := -1; x <= 1; x++ {
113		switch {
114		case x < 0:
115			y = -1
116		case x == 0:
117			y = 0
118		case x > 0:
119			y = 1
120		}
121	}
122	y++
123}
124
125func TestRaceCaseCondition(t *testing.T) {
126	var x int = 0
127	ch := make(chan int, 2)
128
129	go func() {
130		x = 2
131		ch <- 1
132	}()
133	go func() {
134		switch x < 2 {
135		case true:
136			x = 1
137			//case false:
138			//	x = 5
139		}
140		ch <- 1
141	}()
142	<-ch
143	<-ch
144}
145
146func TestRaceCaseCondition2(t *testing.T) {
147	// switch body is rearranged by the compiler so the tests
148	// passes even if we don't instrument '<'
149	var x int = 0
150	ch := make(chan int, 2)
151
152	go func() {
153		x = 2
154		ch <- 1
155	}()
156	go func() {
157		switch x < 2 {
158		case true:
159			x = 1
160		case false:
161			x = 5
162		}
163		ch <- 1
164	}()
165	<-ch
166	<-ch
167}
168
169func TestRaceCaseBody(t *testing.T) {
170	var x, y int
171	ch := make(chan int, 2)
172
173	go func() {
174		y = x
175		ch <- 1
176	}()
177	go func() {
178		switch {
179		default:
180			x = 1
181		case x == 100:
182			x = -x
183		}
184		ch <- 1
185	}()
186	<-ch
187	<-ch
188}
189
190func TestNoRaceCaseFallthrough(t *testing.T) {
191	var x, y, z int
192	ch := make(chan int, 2)
193	z = 1
194
195	go func() {
196		y = x
197		ch <- 1
198	}()
199	go func() {
200		switch {
201		case z == 1:
202		case z == 2:
203			x = 2
204		}
205		ch <- 1
206	}()
207	<-ch
208	<-ch
209}
210
211func TestRaceCaseFallthrough(t *testing.T) {
212	var x, y, z int
213	ch := make(chan int, 2)
214	z = 1
215
216	go func() {
217		y = x
218		ch <- 1
219	}()
220	go func() {
221		switch {
222		case z == 1:
223			fallthrough
224		case z == 2:
225			x = 2
226		}
227		ch <- 1
228	}()
229
230	<-ch
231	<-ch
232}
233
234func TestRaceCaseIssue6418(t *testing.T) {
235	m := map[string]map[string]string{
236		"a": {
237			"b": "c",
238		},
239	}
240	ch := make(chan int)
241	go func() {
242		m["a"]["x"] = "y"
243		ch <- 1
244	}()
245	switch m["a"]["b"] {
246	}
247	<-ch
248}
249
250func TestRaceCaseType(t *testing.T) {
251	var x, y int
252	var i interface{} = x
253	c := make(chan int, 1)
254	go func() {
255		switch i.(type) {
256		case nil:
257		case int:
258		}
259		c <- 1
260	}()
261	i = y
262	<-c
263}
264
265func TestRaceCaseTypeBody(t *testing.T) {
266	var x, y int
267	var i interface{} = &x
268	c := make(chan int, 1)
269	go func() {
270		switch i := i.(type) {
271		case nil:
272		case *int:
273			*i = y
274		}
275		c <- 1
276	}()
277	x = y
278	<-c
279}
280
281func TestRaceCaseTypeIssue5890(t *testing.T) {
282	// spurious extra instrumentation of the initial interface
283	// value.
284	var x, y int
285	m := make(map[int]map[int]interface{})
286	m[0] = make(map[int]interface{})
287	c := make(chan int, 1)
288	go func() {
289		switch i := m[0][1].(type) {
290		case nil:
291		case *int:
292			*i = x
293		}
294		c <- 1
295	}()
296	m[0][1] = y
297	<-c
298}
299
300func TestNoRaceRange(t *testing.T) {
301	ch := make(chan int, 3)
302	a := [...]int{1, 2, 3}
303	for _, v := range a {
304		ch <- v
305	}
306	close(ch)
307}
308
309func TestNoRaceRangeIssue5446(t *testing.T) {
310	ch := make(chan int, 3)
311	a := []int{1, 2, 3}
312	b := []int{4}
313	// used to insert a spurious instrumentation of a[i]
314	// and crash.
315	i := 1
316	for i, a[i] = range b {
317		ch <- i
318	}
319	close(ch)
320}
321
322func TestRaceRange(t *testing.T) {
323	const N = 2
324	var a [N]int
325	var x, y int
326	done := make(chan bool, N)
327	for i, v := range a {
328		go func(i int) {
329			// we don't want a write-vs-write race
330			// so there is no array b here
331			if i == 0 {
332				x = v
333			} else {
334				y = v
335			}
336			done <- true
337		}(i)
338		// Ensure the goroutine runs before we continue the loop.
339		runtime.Gosched()
340	}
341	for i := 0; i < N; i++ {
342		<-done
343	}
344}
345
346func TestRaceForInit(t *testing.T) {
347	c := make(chan int)
348	x := 0
349	go func() {
350		c <- x
351	}()
352	for x = 42; false; {
353	}
354	<-c
355}
356
357func TestNoRaceForInit(t *testing.T) {
358	done := make(chan bool)
359	c := make(chan bool)
360	x := 0
361	go func() {
362		for {
363			_, ok := <-c
364			if !ok {
365				done <- true
366				return
367			}
368			x++
369		}
370	}()
371	i := 0
372	for x = 42; i < 10; i++ {
373		c <- true
374	}
375	close(c)
376	<-done
377}
378
379func TestRaceForTest(t *testing.T) {
380	done := make(chan bool)
381	c := make(chan bool)
382	stop := false
383	go func() {
384		for {
385			_, ok := <-c
386			if !ok {
387				done <- true
388				return
389			}
390			stop = true
391		}
392	}()
393	for !stop {
394		c <- true
395	}
396	close(c)
397	<-done
398}
399
400func TestRaceForIncr(t *testing.T) {
401	done := make(chan bool)
402	c := make(chan bool)
403	x := 0
404	go func() {
405		for {
406			_, ok := <-c
407			if !ok {
408				done <- true
409				return
410			}
411			x++
412		}
413	}()
414	for i := 0; i < 10; x++ {
415		i++
416		c <- true
417	}
418	close(c)
419	<-done
420}
421
422func TestNoRaceForIncr(t *testing.T) {
423	done := make(chan bool)
424	x := 0
425	go func() {
426		x++
427		done <- true
428	}()
429	for i := 0; i < 0; x++ {
430	}
431	<-done
432}
433
434func TestRacePlus(t *testing.T) {
435	var x, y, z int
436	ch := make(chan int, 2)
437
438	go func() {
439		y = x + z
440		ch <- 1
441	}()
442	go func() {
443		y = x + z + z
444		ch <- 1
445	}()
446	<-ch
447	<-ch
448}
449
450func TestRacePlus2(t *testing.T) {
451	var x, y, z int
452	ch := make(chan int, 2)
453
454	go func() {
455		x = 1
456		ch <- 1
457	}()
458	go func() {
459		y = +x + z
460		ch <- 1
461	}()
462	<-ch
463	<-ch
464}
465
466func TestNoRacePlus(t *testing.T) {
467	var x, y, z, f int
468	ch := make(chan int, 2)
469
470	go func() {
471		y = x + z
472		ch <- 1
473	}()
474	go func() {
475		f = z + x
476		ch <- 1
477	}()
478	<-ch
479	<-ch
480}
481
482func TestRaceComplement(t *testing.T) {
483	var x, y, z int
484	ch := make(chan int, 2)
485
486	go func() {
487		x = ^y
488		ch <- 1
489	}()
490	go func() {
491		y = ^z
492		ch <- 1
493	}()
494	<-ch
495	<-ch
496}
497
498func TestRaceDiv(t *testing.T) {
499	var x, y, z int
500	ch := make(chan int, 2)
501
502	go func() {
503		x = y / (z + 1)
504		ch <- 1
505	}()
506	go func() {
507		y = z
508		ch <- 1
509	}()
510	<-ch
511	<-ch
512}
513
514func TestRaceDivConst(t *testing.T) {
515	var x, y, z uint32
516	ch := make(chan int, 2)
517
518	go func() {
519		x = y / 3 // involves only a HMUL node
520		ch <- 1
521	}()
522	go func() {
523		y = z
524		ch <- 1
525	}()
526	<-ch
527	<-ch
528}
529
530func TestRaceMod(t *testing.T) {
531	var x, y, z int
532	ch := make(chan int, 2)
533
534	go func() {
535		x = y % (z + 1)
536		ch <- 1
537	}()
538	go func() {
539		y = z
540		ch <- 1
541	}()
542	<-ch
543	<-ch
544}
545
546func TestRaceModConst(t *testing.T) {
547	var x, y, z int
548	ch := make(chan int, 2)
549
550	go func() {
551		x = y % 3
552		ch <- 1
553	}()
554	go func() {
555		y = z
556		ch <- 1
557	}()
558	<-ch
559	<-ch
560}
561
562func TestRaceRotate(t *testing.T) {
563	var x, y, z uint32
564	ch := make(chan int, 2)
565
566	go func() {
567		x = y<<12 | y>>20
568		ch <- 1
569	}()
570	go func() {
571		y = z
572		ch <- 1
573	}()
574	<-ch
575	<-ch
576}
577
578// May crash if the instrumentation is reckless.
579func TestNoRaceEnoughRegisters(t *testing.T) {
580	// from erf.go
581	const (
582		sa1 = 1
583		sa2 = 2
584		sa3 = 3
585		sa4 = 4
586		sa5 = 5
587		sa6 = 6
588		sa7 = 7
589		sa8 = 8
590	)
591	var s, S float64
592	s = 3.1415
593	S = 1 + s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+s*sa8)))))))
594	s = S
595}
596
597// emptyFunc should not be inlined.
598func emptyFunc(x int) {
599	if false {
600		fmt.Println(x)
601	}
602}
603
604func TestRaceFuncArgument(t *testing.T) {
605	var x int
606	ch := make(chan bool, 1)
607	go func() {
608		emptyFunc(x)
609		ch <- true
610	}()
611	x = 1
612	<-ch
613}
614
615func TestRaceFuncArgument2(t *testing.T) {
616	var x int
617	ch := make(chan bool, 2)
618	go func() {
619		x = 42
620		ch <- true
621	}()
622	go func(y int) {
623		ch <- true
624	}(x)
625	<-ch
626	<-ch
627}
628
629func TestRaceSprint(t *testing.T) {
630	var x int
631	ch := make(chan bool, 1)
632	go func() {
633		fmt.Sprint(x)
634		ch <- true
635	}()
636	x = 1
637	<-ch
638}
639
640func TestRaceArrayCopy(t *testing.T) {
641	ch := make(chan bool, 1)
642	var a [5]int
643	go func() {
644		a[3] = 1
645		ch <- true
646	}()
647	a = [5]int{1, 2, 3, 4, 5}
648	<-ch
649}
650
651// Blows up a naive compiler.
652func TestRaceNestedArrayCopy(t *testing.T) {
653	ch := make(chan bool, 1)
654	type (
655		Point32   [2][2][2][2][2]Point
656		Point1024 [2][2][2][2][2]Point32
657		Point32k  [2][2][2][2][2]Point1024
658		Point1M   [2][2][2][2][2]Point32k
659	)
660	var a, b Point1M
661	go func() {
662		a[0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1].y = 1
663		ch <- true
664	}()
665	a = b
666	<-ch
667}
668
669func TestRaceStructRW(t *testing.T) {
670	p := Point{0, 0}
671	ch := make(chan bool, 1)
672	go func() {
673		p = Point{1, 1}
674		ch <- true
675	}()
676	q := p
677	<-ch
678	p = q
679}
680
681func TestRaceStructFieldRW1(t *testing.T) {
682	p := Point{0, 0}
683	ch := make(chan bool, 1)
684	go func() {
685		p.x = 1
686		ch <- true
687	}()
688	_ = p.x
689	<-ch
690}
691
692func TestNoRaceStructFieldRW1(t *testing.T) {
693	// Same struct, different variables, no
694	// pointers. The layout is known (at compile time?) ->
695	// no read on p
696	// writes on x and y
697	p := Point{0, 0}
698	ch := make(chan bool, 1)
699	go func() {
700		p.x = 1
701		ch <- true
702	}()
703	p.y = 1
704	<-ch
705	_ = p
706}
707
708func TestNoRaceStructFieldRW2(t *testing.T) {
709	// Same as NoRaceStructFieldRW1
710	// but p is a pointer, so there is a read on p
711	p := Point{0, 0}
712	ch := make(chan bool, 1)
713	go func() {
714		p.x = 1
715		ch <- true
716	}()
717	p.y = 1
718	<-ch
719	_ = p
720}
721
722func TestRaceStructFieldRW2(t *testing.T) {
723	p := &Point{0, 0}
724	ch := make(chan bool, 1)
725	go func() {
726		p.x = 1
727		ch <- true
728	}()
729	_ = p.x
730	<-ch
731}
732
733func TestRaceStructFieldRW3(t *testing.T) {
734	p := NamedPoint{name: "a", p: Point{0, 0}}
735	ch := make(chan bool, 1)
736	go func() {
737		p.p.x = 1
738		ch <- true
739	}()
740	_ = p.p.x
741	<-ch
742}
743
744func TestRaceEfaceWW(t *testing.T) {
745	var a, b interface{}
746	ch := make(chan bool, 1)
747	go func() {
748		a = 1
749		ch <- true
750	}()
751	a = 2
752	<-ch
753	_, _ = a, b
754}
755
756func TestRaceIfaceWW(t *testing.T) {
757	var a, b Writer
758	ch := make(chan bool, 1)
759	go func() {
760		a = DummyWriter{1}
761		ch <- true
762	}()
763	a = DummyWriter{2}
764	<-ch
765	b = a
766	a = b
767}
768
769func TestRaceIfaceCmp(t *testing.T) {
770	var a, b Writer
771	a = DummyWriter{1}
772	ch := make(chan bool, 1)
773	go func() {
774		a = DummyWriter{1}
775		ch <- true
776	}()
777	_ = a == b
778	<-ch
779}
780
781func TestRaceIfaceCmpNil(t *testing.T) {
782	var a Writer
783	a = DummyWriter{1}
784	ch := make(chan bool, 1)
785	go func() {
786		a = DummyWriter{1}
787		ch <- true
788	}()
789	_ = a == nil
790	<-ch
791}
792
793func TestRaceEfaceConv(t *testing.T) {
794	c := make(chan bool)
795	v := 0
796	go func() {
797		go func(x interface{}) {
798		}(v)
799		c <- true
800	}()
801	v = 42
802	<-c
803}
804
805type OsFile struct{}
806
807func (*OsFile) Read() {
808}
809
810type IoReader interface {
811	Read()
812}
813
814func TestRaceIfaceConv(t *testing.T) {
815	c := make(chan bool)
816	f := &OsFile{}
817	go func() {
818		go func(x IoReader) {
819		}(f)
820		c <- true
821	}()
822	f = &OsFile{}
823	<-c
824}
825
826func TestRaceError(t *testing.T) {
827	ch := make(chan bool, 1)
828	var err error
829	go func() {
830		err = nil
831		ch <- true
832	}()
833	_ = err
834	<-ch
835}
836
837func TestRaceIntptrRW(t *testing.T) {
838	var x, y int
839	var p *int = &x
840	ch := make(chan bool, 1)
841	go func() {
842		*p = 5
843		ch <- true
844	}()
845	y = *p
846	x = y
847	<-ch
848}
849
850func TestRaceStringRW(t *testing.T) {
851	ch := make(chan bool, 1)
852	s := ""
853	go func() {
854		s = "abacaba"
855		ch <- true
856	}()
857	_ = s
858	<-ch
859}
860
861func TestRaceStringPtrRW(t *testing.T) {
862	ch := make(chan bool, 1)
863	var x string
864	p := &x
865	go func() {
866		*p = "a"
867		ch <- true
868	}()
869	_ = *p
870	<-ch
871}
872
873func TestRaceFloat64WW(t *testing.T) {
874	var x, y float64
875	ch := make(chan bool, 1)
876	go func() {
877		x = 1.0
878		ch <- true
879	}()
880	x = 2.0
881	<-ch
882
883	y = x
884	x = y
885}
886
887func TestRaceComplex128WW(t *testing.T) {
888	var x, y complex128
889	ch := make(chan bool, 1)
890	go func() {
891		x = 2 + 2i
892		ch <- true
893	}()
894	x = 4 + 4i
895	<-ch
896
897	y = x
898	x = y
899}
900
901func TestRaceUnsafePtrRW(t *testing.T) {
902	var x, y, z int
903	x, y, z = 1, 2, 3
904	var p unsafe.Pointer = unsafe.Pointer(&x)
905	ch := make(chan bool, 1)
906	go func() {
907		p = (unsafe.Pointer)(&z)
908		ch <- true
909	}()
910	y = *(*int)(p)
911	x = y
912	<-ch
913}
914
915func TestRaceFuncVariableRW(t *testing.T) {
916	var f func(x int) int
917	f = func(x int) int {
918		return x * x
919	}
920	ch := make(chan bool, 1)
921	go func() {
922		f = func(x int) int {
923			return x
924		}
925		ch <- true
926	}()
927	y := f(1)
928	<-ch
929	x := y
930	y = x
931}
932
933func TestRaceFuncVariableWW(t *testing.T) {
934	var f func(x int) int
935	ch := make(chan bool, 1)
936	go func() {
937		f = func(x int) int {
938			return x
939		}
940		ch <- true
941	}()
942	f = func(x int) int {
943		return x * x
944	}
945	<-ch
946}
947
948// This one should not belong to mop_test
949func TestRacePanic(t *testing.T) {
950	var x int
951	var zero int = 0
952	ch := make(chan bool, 2)
953	go func() {
954		defer func() {
955			err := recover()
956			if err == nil {
957				panic("should be panicking")
958			}
959			x = 1
960			ch <- true
961		}()
962		var y int = 1 / zero
963		zero = y
964	}()
965	go func() {
966		defer func() {
967			err := recover()
968			if err == nil {
969				panic("should be panicking")
970			}
971			x = 2
972			ch <- true
973		}()
974		var y int = 1 / zero
975		zero = y
976	}()
977
978	<-ch
979	<-ch
980	if zero != 0 {
981		panic("zero has changed")
982	}
983}
984
985func TestNoRaceBlank(t *testing.T) {
986	var a [5]int
987	ch := make(chan bool, 1)
988	go func() {
989		_, _ = a[0], a[1]
990		ch <- true
991	}()
992	_, _ = a[2], a[3]
993	<-ch
994	a[1] = a[0]
995}
996
997func TestRaceAppendRW(t *testing.T) {
998	a := make([]int, 10)
999	ch := make(chan bool)
1000	go func() {
1001		_ = append(a, 1)
1002		ch <- true
1003	}()
1004	a[0] = 1
1005	<-ch
1006}
1007
1008func TestRaceAppendLenRW(t *testing.T) {
1009	a := make([]int, 0)
1010	ch := make(chan bool)
1011	go func() {
1012		a = append(a, 1)
1013		ch <- true
1014	}()
1015	_ = len(a)
1016	<-ch
1017}
1018
1019func TestRaceAppendCapRW(t *testing.T) {
1020	a := make([]int, 0)
1021	ch := make(chan string)
1022	go func() {
1023		a = append(a, 1)
1024		ch <- ""
1025	}()
1026	_ = cap(a)
1027	<-ch
1028}
1029
1030func TestNoRaceFuncArgsRW(t *testing.T) {
1031	ch := make(chan byte, 1)
1032	var x byte
1033	go func(y byte) {
1034		_ = y
1035		ch <- 0
1036	}(x)
1037	x = 1
1038	<-ch
1039}
1040
1041func TestRaceFuncArgsRW(t *testing.T) {
1042	ch := make(chan byte, 1)
1043	var x byte
1044	go func(y *byte) {
1045		_ = *y
1046		ch <- 0
1047	}(&x)
1048	x = 1
1049	<-ch
1050}
1051
1052// from the mailing list, slightly modified
1053// unprotected concurrent access to seen[]
1054func TestRaceCrawl(t *testing.T) {
1055	url := "dummyurl"
1056	depth := 3
1057	seen := make(map[string]bool)
1058	ch := make(chan int, 100)
1059	var wg sync.WaitGroup
1060	var crawl func(string, int)
1061	crawl = func(u string, d int) {
1062		nurl := 0
1063		defer func() {
1064			ch <- nurl
1065		}()
1066		seen[u] = true
1067		if d <= 0 {
1068			wg.Done()
1069			return
1070		}
1071		urls := [...]string{"a", "b", "c"}
1072		for _, uu := range urls {
1073			if _, ok := seen[uu]; !ok {
1074				wg.Add(1)
1075				go crawl(uu, d-1)
1076				nurl++
1077			}
1078		}
1079		wg.Done()
1080	}
1081	wg.Add(1)
1082	go crawl(url, depth)
1083	wg.Wait()
1084}
1085
1086func TestRaceIndirection(t *testing.T) {
1087	ch := make(chan struct{}, 1)
1088	var y int
1089	var x *int = &y
1090	go func() {
1091		*x = 1
1092		ch <- struct{}{}
1093	}()
1094	*x = 2
1095	<-ch
1096	_ = *x
1097}
1098
1099func TestRaceRune(t *testing.T) {
1100	c := make(chan bool)
1101	var x rune
1102	go func() {
1103		x = 1
1104		c <- true
1105	}()
1106	_ = x
1107	<-c
1108}
1109
1110func TestRaceEmptyInterface1(t *testing.T) {
1111	c := make(chan bool)
1112	var x interface{}
1113	go func() {
1114		x = nil
1115		c <- true
1116	}()
1117	_ = x
1118	<-c
1119}
1120
1121func TestRaceEmptyInterface2(t *testing.T) {
1122	c := make(chan bool)
1123	var x interface{}
1124	go func() {
1125		x = &Point{}
1126		c <- true
1127	}()
1128	_ = x
1129	<-c
1130}
1131
1132func TestRaceTLS(t *testing.T) {
1133	comm := make(chan *int)
1134	done := make(chan bool, 2)
1135	go func() {
1136		var x int
1137		comm <- &x
1138		x = 1
1139		x = *(<-comm)
1140		done <- true
1141	}()
1142	go func() {
1143		p := <-comm
1144		*p = 2
1145		comm <- p
1146		done <- true
1147	}()
1148	<-done
1149	<-done
1150}
1151
1152func TestNoRaceHeapReallocation(t *testing.T) {
1153	// It is possible that a future implementation
1154	// of memory allocation will ruin this test.
1155	// Increasing n might help in this case, so
1156	// this test is a bit more generic than most of the
1157	// others.
1158	const n = 2
1159	done := make(chan bool, n)
1160	empty := func(p *int) {}
1161	for i := 0; i < n; i++ {
1162		ms := i
1163		go func() {
1164			<-time.After(time.Duration(ms) * time.Millisecond)
1165			runtime.GC()
1166			var x int
1167			empty(&x) // x goes to the heap
1168			done <- true
1169		}()
1170	}
1171	for i := 0; i < n; i++ {
1172		<-done
1173	}
1174}
1175
1176func TestRaceAnd(t *testing.T) {
1177	c := make(chan bool)
1178	x, y := 0, 0
1179	go func() {
1180		x = 1
1181		c <- true
1182	}()
1183	if x == 1 && y == 1 {
1184	}
1185	<-c
1186}
1187
1188func TestRaceAnd2(t *testing.T) {
1189	c := make(chan bool)
1190	x, y := 0, 0
1191	go func() {
1192		x = 1
1193		c <- true
1194	}()
1195	if y == 0 && x == 1 {
1196	}
1197	<-c
1198}
1199
1200func TestNoRaceAnd(t *testing.T) {
1201	c := make(chan bool)
1202	x, y := 0, 0
1203	go func() {
1204		x = 1
1205		c <- true
1206	}()
1207	if y == 1 && x == 1 {
1208	}
1209	<-c
1210}
1211
1212func TestRaceOr(t *testing.T) {
1213	c := make(chan bool)
1214	x, y := 0, 0
1215	go func() {
1216		x = 1
1217		c <- true
1218	}()
1219	if x == 1 || y == 1 {
1220	}
1221	<-c
1222}
1223
1224func TestRaceOr2(t *testing.T) {
1225	c := make(chan bool)
1226	x, y := 0, 0
1227	go func() {
1228		x = 1
1229		c <- true
1230	}()
1231	if y == 1 || x == 1 {
1232	}
1233	<-c
1234}
1235
1236func TestNoRaceOr(t *testing.T) {
1237	c := make(chan bool)
1238	x, y := 0, 0
1239	go func() {
1240		x = 1
1241		c <- true
1242	}()
1243	if y == 0 || x == 1 {
1244	}
1245	<-c
1246}
1247
1248func TestNoRaceShortCalc(t *testing.T) {
1249	c := make(chan bool)
1250	x, y := 0, 0
1251	go func() {
1252		y = 1
1253		c <- true
1254	}()
1255	if x == 0 || y == 0 {
1256	}
1257	<-c
1258}
1259
1260func TestNoRaceShortCalc2(t *testing.T) {
1261	c := make(chan bool)
1262	x, y := 0, 0
1263	go func() {
1264		y = 1
1265		c <- true
1266	}()
1267	if x == 1 && y == 0 {
1268	}
1269	<-c
1270}
1271
1272func TestRaceFuncItself(t *testing.T) {
1273	c := make(chan bool)
1274	f := func() {}
1275	go func() {
1276		f()
1277		c <- true
1278	}()
1279	f = func() {}
1280	<-c
1281}
1282
1283func TestNoRaceFuncUnlock(t *testing.T) {
1284	ch := make(chan bool, 1)
1285	var mu sync.Mutex
1286	x := 0
1287	go func() {
1288		mu.Lock()
1289		x = 42
1290		mu.Unlock()
1291		ch <- true
1292	}()
1293	x = func(mu *sync.Mutex) int {
1294		mu.Lock()
1295		return 43
1296	}(&mu)
1297	mu.Unlock()
1298	<-ch
1299}
1300
1301func TestRaceStructInit(t *testing.T) {
1302	type X struct {
1303		x, y int
1304	}
1305	c := make(chan bool, 1)
1306	y := 0
1307	go func() {
1308		y = 42
1309		c <- true
1310	}()
1311	x := X{x: y}
1312	_ = x
1313	<-c
1314}
1315
1316func TestRaceArrayInit(t *testing.T) {
1317	c := make(chan bool, 1)
1318	y := 0
1319	go func() {
1320		y = 42
1321		c <- true
1322	}()
1323	x := []int{0, y, 42}
1324	_ = x
1325	<-c
1326}
1327
1328func TestRaceMapInit(t *testing.T) {
1329	c := make(chan bool, 1)
1330	y := 0
1331	go func() {
1332		y = 42
1333		c <- true
1334	}()
1335	x := map[int]int{0: 42, y: 42}
1336	_ = x
1337	<-c
1338}
1339
1340func TestRaceMapInit2(t *testing.T) {
1341	c := make(chan bool, 1)
1342	y := 0
1343	go func() {
1344		y = 42
1345		c <- true
1346	}()
1347	x := map[int]int{0: 42, 42: y}
1348	_ = x
1349	<-c
1350}
1351
1352type Inter interface {
1353	Foo(x int)
1354}
1355type InterImpl struct {
1356	x, y int
1357}
1358
1359//go:noinline
1360func (p InterImpl) Foo(x int) {
1361}
1362
1363type InterImpl2 InterImpl
1364
1365func (p *InterImpl2) Foo(x int) {
1366	if p == nil {
1367		InterImpl{}.Foo(x)
1368	}
1369	InterImpl(*p).Foo(x)
1370}
1371
1372func TestRaceInterCall(t *testing.T) {
1373	c := make(chan bool, 1)
1374	p := InterImpl{}
1375	var x Inter = p
1376	go func() {
1377		p2 := InterImpl{}
1378		x = p2
1379		c <- true
1380	}()
1381	x.Foo(0)
1382	<-c
1383}
1384
1385func TestRaceInterCall2(t *testing.T) {
1386	c := make(chan bool, 1)
1387	p := InterImpl{}
1388	var x Inter = p
1389	z := 0
1390	go func() {
1391		z = 42
1392		c <- true
1393	}()
1394	x.Foo(z)
1395	<-c
1396}
1397
1398func TestRaceFuncCall(t *testing.T) {
1399	c := make(chan bool, 1)
1400	f := func(x, y int) {}
1401	x, y := 0, 0
1402	go func() {
1403		y = 42
1404		c <- true
1405	}()
1406	f(x, y)
1407	<-c
1408}
1409
1410func TestRaceMethodCall(t *testing.T) {
1411	c := make(chan bool, 1)
1412	i := InterImpl{}
1413	x := 0
1414	go func() {
1415		x = 42
1416		c <- true
1417	}()
1418	i.Foo(x)
1419	<-c
1420}
1421
1422func TestRaceMethodCall2(t *testing.T) {
1423	c := make(chan bool, 1)
1424	i := &InterImpl{}
1425	go func() {
1426		i = &InterImpl{}
1427		c <- true
1428	}()
1429	i.Foo(0)
1430	<-c
1431}
1432
1433// Method value with concrete value receiver.
1434func TestRaceMethodValue(t *testing.T) {
1435	c := make(chan bool, 1)
1436	i := InterImpl{}
1437	go func() {
1438		i = InterImpl{}
1439		c <- true
1440	}()
1441	_ = i.Foo
1442	<-c
1443}
1444
1445// Method value with interface receiver.
1446func TestRaceMethodValue2(t *testing.T) {
1447	c := make(chan bool, 1)
1448	var i Inter = InterImpl{}
1449	go func() {
1450		i = InterImpl{}
1451		c <- true
1452	}()
1453	_ = i.Foo
1454	<-c
1455}
1456
1457// Method value with implicit dereference.
1458func TestRaceMethodValue3(t *testing.T) {
1459	c := make(chan bool, 1)
1460	i := &InterImpl{}
1461	go func() {
1462		*i = InterImpl{}
1463		c <- true
1464	}()
1465	_ = i.Foo // dereferences i.
1466	<-c
1467}
1468
1469// Method value implicitly taking receiver address.
1470func TestNoRaceMethodValue(t *testing.T) {
1471	c := make(chan bool, 1)
1472	i := InterImpl2{}
1473	go func() {
1474		i = InterImpl2{}
1475		c <- true
1476	}()
1477	_ = i.Foo // takes the address of i only.
1478	<-c
1479}
1480
1481func TestRacePanicArg(t *testing.T) {
1482	c := make(chan bool, 1)
1483	err := errors.New("err")
1484	go func() {
1485		err = errors.New("err2")
1486		c <- true
1487	}()
1488	defer func() {
1489		recover()
1490		<-c
1491	}()
1492	panic(err)
1493}
1494
1495func TestRaceDeferArg(t *testing.T) {
1496	c := make(chan bool, 1)
1497	x := 0
1498	go func() {
1499		x = 42
1500		c <- true
1501	}()
1502	func() {
1503		defer func(x int) {
1504		}(x)
1505	}()
1506	<-c
1507}
1508
1509type DeferT int
1510
1511func (d DeferT) Foo() {
1512}
1513
1514func TestRaceDeferArg2(t *testing.T) {
1515	c := make(chan bool, 1)
1516	var x DeferT
1517	go func() {
1518		var y DeferT
1519		x = y
1520		c <- true
1521	}()
1522	func() {
1523		defer x.Foo()
1524	}()
1525	<-c
1526}
1527
1528func TestNoRaceAddrExpr(t *testing.T) {
1529	c := make(chan bool, 1)
1530	x := 0
1531	go func() {
1532		x = 42
1533		c <- true
1534	}()
1535	_ = &x
1536	<-c
1537}
1538
1539type AddrT struct {
1540	_ [256]byte
1541	x int
1542}
1543
1544type AddrT2 struct {
1545	_ [512]byte
1546	p *AddrT
1547}
1548
1549func TestRaceAddrExpr(t *testing.T) {
1550	c := make(chan bool, 1)
1551	a := AddrT2{p: &AddrT{x: 42}}
1552	go func() {
1553		a.p = &AddrT{x: 43}
1554		c <- true
1555	}()
1556	_ = &a.p.x
1557	<-c
1558}
1559
1560func TestRaceTypeAssert(t *testing.T) {
1561	c := make(chan bool, 1)
1562	x := 0
1563	var i interface{} = x
1564	go func() {
1565		y := 0
1566		i = y
1567		c <- true
1568	}()
1569	_ = i.(int)
1570	<-c
1571}
1572
1573func TestRaceBlockAs(t *testing.T) {
1574	c := make(chan bool, 1)
1575	var x, y int
1576	go func() {
1577		x = 42
1578		c <- true
1579	}()
1580	x, y = y, x
1581	<-c
1582}
1583
1584func TestRaceBlockCall1(t *testing.T) {
1585	done := make(chan bool)
1586	x, y := 0, 0
1587	go func() {
1588		f := func() (int, int) {
1589			return 42, 43
1590		}
1591		x, y = f()
1592		done <- true
1593	}()
1594	_ = x
1595	<-done
1596	if x != 42 || y != 43 {
1597		panic("corrupted data")
1598	}
1599}
1600func TestRaceBlockCall2(t *testing.T) {
1601	done := make(chan bool)
1602	x, y := 0, 0
1603	go func() {
1604		f := func() (int, int) {
1605			return 42, 43
1606		}
1607		x, y = f()
1608		done <- true
1609	}()
1610	_ = y
1611	<-done
1612	if x != 42 || y != 43 {
1613		panic("corrupted data")
1614	}
1615}
1616func TestRaceBlockCall3(t *testing.T) {
1617	done := make(chan bool)
1618	var x *int
1619	y := 0
1620	go func() {
1621		f := func() (*int, int) {
1622			i := 42
1623			return &i, 43
1624		}
1625		x, y = f()
1626		done <- true
1627	}()
1628	_ = x
1629	<-done
1630	if *x != 42 || y != 43 {
1631		panic("corrupted data")
1632	}
1633}
1634func TestRaceBlockCall4(t *testing.T) {
1635	done := make(chan bool)
1636	x := 0
1637	var y *int
1638	go func() {
1639		f := func() (int, *int) {
1640			i := 43
1641			return 42, &i
1642		}
1643		x, y = f()
1644		done <- true
1645	}()
1646	_ = y
1647	<-done
1648	if x != 42 || *y != 43 {
1649		panic("corrupted data")
1650	}
1651}
1652func TestRaceBlockCall5(t *testing.T) {
1653	done := make(chan bool)
1654	var x *int
1655	y := 0
1656	go func() {
1657		f := func() (*int, int) {
1658			i := 42
1659			return &i, 43
1660		}
1661		x, y = f()
1662		done <- true
1663	}()
1664	_ = y
1665	<-done
1666	if *x != 42 || y != 43 {
1667		panic("corrupted data")
1668	}
1669}
1670func TestRaceBlockCall6(t *testing.T) {
1671	done := make(chan bool)
1672	x := 0
1673	var y *int
1674	go func() {
1675		f := func() (int, *int) {
1676			i := 43
1677			return 42, &i
1678		}
1679		x, y = f()
1680		done <- true
1681	}()
1682	_ = x
1683	<-done
1684	if x != 42 || *y != 43 {
1685		panic("corrupted data")
1686	}
1687}
1688func TestRaceSliceSlice(t *testing.T) {
1689	c := make(chan bool, 1)
1690	x := make([]int, 10)
1691	go func() {
1692		x = make([]int, 20)
1693		c <- true
1694	}()
1695	_ = x[2:3]
1696	<-c
1697}
1698
1699func TestRaceSliceSlice2(t *testing.T) {
1700	c := make(chan bool, 1)
1701	x := make([]int, 10)
1702	i := 2
1703	go func() {
1704		i = 3
1705		c <- true
1706	}()
1707	_ = x[i:4]
1708	<-c
1709}
1710
1711func TestRaceSliceString(t *testing.T) {
1712	c := make(chan bool, 1)
1713	x := "hello"
1714	go func() {
1715		x = "world"
1716		c <- true
1717	}()
1718	_ = x[2:3]
1719	<-c
1720}
1721
1722func TestRaceSliceStruct(t *testing.T) {
1723	type X struct {
1724		x, y int
1725	}
1726	c := make(chan bool, 1)
1727	x := make([]X, 10)
1728	go func() {
1729		y := make([]X, 10)
1730		copy(y, x)
1731		c <- true
1732	}()
1733	x[1].y = 42
1734	<-c
1735}
1736
1737func TestRaceAppendSliceStruct(t *testing.T) {
1738	type X struct {
1739		x, y int
1740	}
1741	c := make(chan bool, 1)
1742	x := make([]X, 10)
1743	go func() {
1744		y := make([]X, 0, 10)
1745		y = append(y, x...)
1746		c <- true
1747	}()
1748	x[1].y = 42
1749	<-c
1750}
1751
1752func TestRaceStructInd(t *testing.T) {
1753	c := make(chan bool, 1)
1754	type Item struct {
1755		x, y int
1756	}
1757	i := Item{}
1758	go func(p *Item) {
1759		*p = Item{}
1760		c <- true
1761	}(&i)
1762	i.y = 42
1763	<-c
1764}
1765
1766func TestRaceAsFunc1(t *testing.T) {
1767	var s []byte
1768	c := make(chan bool, 1)
1769	go func() {
1770		var err error
1771		s, err = func() ([]byte, error) {
1772			t := []byte("hello world")
1773			return t, nil
1774		}()
1775		c <- true
1776		_ = err
1777	}()
1778	_ = string(s)
1779	<-c
1780}
1781
1782func TestRaceAsFunc2(t *testing.T) {
1783	c := make(chan bool, 1)
1784	x := 0
1785	go func() {
1786		func(x int) {
1787		}(x)
1788		c <- true
1789	}()
1790	x = 42
1791	<-c
1792}
1793
1794func TestRaceAsFunc3(t *testing.T) {
1795	c := make(chan bool, 1)
1796	var mu sync.Mutex
1797	x := 0
1798	go func() {
1799		func(x int) {
1800			mu.Lock()
1801		}(x) // Read of x must be outside of the mutex.
1802		mu.Unlock()
1803		c <- true
1804	}()
1805	mu.Lock()
1806	x = 42
1807	mu.Unlock()
1808	<-c
1809}
1810
1811func TestNoRaceAsFunc4(t *testing.T) {
1812	c := make(chan bool, 1)
1813	var mu sync.Mutex
1814	x := 0
1815	go func() {
1816		x = func() int { // Write of x must be under the mutex.
1817			mu.Lock()
1818			return 42
1819		}()
1820		mu.Unlock()
1821		c <- true
1822	}()
1823	mu.Lock()
1824	x = 42
1825	mu.Unlock()
1826	<-c
1827}
1828
1829func TestRaceHeapParam(t *testing.T) {
1830	done := make(chan bool)
1831	x := func() (x int) {
1832		go func() {
1833			x = 42
1834			done <- true
1835		}()
1836		return
1837	}()
1838	_ = x
1839	<-done
1840}
1841
1842func TestNoRaceEmptyStruct(t *testing.T) {
1843	type Empty struct{}
1844	type X struct {
1845		y int64
1846		Empty
1847	}
1848	type Y struct {
1849		x X
1850		y int64
1851	}
1852	c := make(chan X)
1853	var y Y
1854	go func() {
1855		x := y.x
1856		c <- x
1857	}()
1858	y.y = 42
1859	<-c
1860}
1861
1862func TestRaceNestedStruct(t *testing.T) {
1863	type X struct {
1864		x, y int
1865	}
1866	type Y struct {
1867		x X
1868	}
1869	c := make(chan Y)
1870	var y Y
1871	go func() {
1872		c <- y
1873	}()
1874	y.x.y = 42
1875	<-c
1876}
1877
1878func TestRaceIssue5567(t *testing.T) {
1879	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
1880	in := make(chan []byte)
1881	res := make(chan error)
1882	go func() {
1883		var err error
1884		defer func() {
1885			close(in)
1886			res <- err
1887		}()
1888		path := "mop_test.go"
1889		f, err := os.Open(path)
1890		if err != nil {
1891			return
1892		}
1893		defer f.Close()
1894		var n, total int
1895		b := make([]byte, 17) // the race is on b buffer
1896		for err == nil {
1897			n, err = f.Read(b)
1898			total += n
1899			if n > 0 {
1900				in <- b[:n]
1901			}
1902		}
1903		if err == io.EOF {
1904			err = nil
1905		}
1906	}()
1907	h := sha1.New()
1908	for b := range in {
1909		h.Write(b)
1910	}
1911	_ = h.Sum(nil)
1912	err := <-res
1913	if err != nil {
1914		t.Fatal(err)
1915	}
1916}
1917
1918func TestRaceIssue5654(t *testing.T) {
1919	text := `Friends, Romans, countrymen, lend me your ears;
1920I come to bury Caesar, not to praise him.
1921The evil that men do lives after them;
1922The good is oft interred with their bones;
1923So let it be with Caesar. The noble Brutus
1924Hath told you Caesar was ambitious:
1925If it were so, it was a grievous fault,
1926And grievously hath Caesar answer'd it.
1927Here, under leave of Brutus and the rest -
1928For Brutus is an honourable man;
1929So are they all, all honourable men -
1930Come I to speak in Caesar's funeral.
1931He was my friend, faithful and just to me:
1932But Brutus says he was ambitious;
1933And Brutus is an honourable man.`
1934
1935	data := bytes.NewBufferString(text)
1936	in := make(chan []byte)
1937
1938	go func() {
1939		buf := make([]byte, 16)
1940		var n int
1941		var err error
1942		for ; err == nil; n, err = data.Read(buf) {
1943			in <- buf[:n]
1944		}
1945		close(in)
1946	}()
1947	res := ""
1948	for s := range in {
1949		res += string(s)
1950	}
1951	_ = res
1952}
1953
1954type Base int
1955
1956func (b *Base) Foo() int {
1957	return 42
1958}
1959
1960func (b Base) Bar() int {
1961	return int(b)
1962}
1963
1964func TestNoRaceMethodThunk(t *testing.T) {
1965	type Derived struct {
1966		pad int
1967		Base
1968	}
1969	var d Derived
1970	done := make(chan bool)
1971	go func() {
1972		_ = d.Foo()
1973		done <- true
1974	}()
1975	d = Derived{}
1976	<-done
1977}
1978
1979func TestRaceMethodThunk(t *testing.T) {
1980	type Derived struct {
1981		pad int
1982		*Base
1983	}
1984	var d Derived
1985	done := make(chan bool)
1986	go func() {
1987		_ = d.Foo()
1988		done <- true
1989	}()
1990	d = Derived{}
1991	<-done
1992}
1993
1994func TestRaceMethodThunk2(t *testing.T) {
1995	type Derived struct {
1996		pad int
1997		Base
1998	}
1999	var d Derived
2000	done := make(chan bool)
2001	go func() {
2002		_ = d.Bar()
2003		done <- true
2004	}()
2005	d = Derived{}
2006	<-done
2007}
2008
2009func TestRaceMethodThunk3(t *testing.T) {
2010	type Derived struct {
2011		pad int
2012		*Base
2013	}
2014	var d Derived
2015	d.Base = new(Base)
2016	done := make(chan bool)
2017	go func() {
2018		_ = d.Bar()
2019		done <- true
2020	}()
2021	d.Base = new(Base)
2022	<-done
2023}
2024
2025func TestRaceMethodThunk4(t *testing.T) {
2026	type Derived struct {
2027		pad int
2028		*Base
2029	}
2030	var d Derived
2031	d.Base = new(Base)
2032	done := make(chan bool)
2033	go func() {
2034		_ = d.Bar()
2035		done <- true
2036	}()
2037	*(*int)(d.Base) = 42
2038	<-done
2039}
2040
2041func TestNoRaceTinyAlloc(t *testing.T) {
2042	const P = 4
2043	const N = 1e6
2044	var tinySink *byte
2045	done := make(chan bool)
2046	for p := 0; p < P; p++ {
2047		go func() {
2048			for i := 0; i < N; i++ {
2049				var b byte
2050				if b != 0 {
2051					tinySink = &b // make it heap allocated
2052				}
2053				b = 42
2054			}
2055			done <- true
2056		}()
2057	}
2058	for p := 0; p < P; p++ {
2059		<-done
2060	}
2061}
2062