動的プログラム解析(どうてきプログラムかいせき、)とは、ソフトウェア解析手法の一種であり、実際のあるいは仮想のプロセッサでプログラムを実行して解析を行うこと。動的解析を効率よく行うために、標的プログラムに十分な量のテストケースを入力し、興味深い動作を起こす。コードカバレッジ等のソフトウェアテスト技法を用いて、起こりうる動作を記述したソースコードの箇所を十分な量見つけ出すことができる。ただし、実行中の一時的な命令の効果を過小評価してしまうことに気をつける必要がある。

テストが不十分だと、ロケット「アリアン5」が初飛行でランタイムエラーにより機体が崩壊したDowson, M. (March 1997). "The Ariane 5 Software Failure". Software Engineering Notes 22 (2): 84. doi:10.1145/251880.251992ように、破局的な失敗をするおそれがある。

静的解析と動的解析 静的解析と動的解析は相互に補完する技術である。例えば、プラットフォームやプログラミング言語を問わず、複数のスレッドが実行環境においてどのような順序で動作するかは一般的に非決定論的であり、静的解析では判断できないことが多く、マルチスレッド処理にまつわるバグは見落とすおそれがある。これを動的解析によって補う必要がある。

静的解析と動的解析を組み合わせることで、バグ検出の精度と速度が高まり、競合状態やデッドロック、リソースリークなど、実行してみないと表面化しない処理を徹底的に解析することができるCoverity, Inc. 。 静的解析、動的解析で発見できることは、モデル検査、証明系でより効率的に発見できることもある。これらの機能を動的解析の中に組み込んでいる場合もある。

プログラムを実行せずとも、つまり静的解析によって判断できることが多いほうが、プログラムの品質や安全性を担保しやすくなるが、プログラミング言語によって適用可能な解析手法の度合いが変わることもある。静的型付き言語は動的型付き言語よりも静的解析時に多くの情報を提供できる。Javaのように強く型付けされている言語では、型システムを無視した危険な変換を許さないため、型安全性を静的に保証しやすい強く型付けされているJavaの理解に必修の“型変換”:【改訂版】Eclipseではじめるプログラミング(18)(2/3 ページ) - @IT。一方C/C++のように弱く型付けされている言語では、型システムを無視した危険な変換によってコンパイル時の型チェックをバイパスすることもできてしまい、プログラマが型安全性を容易に破壊することもできるため、型安全性に関しても静的解析と動的解析を併用する必要がある。JavaScriptに対するTypeScriptのように、静的解析を促進して安全性を強化し、大規模開発にも耐えうるものにするために、動的言語に対して静的型チェック機構を導入した事例も存在する静的型チェックを行うTypeScriptで品質を担保しよう (1/3)|CodeZine(コードジン)。

動的解析ツール 動的解析の実装方法にはコンパイル時の(コンパイラ内蔵のものなど)、動的ライブラリの差し替えやフック(malloc差し替えなど)、動的バイナリ計装(やDynInstなど)などがある。

メモリエラー検出

Clang の AddressSanitizer (ASan) GCC の AddressSanitizer (-fsanitize=address) Visual Studio の AddressSanitizerAddressSanitizer - Microsoft Learn Microsoft/fsanitize (Enable sanitizers) - Microsoft Learn Microsoft - はの一部。 - メモリリークの検出にも対応している。 Valgrind の Memcheck - メモリリークの検出にも対応している。 Perforce TotalView の MemoryScape - 元製

Dr. Memory

メモリリーク検出 Clang の LeakSanitizer (LSan) GCC の LeakSanitizer (-fsanitize=leak)

スレッドエラー検出 Clang の ThreadSanitizer (TSan) GCC の ThreadSanitizer (-fsanitize=thread)Using AddressSanitizer & ThreadSanitizer In GCC 4.8 Phoronx 2012年11月30日 Valgrind の Helgrind Valgrind の DRD

未定義動作検出 Clang UndefinedBehaviorSanitizer(UBSan) GCC Undefined Behavior Sanitizer (-fsanitize=undefined)Bringing Major Features, GCC 4.9 RC1 Has Been Released Phoronix 2014年4月11日

セキュリティ解析

性能解析

テストカバレッジ計測(テスト漏れ検出)

その他 ClearSQL - PL/SQL - 不変条件検出

開発停止中 Avalanche CodeDynamics - Intel Thread CheckerおよびIntel Parallel Inspectorの後継であった。開発終了となったDiscontinued: Intel Inspector Intel。 - Visual Basic向け。

脚注

関連項目 静的コード解析 ファジング フォールトインジェクション 性能解析 Dynamic Application Security Testing(DAST)