EN JP CN

Java 解析のチューニング

Java 解析のチューニング

Java 解析のチューニング

Java 解析のチューニング

knowledge base (ナレッジベース) ファイルは、次の目的のために、Java Path チェッカーにコードシステムに関する詳細コンテキストを提供することで、特定チェッカーをカスタム化するためのメカニズムです。

  • Klocwork 解析結果における誤検知を低減
  • 問題のある特定指摘の報告を増加

Java knowledge base (ナレッジベース) ファイル (.jkb) を使用してソースをマークアップし、以下のために必要なコンテキストをこれらのチェッカーに提供します。

  • 指定されたコードパスに沿った特定指摘の有効性を評価して、誤検知を低減
  • これまで検出されなかった対象の指摘 (未検知) を検出するために、考慮する必要があるコードパスを特定

Java Path knowledge base (ナレッジベース) ファイルは JKB 形式で記述されます。 これは Java に似た knowledge base (ナレッジベース) 指定用の宣言型言語です。

誤検知を低減するには、Klocwork 解析結果のトレースバック機能を使用して、目的を達成するために .jkb ファイルに含めるソースを特定できます。

誤検知を低減するためのチューニングは、最も一般的なチューニングシナリオです。未検知を低減するためのチューニングは、どちらかというと拡張性の活動です。独自の Java Path チェッカーの作成の詳細については、Java Path チェッカーの作成 を参照してください。

注: チューニングは Java Path チェッカーのみに可能です。

チューニングの変更内容を有効にするには、全ビルド完 解析を実行する必要があります。

Java knowledge base (ナレッジベース) (JKB)

Java knowledge base (ナレッジベース) (.jkb) ファイルは、指定された Klocwork 指摘チェッカーをチューニングして Java 解析結果の誤検知 (またはよりまれな未検知) を低減するメカニズムです。

独自の Java Path チェッカーを作成する場合も、JKB ファイルが関係します。

JKB ファイルには、チェッカーの考慮事項に追加するか、考慮事項から排除する必要があるコードパスが含まれます。

Klocwork トレースバックは、チェッカーの考慮事項に追加するか、考慮事項から排除するコードパスの条件の判断に役立ちます。

条件を特定した後は、以下を含む JKB ファイルを使用してエンジンに条件を通信する必要があります。

  • 対象のメソッド
  • 次のようなアイテムの処理方法を示す JKB の注釈
  • @Bind (チューニングするチェッカーを指定)
  • @Check、@CheckTrue、@CheckFalse、および @Wipe (誤検知を低減するためのデータ検証を指定)
  • @Source、@Sink、および @Prop (追加指摘を報告)
注: JKB ファイルはプロジェクトのワークスペースから作成できるため、インポートする必要はありません。

注釈の詳細については、Java knowledge base (ナレッジベース) リファレンスを参照してください。

Java knowledge base (ナレッジベース) チューニングワークフロー図

JKB ファイルの作成

  1. [Klocwork for Java] ビューの指摘をクリックして、ソースコード表示で指摘をハイライト表示します(右下のトレースバック情報を使用して対象のメソッドをハイライト表示することもできます)。
  2. 目的のメソッドにカーソルを合わせ、電球アイコンをクリックするか、<Alt+Enter> キーを押します。
  3. [knowledge base (ナレッジベース) に追加する] または [knowledge base (ナレッジベース) に追加する (ダイアログの表示)] を選択します。ダイアログにより、注釈を付けるメソッドと使用する注釈 (またはエントリ) の種類を選択できます。このダイアログを使用しない場合は、注釈を手動で付加することができます。
    ヒント: [構造] ビューでメソッドを右クリックすることもできます。
    選択したメソッドが末尾に追加された default_tuning.jkb ファイルがプロジェクトまたはワークスペースに作成され、手動で必要な注釈を追加することができます。
    ヒント: 複数のメソッドを一度に追加するには、<Ctrl+click> または <Shift+click> を使用します。
  4. [Klocwork knowledge base (ナレッジベース) エントリの設定] ダイアログに情報を追加します。
    1. 既に入力されていない場合は、チェッカーコードを入力します ([Klocwork for Java] ビューで指摘をクリックしてエディターにアクセスした場合は、チェッカーコードが自動的に入力されます)。ここに入力した値は、自動的に @Bind 注釈に入力されます。
    2. knowledge base (ナレッジベース) エントリのタイプを選択します。詳細については、Java knowledge base (ナレッジベース) リファレンスを参照してください。
    3. 注釈を付加するメソッドを選択します。
  5. 解析を再実行して JKB ファイルをテストします。

JKB ファイルの編集

JKB ファイルは、次のいずれかの方法でプロジェクト内で (エクスポートやインポートを行う必要なく) 編集することができます

  • 上の JKB ファイルの作成手順に従います。プロジェクトに既に JKB ファイルが存在する場合、そのファイルが開かれ、新しく選択したメソッドが既存ファイルに追加されます。
  • [ファイル] > [設定] > [プロジェクト設定] > [Klocwork for Java] の順に選択して構成設定にアクセスします。knowledge base (ナレッジベース) セクションの隣の [編集] をクリックします。プロジェクトに複数の JKB ファイルが存在する場合、ダイアログでいずれかを選択するよう要求されます。

