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

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

原文地址(需梯子):

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

本文引用了原文中的一小段示例,只是简单的讲解一下BCE如何使用,更深入的使用方法请各位参考原文。

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 尺寸未知。

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

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

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
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,838评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 区块链,在6月份以前,对于我来说是个陌生的事物。在此,感谢金马老师,带我了解区块链,让我走进区块链的世界。...
    郑小傻阅读 200评论 1 0
  • 给定一个int数组,其中两个数相加等于一个特定值,返回这两个数的索引 示例 int数组: [2, 7, 11, 1...
    小菜鸟程序媛阅读 1,015评论 0 2
  • 看来我现在逐渐把简书当做我的笔记本了,希望他之后发展越来越好。 今天的一些小事又触动了我,可能是我比较敏感吧,就是...
    vieber阅读 162评论 0 0