如何在 Go 中防止恐慌

这是一个关于如何在 Go 中防止恐慌的三部分系列的第二部分,主要内容如下:

  • 以在自动驾驶汽车中遇到障碍为例,引出在 NGINX Ingress Controller 中缺失 Go 测试可能导致数千个 Kubernetes 集群面临风险的问题。
  • 介绍创建策略(Policy)的过程,包括指定策略类型、API 密钥位置和 Secret 名称等,并通过kubectljq工具查看 Policy 对象的 JSON 格式。
  • 上传 Policy 对象到集群会触发验证过程,包括运行 Go 函数检查策略是否有效,函数位于validation包中。
  • 当策略有效时,Ingress Controller 日志中无错误或警告;当策略无效时,不应导致 Ingress Controller 崩溃,而应收到错误通知,但实际会导致 Go 运行时恐慌。
  • 分析 Ingress Controller 恐慌后的堆栈跟踪,发现 Go 运行时指出存在无效内存地址或空指针引用的错误,指向github.com/nginxinc/kubernetes-ingress/pkg/apis/configuration/validation.validateAPIKey函数和policy.go:297行。
  • 该验证函数假设SuppliedIn结构体不为nil,必须有QueryHeader的值,但实际上函数未检查所需字段是否存在,导致 Go 运行时恐慌,且没有单元测试。
  • 接下来将在How to Write Better Tests in Go中以测试优先的思维设计验证器,以解决此问题。
阅读 5
0 条评论