前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 编码建议——安全篇

Go 编码建议——安全篇

作者头像
恋喵大鲤鱼
发布2024-06-26 08:55:33
1010
发布2024-06-26 08:55:33
举报
文章被收录于专栏:C/C++基础C/C++基础
文章目录

  • 1.内存管理
    • 1.切片长度校验
    • 2.指针判空
    • 3.整数安全

1.内存管理

1.切片长度校验

在对 slice 进行操作时,必须判断长度是否合法,防止程序 panic。

代码语言:javascript
复制
// bad: slice bounds out of range
func foo(slice []int){
	fmt.Println(slice[:10])
}

// good: check the slice length
func foo(slice []int){
	if len(slice) >= 10 {
		fmt.Println(slice[:10])
		return
	}
	fmt.Println("no enough elems in slice")
}

2.指针判空

进行指针操作时,必须判断该指针是否为 nil,防止程序 panic,尤其在进行结构体Unmarshal 时。

代码语言:javascript
复制
type Packet struct {
	Type    uint8
	Version uint8
	Data    *Data
}
type Data struct {
	Stat uint8
	Len  uint8
	Buf  [8]byte
}

// bad
func foo(p Packet) {
	fmt.Println(p.Data.Stat)
}

// good
func foo(p Packet) {
	if p.Data != nil {
		fmt.Println(p.Data.Stat)
		return
	}
	fmt.Println("packet is nil")
}

3.整数安全

在进行数字运算操作时,需要做好长度限制,防止外部输入运算导致异常:

  • 确保无符号整数运算时不会出现符号反转
  • 确保有符号整数运算时不会出现溢出
代码语言:javascript
复制
// bad:未限制长度,导致整数溢出
func overflow(n int32) {
	var num int32 = 0
	num = n + 1
	// 对长度限制不当,导致整数溢出
	fmt.Printf("%d\n", num)
	// 使用 numInt,可能导致其他错误
}

func main() {
	overflow(2147483647)
}

// good
func overflow(n int32) {
	var num int32 = 0
	num = n + 1
	if num < 0 {
		fmt.Println("integer overflow")
		return
	}
	fmt.Println("integer ok")
}

func main(){
	overflow(2147483647)
}
  • 确保整型转换时不会出现截断错误
  • 确保整型转换时不会出现符号错误

以下场景必须严格进行长度限制:

  • 作为数组索引
  • 作为对象的长度或者大小
  • 作为数组的边界(如作为循环计数器)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1.内存管理
    • 1.切片长度校验
      • 2.指针判空
        • 3.整数安全
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档