stack.go 1.1 KB
Newer Older
Russ Cox's avatar
Russ Cox committed
1 2 3 4 5 6 7
// $G $D/$F.go && $L $F.$A && ./$A.out

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Try to tickle stack splitting bugs by doing
8
// go, defer, and closure calls at different stack depths.
Russ Cox's avatar
Russ Cox committed
9 10 11

package main

12
type T [20]int
Russ Cox's avatar
Russ Cox committed
13 14

func g(c chan int, t T) {
15
	s := 0
Russ Cox's avatar
Russ Cox committed
16
	for i := 0; i < len(t); i++ {
17
		s += t[i]
Russ Cox's avatar
Russ Cox committed
18
	}
19
	c <- s
Russ Cox's avatar
Russ Cox committed
20 21 22
}

func d(t T) {
23
	s := 0
Russ Cox's avatar
Russ Cox committed
24
	for i := 0; i < len(t); i++ {
25
		s += t[i]
Russ Cox's avatar
Russ Cox committed
26 27
	}
	if s != len(t) {
28 29
		println("bad defer", s)
		panic("fail")
Russ Cox's avatar
Russ Cox committed
30 31 32
	}
}

33 34 35
var c = make(chan int)
var t T
var b = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Russ Cox's avatar
Russ Cox committed
36 37

func recur(n int) {
38
	ss := string(b)
Russ Cox's avatar
Russ Cox committed
39
	if len(ss) != len(b) {
40
		panic("bad []byte -> string")
Russ Cox's avatar
Russ Cox committed
41
	}
42 43
	go g(c, t)
	s := <-c
Russ Cox's avatar
Russ Cox committed
44
	if s != len(t) {
45 46
		println("bad go", s)
		panic("fail")
Russ Cox's avatar
Russ Cox committed
47
	}
48
	f := func(t T) int {
49
		s := 0
50
		for i := 0; i < len(t); i++ {
51
			s += t[i]
52
		}
53 54 55 56 57 58 59
		s += n
		return s
	}
	s = f(t)
	if s != len(t)+n {
		println("bad func", s, "at level", n)
		panic("fail")
60
	}
Russ Cox's avatar
Russ Cox committed
61
	if n > 0 {
62
		recur(n - 1)
Russ Cox's avatar
Russ Cox committed
63
	}
64
	defer d(t)
Russ Cox's avatar
Russ Cox committed
65 66 67 68
}

func main() {
	for i := 0; i < len(t); i++ {
69
		t[i] = 1
Russ Cox's avatar
Russ Cox committed
70
	}
71
	recur(8000)
Russ Cox's avatar
Russ Cox committed
72
}