Upgrade to Pro — share decks privately, control downloads, hide ads and more …

panicと向き合うGo開発 - nilawayで探る見逃されるnil参照とその対策

Avatar for Shoki Hata Shoki Hata
September 28, 2025
250

panicと向き合うGo開発 - nilawayで探る見逃されるnil参照とその対策

Goにおけるpanicは、ポインタがnilの状態でその先の値にアクセスしようとした際に発生するランタイムエラーです。発生条件はシンプルですが、どれだけ注意していても実行時に発生する可能性があります。これは大規模システムでも例外ではなく、時にはサービス停止といった深刻な障害を引き起こすこともあります。

実行前に潜在的なpanicとなる箇所を検出したいところですが、構文レベルの静的解析ではpanicを捉えられるケースは限られています。例えばGo公式ツールチェインに含まれるnilnessは、典型的で単純なnil参照パターン(例:if x == nil { print(*x) })は検出できます。しかし、関数やパッケージをまたいでnilが渡され、最終的にどこかで参照されてしまうような、実際の開発で気づきにくいケースは検出できません。
こうした限界を補うために登場したのが、静的解析ツールuber-go/nilaway(以下、nilaway) です。nilawayは、コード中のnilの発生と伝播を「nil の可能性フロー」としてモデル化し、2-SAT(充足可能性問題)と呼ばれるアルゴリズムを使って、より複雑なpanicのリスクを検出します。

本セッションでは、Go の開発現場でよくある panic を題材に、nilawayがその原因をどのように捉え、検出できるのかを、数式を使わず具体的なコード例を通じて解説します。panicが発生しうるメカニズムとその検出方法を理解することで、参加者の皆さんがGoのnilに対する言語仕様や、安全性を支える設計思想への理解を一段深めることを目指します。

Avatar for Shoki Hata

Shoki Hata

September 28, 2025
Tweet

Transcript

  1. 2 2 software engineer at Kanmu, Inc. Hata GitHub @sho-hata

    X @sho_hata_ 自己紹介 Go Conference 3年連続登壇! Goコミュニティに関われて嬉しいです ʕ◔ϖ◔ʔ
  2. 11 目次 INDEX 1. panicとnil参照の概要 2. nil参照を事前に検出することは難しい 3. 見逃される nilを検出するツール:

    nilawayの紹介 4. nilawayはどうやって nil参照を検出するのか 5. nil参照検出の限界とこれから
  3. 21 Go凖標準の nil参照チェックツール: nilness • go vet に含まれないスタンドアロンな静的解析ツール • 検証するスコープは関数

    • プログラムを静的単一代入形式( SSA)という走査グラフに 変換。nil変数を追跡して、 nil参照を検出 https://github.com/golang/tools/blob/master/go/analysis/passes/nilness/nilness.go#L53
  4. 40 ケース:net/http の Client.Do() の返り値: resp.Body func (c *Client) do(req

    *Request) ステータスコード 300台のときに errorがnil、Bodyがnilで返る仕様
  5. 45 参考資料 • 「Goのnil panicを防ぐ静的解析ツール:nilaway」 - zenn @sho-hata • 「NilAway:

    Practical Nil Panic Detection for Go」- Uber Engineering Blog • 「NilAway による静的解析で「10 億ドル」を節約する #kyotogo / Kyoto Go 56th」- @y_taka_23 • CVE-2020-29652 • G. Ramalingam. 1994. The undecidability of aliasing. ACM Trans. Program. Lang. Syst. 16, 5 (Sept. 1994), 1467–1471. https://doi.org/10.1145/186025.186041