Eclipse での Java 解析のチューニング

この記事では、Eclipse でソースコードに対して解析をチューニングする方法について示します。解析のカスタマイズを行う理由または時期については、

デスクトップ解析のカスタマイズ.

一般的なチューニング情報については、

Java 解析のチューニング.

Eclipse での Java knowledge base (ナレッジベース) ファイルの作成

Java knowledge base (ナレッジベース) (JKB) ファイルには、エディター、パッケージエクスプローラー、または [概要] ビューからメソッドを追加できます。

  1. ワークスペースではなくプロジェクトの JKB ファイルを作成するには、最初にプロジェクトの固有設定を有効にする必要があります (プロジェクトを右クリックして [プロパティ] > [Klocwork] の順にクリックし、[プロジェクト固有の設定を有効にする] を選択します)。
  2. [Klocwork 指摘] ビューの指摘をダブルクリックして、ソースコード表示で指摘をハイライト表示します([Klocwork の詳細] ビューのトレースバック情報を使用して対象のメソッドをハイライト表示することもできます)。
  3. エディターでメソッドを右クリックして、[Klocwork] > [knowledge base (ナレッジベース) に追加する] を選択します。
  4. 適切な JKB 注釈を付加してファイルを保存します。
  5. Klocwork 解析を再実行して JKB ファイルをテストします。

例:Eclipse でのチューニング

次の例では、NPE.RET が検出されています。フィールドは get() から null が返され、o.toString() で逆参照されています。Klocworkでは、assertNotNull の呼び出しが有効なメソッドとして認識されません。

トレースバックでは、指摘に関する詳細情報が得られ、対象のメソッドをより的確に特定するために役立ちます。

Image:NPE.RET_traceback_Eclipse_J.png

Eclipse で NPE.RET をチューニングするには:

  1. assertNotNull をダブルクリックした後、右クリックして [Klocwork] > [knowledge base (ナレッジベース) に追加する] を選択します。
  2. 以下を追加する必要があります。
    • チューニングする指摘のタイプを特定するための @Bind 注釈
    • メソッドをチェックとして記述するための @Check 注釈
package junit.framework;
  @Bind("NPE.RET")
 public class Assert {
   public static void assertNotNull(@Check java.lang.Object object);
}

次のステップ:次のステップ:プロジェクトを選択し、 をクリックして解析を再実行します。NPE.RET が検出されないようになります。

IntelliJ IDEA での Java 解析のチューニング

この記事では、IntelliJ IDEA から Klocwork 解析をチューニングする方法について説明します。解析をチューニングする理由または時期については、デスクトップ解析のカスタマイズ を参照してください。

ウォークスルー:NPE.RET 誤検知の処理次の例では、NPE.RET が検出されています。

次の例では、NPE.RET が検出されています。フィールドは 'get()' から null が返され、'o.toString()' で逆参照されています。Klocwork では、'assertNotNull' の呼び出しが有効なメソッドとして認識されないために、NPE.RET が検出されます。

トレースバックでは、指摘に関する詳細情報が得られ、対象のメソッドを特定するために役立ちます。

誤検知に対応するために、Java knowledge base (ナレッジベース) の@Bind および @Check という 2 つの注釈を追加します。

  1. エディターで assertNotNull を選択します。
  2. アイコンをクリックするか、<Alt+Enter> キーを押して、JKB ファイルにメソッドを追加します。
    JKB ファイルが作成され、default_tuning.jkbという名前が付けられます。ファイルの最後に、前の手順で選択したメソッドが追加されます。
  3. 以下を追加する必要があります。
    • チューニングするチェッカーを特定するための@Bind 注釈
    • メソッドをチェックとして記述するための @Check 注釈
    package junit.framework;
    @Bind("NPE.RET")
    public class Assert
    public static void assertNotNull(@Check java.lang.Object object);
    }
  4. 解析を再実行します。 をクリックします。NPE.RET が検出されないようになります。

JKB 注釈エラーのトラブルシューティング

"Build contains errors" というエラーメッセージが表示される場合は、メッセージ行をダブルクリックしてエディターでビルドログを開きます(ビルドログで詳細なメッセージを表示するには、水平スクロールバーを使用する必要があるかもしれません)。

ビルドログのメッセージには、JKB 注釈エラーが特定されています。たとえば、Trying to create a record not bound to a defect というメッセージは、@Bind 注釈が欠けているか、配置が不適切なことを示します。注釈の詳細については、Java knowledge base (ナレッジベース) リファレンスを参照してください。

チュートリアル - Java 解析のチューニング

チュートリアル 1 ~ 3 では、誤検知の低減というチューニングの最も一般的な理由について示しています。3 つのチュートリアルでは、以下について説明しています。

  • 検出された指摘を修正するための検証ルーチンの追加
  • 指摘のレポートを低減するための、knowledge base (ナレッジベース) (.jkb) ファイルへの @CheckTrue、@CheckFalse、および @Check を使用した検証の指定

チュートリアル 4 は、最初に報告されなかった指摘を検出するためのチェッカーのチューニングという、一番まれなシナリオについて説明しています。このチュートリアルでは、以前に報告されなかった実行時例外を検出するために、@Source、@Sink、および @Prop の knowledge base (ナレッジベース) 注釈 を使用しています。