Go1.7+中的BCE(Bounds Check Elimination)

自go1.7+,我们可以在编译时开启对有潜在slice越界访问风险的语句进行提示。

1
2
3
4
5
6
7
package main

func f1(s []int) {
_ = s[0] // line 5: bounds check
_ = s[1] // line 6: bounds check
_ = s[2] // line 7: bounds check
}

此处代码并未对slice的使用进行边界校验,容易发生危险,因为 s []int 尺寸未知。

1
2
3
4
5
6
go build -gcflags="-d=ssa/check_bce/debug=1" main.go

# command-line-arguments
./main.go:14:5: Found IsInBounds
./main.go:15:6: Found IsInBounds
./main.go:16:7: Found IsInBounds

当我们把上面的代码修改为:

1
2
3
4
5
6
7
8
9
10
func f1(s []int) {

if len(s) < 3 {
return
}

_ = s[0] // line 5: bounds check
_ = s[1] // line 6: bounds check
_ = s[2] // line 7: bounds check
}

再执行刚才的命令,就不会再提示有越界的可能了

原文地址(需梯子):

http://www.tapirgames.com/blog/go-1.7-bce