Skip to main content
QUICK REVIEW

[論文レビュー] Static Race Detection and Mutex Safety and Liveness for Go Programs

Julia Gabet, Nobuko Yoshida|arXiv (Cornell University)|Jan 1, 2020
Logic, programming, and type systems参考文献 26被引用数 4
ひとこと要約

本稿では、共有メモリとチャネル通信の両方の並行バグを一貫して検出できる、Go プログラムの静的検証フレームワークを初めて提示する。行動型と型レベルのモデル検査を用いて、データレース、デッドロック、ミューテックスの安全・ライブネス違反を検出する。Go の happens-before 関係を µ-カルキュラス型モデルで形式化することで、共有メモリおよびチャネル通信に起因する並行バグの静的で整合的な解析が可能になる。

ABSTRACT

Go is a popular concurrent programming language thanks to its ability to efficiently combine concurrency and systems programming. In Go programs, a number of concurrency bugs can be caused by a mixture of data races and communication problems. In this paper, we develop a theory based on behavioural types to statically detect data races and deadlocks in Go programs. We first specify lock safety/liveness and data race properties over a Go program model, using the happens-before relation defined in the Go memory model. We represent these properties of programs in a μ-calculus model of types, and validate them using type-level model-checking. We then extend the framework to account for Go’s channels, and implement a static verification tool which can detect concurrency errors. This is, to the best of our knowledge, the first static verification framework of this kind for the Go language, uniformly analysing concurrency errors caused by a mix of shared memory accesses and asynchronous message-passing communications.

研究の動機と目的

  • 共有メモリとメッセージパassingの両方の問題を統合的に扱う Go の並行バグ用の静的解析ツールの不足に対処すること。
  • 行動型システム内での happens-before 関係を用いて Go のメモリモデルを形式化すること。
  • Go プログラムにおける安全(データレース、デッドロック)とライブネス(ミューテックスの公平性)を一括して検査できる統合的静的検証フレームワークを構築すること。
  • mCRL2 を用いた型レベルのモデル検査により、スケーラブルで整合的な Go プログラムの検証を可能にすること。
  • Go の -race フラグのような動的レース検出器が抱える高コストと不完全検出という限界を克服すること。

提案手法

  • 共有メモリとチャネルを拡張したプロセス計算モデルを用いて、Go の並行処理の意味論を形式化する。
  • Go メモリモデルからの happens-before 関係を用いて、ロックの安全およびライブネスの性質を定義する。
  • プログラムの性質を行動型上の µ-カルキュラス式として表現し、静的検証を可能にする。
  • mCRL2 を用いた型レベルのモデル検査により、実行時オーバーヘッドなしに安全およびライブネスの性質を検証する。
  • Go のチャネルとゴルーチンの生成を含む動的プロセス生成に対応するようにフレームワークを拡張する。
  • Go コードを形式的 GoL に類似した中間言語に抽出するプロトタイプツールを実装する。

実験結果

リサーチクエスチョン

  • RQ1行動型と型レベルのモデル検査を用いて、Go プログラムにおけるデータレースとデッドロックを静的に検証できるか?
  • RQ2Go メモリモデルにおける happens-before 関係を形式的に符号化し、データレースおよびミューテックスの安全違反を検出するためにどのように利用できるか?
  • RQ3統合的静的解析フレームワークは、Go における共有メモリ並行処理とチャネルによるメッセージパassingを効果的に処理できるか?
  • RQ4本フレームワークは、Go の -race フラグのような動的レース検出器と比較して、精度とスケーラビリティにおいて優れているか?
  • RQ5本フレームワークは動的プロセス生成をサポートでき、検出されたバグに対して反例を提供できるか?

主な発見

  • 提示されたフレームワークは、統一された行動型モデルを用いて、Go プログラムにおけるデータレースとデッドロック/ライブネス問題の両方を静的に検証する最初のものである。
  • mCRL2 を用いた型レベルのモデル検査の使用により、実行時オーバーヘッドなしに整合的な検証が可能であり、ThreadSanitizer のような動的検出器とは異なり、その欠点を回避できる。
  • フレームワークは 図1 のデータレース(不適切な RWMutex 使用)を正しく検出し、 図2 の安全なバージョンを正しく同定している。
  • 本アプローチは、読み書きミューテックスとチャネルベース通信の両方をカバーしており、Go における広範な並行バグのクラスを網羅する。
  • ツールのプロトタイプは、実際の Go プログラムにおいて実現可能性と正しさを示しており、モデル検査による形式的検証が行われている。
  • 既存の動的検出器におけるギャップ、例えば履歴の制限や非ブロッキングバグにおける誤検出の欠如といった点を同定し、静的アプローチがそれらを克服するのに役立っている。

より良い研究を、今すぐ始めましょう

論文設計から論文執筆まで、研究時間を劇的に削減しましょう。

クレジットカード登録不要

このレビューはAIが作成し、人間の編集者が確認しました。