動的プログラム解析とは、プログラムを実行することを伴うソフトウェア解析のことである。一方、静的プログラム解析はプログラムを実行しない。
分析は、動作、テストカバレッジ、パフォーマンス、セキュリティなど、ソフトウェアのさまざまな側面に焦点を当てることができます。
効果的なテストを行うには、対象となるプログラムを、考えられる入力と出力の範囲に対応できる十分なテスト入力[ 1 ]で実行する必要があります。コードカバレッジなどのソフトウェアテスト手法や、ミューテーションテストなどのツールは、テストが不十分な箇所を特定するために使用されます。
テストコードカバレッジを計算することで、テストされていないコードを特定できます。
この分析ではテストされていないコードを特定できますが、テスト済みのコードが適切にテストされているかどうかは判断できません。テストで正しい動作が検証されていなくても、コードが実行される場合があります。
動的テストとは、一連のテストケースに対してプログラムを実行することです。
ファジングとは、様々な入力に対してプログラムを実行するテスト手法であり、多くの場合、これらの入力は(少なくとも部分的に)ランダムに生成されます。グレーボックスファザーは、コードカバレッジを利用して入力生成を誘導します。
動的シンボリック実行(DSEまたはコンコリック実行とも呼ばれる)では、具体的な入力に対してテストプログラムを実行し、実行に関連付けられたパス制約を収集し、制約ソルバー(一般的にはSMT ソルバー)を使用して、プログラムが異なる制御フロー パスをたどるようにする新しい入力を生成し、テスト スイートのコード カバレッジを向上させます。[ 3 ] DSE は、ファジング(「ホワイト ボックス」ファジング)の一種と考えることができます。
動的データフロー分析は、情報源からシンクへの情報の流れを追跡します。動的データフロー分析の形式には、動的汚染分析や動的シンボリック実行などがあります。[ 4 ] [ 5 ]
Daikonは、動的不変条件検出の実装です。Daikonはプログラムを実行し、プログラムが計算する値を観察し、観察された実行中に真であった特性、つまりすべての実行において真である可能性が高い特性を報告します。
動的解析は、セキュリティ上の問題を検出するために使用できる。
プログラムの動作の特定部分集合に対して、プログラムスライシングとは、選択した動作を依然として生成する最小限の形式にプログラムを縮小することです。縮小されたプログラムは「スライス」と呼ばれ、指定された動作部分集合の範囲内で元のプログラムを忠実に表現したものです。一般的に、スライスを見つけることは解決不可能な問題ですが、一連の変数の値に基づいて対象となる動作部分集合を指定することで、データフローアルゴリズムを使用して近似スライスを取得することが可能です。これらのスライスは通常、開発者がデバッグ中にエラーの原因を特定するために使用します。
ほとんどのパフォーマンス分析ツールは、動的プログラム分析の手法を使用しています。
ほとんどの動的解析は、計測または変換を伴う。
計測機器は実行時のパフォーマンスに影響を与える可能性があるため、パフォーマンスの問題を誤って特定しないように、テスト結果の解釈においてはこの点を考慮する必要がある。
DynInstは、動的プログラム解析プローブの開発とコンパイル済み実行ファイルへの適用に役立つランタイムコードパッチライブラリです。DynInstは一般的にソースコードや再コンパイルを必要としませんが、デバッグシンボルが削除されていない実行ファイルやデバッグシンボル付きの実行ファイルの方が計測が容易です。
Iroh.jsは、 JavaScript用のランタイムコード分析ライブラリです。コードの実行パスを追跡し、特定の実行コードパターンを検出するためのランタイムリスナーを提供し、プログラムの実行動作の傍受と操作を可能にします。