Oracle® Developer Studio 12.5: Discover および Uncover ユーザーズガイド

印刷ビューの終了

更新: 2016 年 6 月
 
 

discover 使用時の制限事項

このセクションでは、discover 使用時の既知の制限事項について説明します。

注釈付きでないコードが原因で偽の結果になる

discover ユーティリティーは、バイナリの計測で説明されているコードのみを計測できます。未計測のコードは、バイナリにリンクされているアセンブリ言語コード、またはそのセクションに示されてるものより古いコンパイラまたはオペレーティングシステムでコンパイルされたモジュールから取得されている場合があります。関数が計測されない場合、その関数、呼び出し元、または呼び出し先のいずれかについて擬陽性のエラーメッセージが発行されることがあります。さらに、一部のエラーは、未計測の関数で診断されないことがあります。

discover ユーティリティーは、asm 文または .il テンプレートを含むアセンブリ言語モジュールまたは関数を計測できません。

さらに、Oracle Developer Studio コンパイラでは注釈データがコンパイルされないため、Oracle Developer Studio 12.5 の C++ 実行時ライブラリには注釈データが含まれていません。

機械命令はソースコードとは異なる場合がある

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 最適化レベルで生成されたコードには当てはまらない可能性があります。

–xlinkopt フラグでコンパイルされたバイナリは、discover と互換性がありません。

システムライブラリは報告されたエラーに影響を及ぼす可能性がある

システムライブラリは、オペレーティングシステムとともにインストール済みで、計測用に再度コンパイルできません。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)() 関数はサポートされていません。