6

このトピックに関するいくつかの質問を見つけましたが、それらすべてに多くの参考文献が含まれていますが、参考文献のほとんどは具体的なツールについて述べており、一般的な分析の概念については述べていないため、まだ明確な考えがありません。したがって、いくつか質問があります。

静的分析について: 1. どの手法が成功しており、現在より関連性が高いかについての参考文献または概要を知りたいです。2. バグを発見することに関して、彼らは実際に何ができるでしょうか? 要約を作成できますか? それはツールに依存していますか?

シンボリック実行について: 1. シンボリック実行をどこで囲むことができますか? アプローチに応じて、それらが動的分析なのか、それとも静的分析と動的分析の混合なのかを判断できる場合は知りたいと思います。

ツールの 2 つの異なる手法を区別する問題を見つけましたが、理論的な違いはわかっていると思います。

私は実際にCで作業しています事前に感謝します

4

2 に答える 2

8

私は短い答えを出そうとしています:

静的分析では、コードの構文構造を調べて、プログラムの動作に関する結論を導き出します。これらの結論は常に正しいとは限りません。

静的分析の典型的な例はデータ フロー分析で、ステートメントごとusedに 、read、などのセットを計算します。writeこれは、初期化されていない値などを見つけるのに役立ちます。

コードパターンに関するコードを分析することもできます。このように、これらのツールを使用して、特定のコーディング標準に準拠しているかどうかを確認できます。代表的なコーディング標準の例は MISRA です。このコーディング標準は、安全性が重要なシステムに使用され、C で問題のある構造を回避します。このようにして、メモリ リークやダングリング ポインターなどに対するアプリケーションの堅牢性について、すでに多くのことを言うことができます。

動的分析では、構文だけを見るのではなく、状態情報を考慮に入れます。シンボリック実行では、すべての変数の可能な値に関する仮定をステートメントに追加しています。

動的分析の最も高価で強力な方法は、システムのすべての可能な実行状態を実際に確認するモデル チェックです。モデルでチェックされたシステムは、100% のカバレッジでテストされたシステムと考えることができますが、もちろん、実際のシステムをそのようにチェックすることを妨げる実際的な問題がたくさんあります。

これらのメソッドは非常に強力であり、特に優れたコーディング標準と組み合わせると、静的コード分析ツールから多くを得ることができます。

私のソフトウェア チームが非常に印象的だと感じた機能は、たとえば、仮想メソッドを持つクラスに仮想デストラクタがない場合に C++ で通知されることです。実際に確認するのは簡単ですが、本当に役に立ちます。

商用ツールは非常に高価ですが、使用方法を習得すれば、それだけの価値があります。最初の典型的な問題は、多くの誤った警告が表示され、本当の問題をどこで探すべきかわからないことです。

現在、g++ にはこの機能の一部が既に組み込まれており、無料の pclint などを使用できることに注意してください。

申し訳ありませんが、これはすでにかなり長くなってしまいました...興味深いものになることを願っています。

于 2012-10-14T17:42:02.820 に答える
3

「静的分析」という用語は、分析が実際にコードを実行しないことを意味します。一方、「動的分析」はコードを実行し、いくつかの種類の実際のテスト入力も必要とします。それが定義です。これ以上何もない。

静的解析では、抽象解釈、モデル チェック、シンボリック実行など、さまざまな形式手法が使用されます。一般に、ソフトウェアの検証には抽象解釈またはモデル チェックが適しています。バグの発見には、シンボリック実行の方が適しています。

シンボリック実行静的解析に分類されます。ただし、シンボリック実行と動的テストの両方を使用するコンコリック実行と呼ばれるハイブリッドな方法があります。

Zane のコメントに追加:

私の説明が少しわかりにくかったのかもしれません。

ソフトウェアの検証とバグの発見の違いは、分析が正しいかどうかです。たとえば、バッファー オーバーラン アナライザーが適切であると言う場合、それはアナライザーが考えられるすべてのバッファー オーバーランを報告する必要があることを意味します。アナライザーが何も報告しない場合は、ターゲット プログラムにバッファー オーバーランがないことを証明します。モデルチェックは健全性を保証する手法であるため、主にソフトウェアの検証に使用されます。

一方、今日の最も商業的な静的アナライザーで積極的に使用されているシンボリック実行は、健全性を保証しません。バグを発見するためには、真陽性がいくつか失われたとしても、偽陽性を減らすことがより重要です。

要約すれば、

  • 健全性: 偽陰性がない

  • 完全性: 誤検知はありません

  • ソフトウェアの検証: 健全性は完全性よりも重要です

  • バグの発見: 完全性は健全性よりも重要です

于 2015-03-12T06:09:45.710 に答える