uchan note

プログラミングや電子工作の話題を書きます

プログラム解析の目的

来年からサイボウズ・ラボ株式会社に所属して研究活動をすることになりました。 研究テーマは今のところプログラム解析をやろうと思っています。 プログラム解析は初心者ですので勉強したことをブログにしてみます。

プログラム解析の目的の一つはデバッグ支援

プログラム解析はざっくり言えば,プログラムを解析して何らかの情報を得ることです。 プログラム解析の代表的な手法と応用先を知りたかったのでこの論文を読んでみました。

チュートリアルシリーズ『ソフトウェア工学の実証的アプローチ』第2回 プログラムの動的解析, コンピュータ ソフトウェア,Vol.29,No.1 (2012),pp.47-60

プログラムの動的解析はプログラムを実際に動作させ,その実行トレースを用いて解析を行う手法の総称です。

実行トレースを使うということは,必然的に解析したいバグを踏む必要があるということです。疑問だったのは,バグを実際に踏むことができるなら,別に動的解析手法を用いなくてもバグは見つけられるよな,ということでした。ではなぜ動的解析手法が必要なのでしょうか?

上記の論文を読んで分かったのは,動的解析手法の目的は「バグを見つけること」だけではなく,最終的には「バグを修正するまでの過程を支援すること」なのですね。バグの直接の原因がヌルポインタ参照だってことが分かったとして,ではなぜヌルポインタになってしまったのかを辿るのはかなり難しい場合があります。特に並行性に起因するバグの場合はバグの再現が困難で,原因特定はめちゃくちゃ難しいです。プログラム解析の手法を用いてデバッグを支援する,というのがプログラム解析手法の大きな目的の一つです。

プログラム解析の他の目的

プログラム解析の手法の多くは「バグのないプログラムを生成する」ということが真の目的だと思いますが,目的を細分化してみると次のようなものがあるようです(先の論文での分類。コロン:以降は私(uchan_nos)の意見)。

  • コードカバレッジ計算:プログラムのテストがカバーする割合を計算することでテストが十分かどうかの指標とする。
  • 振舞いの可視化:プログラムの動作を可視化してプログラム理解を支援する。
  • フェイズ検出:?
  • 統計的デバッギング:バグに関連しそうな文を特定することでデバッグ作業のとっかかりを作る。
  • 動的スライシング:注目する変数に影響を与えた文を特定することでバグ発見を支援する。
  • Capture & Replay:プログラムの入力値を記録し再生することで,バグを再現してデバッグ作業をやりやすくする。
  • プロトコルマイニング:注目するオブジェクトの使われ方(メソッドの呼び出され方の規則)を発見しプログラム理解を支援する。
  • 動的不変条件の検出:各変数の実行時の関係性(大小関係とか)を求めてプログラム理解を支援する。
  • Live Sequence Chart の抽出:?

まとめ

プログラム解析の技術はバグのないプログラムを作る,およびプログラムを理解するという目的を支援できる技術だということが分かりました。私が修士論文研究で作った C-Helper は C 言語初学者に向けた静的解析ツールでしたが,来年は一般のプログラムのバグを対象にしたプログラム解析の手法を勉強したり研究してみようと思っています。