動的コード分析とは?
静的コード分析との違いは何ですか (つまり、静的コード分析ではキャッチできないものをキャッチできます)?
境界チェックとメモリ分析について聞いたことがありますが、これらは何ですか?
動的分析を使用してチェックされるその他の項目は何ですか?
-アダム
動的コード分析とは?
静的コード分析との違いは何ですか (つまり、静的コード分析ではキャッチできないものをキャッチできます)?
境界チェックとメモリ分析について聞いたことがありますが、これらは何ですか?
動的分析を使用してチェックされるその他の項目は何ですか?
-アダム
簡単に言えば、静的分析はソースコードに基づいて情報を収集し、動的分析はシステム実行に基づいており、多くの場合、インストルメンテーションを使用しています。
市場には多くの動的分析ツールがありますが、最も悪名高いのはデバッガーです。一方で、それはまだアカデミックな研究分野です。ソフトウェア システムをよりよく理解するために動的解析を使用する方法を研究している研究者は数多くいます。依存関係の分析に特化した年次ワークショップがあります。
基本的に、実行せずにソフトウェアを分析する (静的) のではなく、実行中 (動的) にソフトウェアを分析するようにコードを計測します。2 つを比較するこの JavaOne プレゼンテーションも参照してください。Valgrindは、C の動的分析ツールの一例です。CoberturaやEMMAなどのコード カバレッジ ツールを Java 分析に使用することもできます。
ウィキペディアの動的プログラム分析の定義から:
動的プログラム分析とは、コンピュータ ソフトウェアから構築されたプログラムを実プロセッサまたは仮想プロセッサ上で実行することによって実行される、コンピュータ ソフトウェアの分析です (プログラムを実行せずに実行される分析は、静的コード分析として知られています)。動的プログラム分析ツールでは、特別なライブラリのロードや、プログラム コードの再コンパイルが必要になる場合があります。
あなたは「境界チェックとメモリ分析」の問題についての良い説明を求めました。
当社のメモリ安全性チェックツールは、実行時にメモリアクセスエラー(バッファオーバーラン、配列添え字エラー、不正なポインタ、割り当て/解放エラー)を監視するようにアプリケーションを計測します。リンクには、例を含む詳細な説明が含まれています。このSOの回答は、デッドスタックフレームへのポインターを持つ2つのプログラムと、CheckPointerがソースコードのエラーポイントを検出して報告する方法を示しています。
簡単な例:C(およびC ++)は、悪名高いことに配列へのアクセスをチェックせず、アクセスが配列の境界内にあるかどうかを確認します。利点:適切に設計されたプログラムは、本番モードでのそのようなチェックのコストを支払いません。欠点:バグのあるプログラムは配列の外側にあるものに触れる可能性があり、これは理解するのが非常に難しい動作を引き起こす可能性があります。したがって、バグのあるプログラムをデバッグするのは困難です。
メモリ安全性チェッカーのような動的計測ツールが行うことは、いくつかのメタデータをすべてのポインターに関連付け(たとえば、ポインターが「指す」もののタイプ、配列の場合は配列の境界)、チェックすることです。実行時に、配列のバインドに違反しているかどうかに関係なく、配列へのポインターを介したアクセス。このツールは、元のプログラムを変更して、生成されたメタデータを収集し(たとえば、配列が宣言されているスコープへのエントリ時、またはmalloc操作の結果など)、すべての配列参照でプログラムを変更します(両方で記述されます)。 as x [y]ここで、xまたはyは配列ポインターであり、値はある種の整数型です。同様に、*(x + y)!)でアクセスをチェックします。プログラムが実行され、範囲外アクセスを実行すると、チェックはエラーをキャッチし、それが検出された最初の場所で報告しました。[考えてみると、メタデータの収集とチェックのためのインストルメンテーションは、Cのような言語が持つ可能性のあるすべてのバリアントケースを処理するために、かなり巧妙でなければならないことに気付くでしょう。これを完全に機能させるのは実際には困難です)。
幸いなことに、このようなアクセスは早期に報告され、問題の検出とプログラムの修正が容易になりました。このようなツールは、実稼働での使用を目的としたものではありません。エラーがないことを確認するために、開発およびテスト中に使用します。エラーが検出されない場合は、通常のコンパイルを実行し、チェックなしでプログラムを実行します。
これは、動的分析ツールの非常に良い例です。テストは実行時に行われます。
境界チェック
これは、配列アクセスのランタイム チェックを意味します。メモリ アクセスとポインター演算に対する C の自由放任アプローチとは対照的に、Java や C# などの他の言語では、アクセスしようとしている要素が特定の配列に含まれているかどうかを実際にチェックします。