github.com/letsencrypt/go@v0.0.0-20160714163537-4054769a31f6/test/checkbce.go (about) 1 // +build amd64 2 // errorcheck -0 -d=ssa/check_bce/debug=3 3 4 package main 5 6 func f0(a []int) { 7 a[0] = 1 // ERROR "Found IsInBounds$" 8 a[0] = 1 9 a[6] = 1 // ERROR "Found IsInBounds$" 10 a[6] = 1 11 a[5] = 1 12 a[5] = 1 13 } 14 15 func f1(a [256]int, i int) { 16 useInt(a[i]) // ERROR "Found IsInBounds$" 17 useInt(a[i%256]) // ERROR "Found IsInBounds$" 18 useInt(a[i&255]) 19 useInt(a[i&17]) 20 21 if 4 <= i && i < len(a) { 22 useInt(a[i]) 23 useInt(a[i-1]) // ERROR "Found IsInBounds$" 24 useInt(a[i-4]) // ERROR "Found IsInBounds$" 25 } 26 } 27 28 func f2(a [256]int, i uint) { 29 useInt(a[i]) // ERROR "Found IsInBounds$" 30 useInt(a[i%256]) 31 useInt(a[i&255]) 32 useInt(a[i&17]) 33 } 34 35 func f3(a [256]int, i uint8) { 36 useInt(a[i]) 37 useInt(a[i+10]) 38 useInt(a[i+14]) 39 } 40 41 func f4(a [27]int, i uint8) { 42 useInt(a[i%15]) 43 useInt(a[i%19]) 44 useInt(a[i%27]) 45 } 46 47 func f5(a []int) { 48 if len(a) > 5 { 49 useInt(a[5]) 50 useSlice(a[6:]) 51 useSlice(a[:6]) // ERROR "Found IsSliceInBounds$" 52 } 53 } 54 55 func f6(a [32]int, b [64]int, i int) { 56 useInt(a[uint32(i*0x07C4ACDD)>>27]) 57 useInt(b[uint64(i*0x07C4ACDD)>>58]) 58 useInt(a[uint(i*0x07C4ACDD)>>59]) 59 60 // The following bounds should not be removed because they can overflow. 61 useInt(a[uint32(i*0x106297f105d0cc86)>>26]) // ERROR "Found IsInBounds$" 62 useInt(b[uint64(i*0x106297f105d0cc86)>>57]) // ERROR "Found IsInBounds$" 63 useInt(a[int32(i*0x106297f105d0cc86)>>26]) // ERROR "Found IsInBounds$" 64 useInt(b[int64(i*0x106297f105d0cc86)>>57]) // ERROR "Found IsInBounds$" 65 } 66 67 func g1(a []int) { 68 for i := range a { 69 a[i] = i 70 useSlice(a[:i+1]) 71 useSlice(a[:i]) 72 } 73 } 74 75 func g2(a []int) { 76 useInt(a[3]) // ERROR "Found IsInBounds$" 77 useInt(a[2]) 78 useInt(a[1]) 79 useInt(a[0]) 80 } 81 82 func g3(a []int) { 83 for i := range a[:256] { // ERROR "Found IsSliceInBounds$" 84 useInt(a[i]) // ERROR "Found IsInBounds$" 85 } 86 b := a[:256] 87 for i := range b { 88 useInt(b[i]) 89 } 90 } 91 92 func g4(a [100]int) { 93 for i := 10; i < 50; i++ { 94 useInt(a[i-10]) 95 useInt(a[i]) 96 useInt(a[i+25]) 97 useInt(a[i+50]) 98 99 // The following are out of bounds. 100 useInt(a[i-11]) // ERROR "Found IsInBounds$" 101 useInt(a[i+51]) // ERROR "Found IsInBounds$" 102 } 103 } 104 105 //go:noinline 106 func useInt(a int) { 107 } 108 109 //go:noinline 110 func useSlice(a []int) { 111 } 112 113 func main() { 114 }