動的プログラム解析
静的解析と動的解析は相互に補完する技術である。例えば、プラットフォームやプログラミング言語を問わず、複数のスレッドが実行環境においてどのような順序で動作するかは一般的に非決定論的であり、静的解析では判断できないことが多く、マルチスレッド処理にまつわるバグは見落とすおそれがある。これを動的解析によって補う必要がある。
静的解析と動的解析を組み合わせることで、バグ検出の精度と速度が高まり、競合状態やデッドロック、リソースリークなど、実行してみないと表面化しない処理を徹底的に解析することができる。 静的解析、動的解析で発見できることは、モデル検査、証明系でより効率的に発見できることもある。これらの機能を動的解析の中に組み込んでいる場合もある。
プログラムを実行せずとも、つまり静的解析によって判断できることが多いほうが、プログラムの品質や安全性を担保しやすくなるが、プログラミング言語によって適用可能な解析手法の度合いが変わることもある。静的型付け言語は動的型付け言語よりも静的解析時に多くの情報を提供できる。Javaのように強く型付けされている言語では、型システムを無視した危険な変換を許さないため、型安全性を静的に保証しやすい。一方C/C++のように弱く型付けされている言語では、型システムを無視した危険な変換によってコンパイル時の型チェックをバイパスすることもできてしまい、プログラマが型安全性を容易に破壊することもできるため、型安全性に関しても静的解析と動的解析を併用する必要がある。JavaScriptに対するTypeScriptのように、静的解析を促進して安全性を強化し、大規模開発にも耐えうるものにするために、動的言語に対して静的型チェック機構を導入した事例も存在する。