Go语言使用unsafe.Pointer时如何判断指针是否为nil避免空指针引用错误
问题核心原因
你写的if byteAddr == nil判断逻辑本身是有效的,确实可以识别转换后的指针是否为0地址。你遇到崩溃的根本原因是你传入的0x34534地址本身不是nil,但属于当前进程无访问权限的非法地址,解引用这类非0的非法地址仍然会触发空指针类报错。
unsafe.Pointer场景的nil判断标准写法
如果要提前做nil判断,可以在转换指针前先校验uintptr类型的地址值是否为0,和转换后判断指针是否为nil的效果完全等价,可以按如下代码优化:
package main import ( "fmt" "unsafe" ) func main() { test := readByte(0x34534) fmt.Println(test) } func readByte(address uintptr) byte { // 提前判断是否为0地址(即nil指针) if address == 0 { return 0 } byteAddr := (*byte)(unsafe.Pointer(address)) // 可选保留双重校验,和上面的判断逻辑等价 if byteAddr == nil { return 0 } // 注意:此处仍可能崩溃,非0地址不代表当前进程有访问权限 return *byteAddr }
额外说明
- unsafe包绕过了Go原生的内存安全校验,所有操作的合法性都需要开发者自行保证,编译器不会做额外的权限、边界检查
- 硬编码内存地址的操作仅在你明确该地址属于当前进程可访问空间时才能正常运行,仅适用于内核开发、嵌入式编程等特定场景,普通用户态程序直接访问随机硬编码地址必然会触发崩溃
- Go本身没有提供判断任意内存地址是否可访问的原生能力,如果必须要做这类操作,需要额外捕获操作系统的SIGSEGV信号做异常处理,该方案属于非常规操作,不建议在生产代码中使用
内容的提问来源于stack exchange,提问作者Cystemz
相关产品推荐
相关产品推荐

