自go1.7+市咆,我們可以在編譯時(shí)開(kāi)啟對(duì)有潛在slice越界訪問(wèn)風(fēng)險(xiǎn)的語(yǔ)句進(jìn)行提示。
原文地址(需梯子):
http://www.tapirgames.com/blog/go-1.7-bce
本文引用了原文中的一小段示例再来,只是簡(jiǎn)單的講解一下BCE如何使用蒙兰,更深入的使用方法請(qǐng)各位參考原文磷瘤。
package main
func f1(s []int) {
_ = s[0] // line 5: bounds check
_ = s[1] // line 6: bounds check
_ = s[2] // line 7: bounds check
}
此處代碼并未對(duì)slice的使用進(jìn)行邊界校驗(yàn),容易發(fā)生危險(xiǎn)搜变,因?yàn)?s []int
尺寸未知采缚。
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
當(dāng)我們把上面的代碼修改為:
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
}
再執(zhí)行剛才的命令,就不會(huì)再提示有越界的可能了