在对 slice 进行操作时,必须判断长度是否合法,防止程序 panic。
// 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")
}
进行指针操作时,必须判断该指针是否为 nil,防止程序 panic,尤其在进行结构体Unmarshal 时。
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")
}
在进行数字运算操作时,需要做好长度限制,防止外部输入运算导致异常:
// 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)
}
以下场景必须严格进行长度限制: