mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 08:40:55 +00:00 
			
		
		
		
	 0c54225b51
			
		
	
	
		0c54225b51
		
	
	
	
	
		
			
			The recent linker changes broke NaCl support a month ago, and there are no known users of it. The NaCl code can always be recovered from the repository history. R=adg, r CC=golang-dev https://golang.org/cl/3671042
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // $G $D/$F.go && $L $F.$A && ./$A.out
 | |
| 
 | |
| // Copyright 2010 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.
 | |
| 
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"runtime"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| var didbug bool
 | |
| 
 | |
| func bug() {
 | |
| 	if didbug {
 | |
| 		return
 | |
| 	}
 | |
| 	println("BUG")
 | |
| 	didbug = true
 | |
| }
 | |
| 
 | |
| func check(name string, f func(), err string) {
 | |
| 	defer func() {
 | |
| 		v := recover()
 | |
| 		if v == nil {
 | |
| 			bug()
 | |
| 			println(name, "did not panic")
 | |
| 			return
 | |
| 		}
 | |
| 		runt, ok := v.(runtime.Error)
 | |
| 		if !ok {
 | |
| 			bug()
 | |
| 			println(name, "panicked but not with runtime.Error")
 | |
| 			return
 | |
| 		}
 | |
| 		s := runt.String()
 | |
| 		if strings.Index(s, err) < 0 {
 | |
| 			bug()
 | |
| 			println(name, "panicked with", s, "not", err)
 | |
| 			return
 | |
| 		}
 | |
| 	}()
 | |
| 
 | |
| 	f()
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	var x int
 | |
| 	var x64 int64
 | |
| 	var p *[10]int
 | |
| 	var q *[10000]int
 | |
| 	var i int
 | |
| 
 | |
| 	check("int-div-zero", func() { println(1 / x) }, "integer divide by zero")
 | |
| 	check("int64-div-zero", func() { println(1 / x64) }, "integer divide by zero")
 | |
| 
 | |
| 	check("nil-deref", func() { println(p[0]) }, "nil pointer dereference")
 | |
| 	check("nil-deref-1", func() { println(p[1]) }, "nil pointer dereference")
 | |
| 	check("nil-deref-big", func() { println(q[5000]) }, "nil pointer dereference")
 | |
| 
 | |
| 	i = 99999
 | |
| 	var sl []int
 | |
| 	check("array-bounds", func() { println(p[i]) }, "index out of range")
 | |
| 	check("slice-bounds", func() { println(sl[i]) }, "index out of range")
 | |
| 
 | |
| 	var inter interface{}
 | |
| 	inter = 1
 | |
| 	check("type-concrete", func() { println(inter.(string)) }, "int, not string")
 | |
| 	check("type-interface", func() { println(inter.(m)) }, "missing method m")
 | |
| }
 | |
| 
 | |
| type m interface {
 | |
| 	m()
 | |
| }
 |