私は短い答えを出そうとしています:
静的分析では、コードの構文構造を調べて、プログラムの動作に関する結論を導き出します。これらの結論は常に正しいとは限りません。
静的分析の典型的な例はデータ フロー分析で、ステートメントごとused
に 、read
、などのセットを計算します。write
これは、初期化されていない値などを見つけるのに役立ちます。
コードパターンに関するコードを分析することもできます。このように、これらのツールを使用して、特定のコーディング標準に準拠しているかどうかを確認できます。代表的なコーディング標準の例は MISRA です。このコーディング標準は、安全性が重要なシステムに使用され、C で問題のある構造を回避します。このようにして、メモリ リークやダングリング ポインターなどに対するアプリケーションの堅牢性について、すでに多くのことを言うことができます。
動的分析では、構文だけを見るのではなく、状態情報を考慮に入れます。シンボリック実行では、すべての変数の可能な値に関する仮定をステートメントに追加しています。
動的分析の最も高価で強力な方法は、システムのすべての可能な実行状態を実際に確認するモデル チェックです。モデルでチェックされたシステムは、100% のカバレッジでテストされたシステムと考えることができますが、もちろん、実際のシステムをそのようにチェックすることを妨げる実際的な問題がたくさんあります。
これらのメソッドは非常に強力であり、特に優れたコーディング標準と組み合わせると、静的コード分析ツールから多くを得ることができます。
私のソフトウェア チームが非常に印象的だと感じた機能は、たとえば、仮想メソッドを持つクラスに仮想デストラクタがない場合に C++ で通知されることです。実際に確認するのは簡単ですが、本当に役に立ちます。
商用ツールは非常に高価ですが、使用方法を習得すれば、それだけの価値があります。最初の典型的な問題は、多くの誤った警告が表示され、本当の問題をどこで探すべきかわからないことです。
現在、g++ にはこの機能の一部が既に組み込まれており、無料の pclint などを使用できることに注意してください。
申し訳ありませんが、これはすでにかなり長くなってしまいました...興味深いものになることを願っています。