Discover は、「「バイナリは正しく準備される必要がある」」の説明に従って準備されているコードのみを計測できます。注釈の付いていないコードは、バイナリにリンクされているアセンブリ言語コード、またはそのセクションに示されてるものより古いコンパイラまたはオペレーティングシステムでコンパイルされたモジュールから来ている場合があります。
準備から特別に除外されているのは、asm 文または .il テンプレートを含むアセンブリ言語モジュールおよび関数です。
Discover は機械コード上で動作します。ツールは、ロードやストアなどの機械命令でエラーを検出し、それらのエラーをソースコードと相互に関連付けます。一部のソースコード文は関連付けられている機械命令がないため、Discover は明白なユーザーエラーを検出していないように思われる場合があります。たとえば、次の C コードフラグメントを考えてみましょう:
int *p = (int *)malloc(sizeof(int)); int i; i = *p; /* compiler may not generate code for this statement */ printf("Hello World!\n"); return;
p で示されたアドレスに格納された値を読み取ることは、メモリーが初期化されていないため、潜在的なユーザーエラーとなります。ただし、最適化コンパイラは、変数 i が使用さていないことを検出するため、メモリーから読み取り、i に割り当てる文のコードは、生成されません。この場合、Discover は非初期化メモリーの使用 (UMR) を報告しません。
コンパイラの生成コードは常に想定どおりになるわけではありません。コンパイラが生成するコードは、-On 最適化オプションを含む、使用するコンパイラオプションによって異なるため、Discover によって報告されるエラーも異なる可能性があります。たとえば、-O1 最適化レベルで生成されたコードで報告されるレポートは、-O4 最適化レベルで生成されたコードによって非表示になる可能性があります。
システムライブラリは、オペレーティングシステムとともにインストール済みで、計測用に再度コンパイルできません。Discover は、標準の C ライブラリ (libc.so) からの一般的な関数に対するサポートを提供します。すなわち、Discover これらの関数によってどのメモリーにアクセスされ、どのメモリーが変更されるかを把握しています。ただし、アプリケーションが他のシステムライブラリを使用する場合、Discover レポートで擬陽性を検出する可能性がありあす。擬陽性が報告される場合、コードから Discover API を呼び出してそれらを削除できます。
Discover は、malloc()、calloc()、free()、operator new()、および operator delete() などの標準のプログラミング言語メカニズムによって割り当てられている場合にヒープメモリーを検出できます。
アプリケーションが標準の関数の最上部で動作するカスタムメモリー管理システム (たとえば、malloc() とともに実装されるプール割り当て管理) を使用する場合、Discover は機能しますが、適切なリークの報告や、解放されたメモリーへのアクセスは保証されていません。
Discover は、次のメモリーアロケータをサポートしていません:
brk(2)() または sbrk(2)() システム呼び出しを直接使用するカスタムヒープアロケータ
バイナリに静的にリンクされた標準のヒープ管理関数
mmap(2)() および shmget(2)() システム呼び出しを使用してユーザーコードから割り当てられたメモリー
sigaltstack(2)() 関数はサポートされていません。
配列範囲を検出するため Discover が使用するアルゴリズムのため、静的および自動 (ローカル) 配列の範囲外アクセスエラーを検出することはできません。動的に割り当てられた配列のエラーのみ検出できます。