EN JP CN

knowledge base (ナレッジベース) による Java 解析のチューニング

knowledge base (ナレッジベース) による Java 解析のチューニング

knowledge base (ナレッジベース) による Java 解析のチューニング

knowledge base (ナレッジベース) による Java 解析のチューニング

これは、主要な Java 解析のチューニング手順です。チュートリアルを含む詳細については、Java 解析のチューニング を参照してください。

問題の診断と宣言

問題の診断

一般的に、チューニングプロセスを開始するのは誤検知という厄介な状況のためです。

たとえば、解析結果に NPE.RET などの指摘とは考えられない特定の指摘のタイプが継続的にリストされる場合があります。このような場合は、Klocwork トレースバック機能から診断を開始することができます。以下は、Klocwork Desktop Java Plug-in for Eclipse のスクリーンショットです。

Image:NPE.RET_traceback_Eclipse_J.png

注: Klocwork Desktop Java Plug-in for Eclipse および Klocwork Desktop Java Plug-in for IntelliJ IDEA を使用すると、IDE から直接 Java knowledge base (ナレッジベース) (JKB) ファイルを作成および編集できます。Eclipse または IntelliJ IDEA からのチューニングを参照してください。

指摘に関して利用できる Klocwork トレースバック情報を調べたときに、トレースバックまたはその近くに検証箇所があることに気付いても、その指摘が依然として検出される場合があります。

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

誤検知を低減するために考慮すべき他の条件は、検証ライブラリ、アサートライブラリ、終了ライブラリ、または例外ライブラリの特定です。

条件を特定した後は、Java knowledge base (ナレッジベース) ファイル (.jkb) を使用してエンジンに条件を通信する必要があります。

.jkb ファイルでの条件の宣言

Java knowledge base (ナレッジベース) ファイルを使用して、データフローの条件についてチェッカーに学習させます。拡張子が .jkb の単純なテキストファイルでチェッカーに対して条件を '宣言' します。それには、対象のメソッドをインクルードしてから、特定の Java knowledge base (ナレッジベース) (JKB) 注釈を使用して、マークアップすることで処理方法を指定します。

誤検知を低減するために使用される最も一般的なチューニングのための注釈は @CheckTrue、@CheckFalse、および @Check です。誤検知を低減する場合にも、追加指摘を検出する場合にも必要なチューニングのための注釈は @Bind です。これは、クラス内の指定メソッドまたはすべてのメソッド (ファイル内のバインドの配置場所に依存) を指定チェッカーにリンクします。

解析をチューニングするために .jkb ファイルを作成する場合は、作成できる .jkb ファイルの数に大きな柔軟性があります。クラスごとに 1 つの .jkb を作成できます。このガイドの例とチュートリアルでは、このセットアップを使用しています。

検証に対して 1 つの .jkb を作成し、セキュリティに 1 つの .jkb を作成できます。さらに、一時的手段としてパッケージステートメントを使用してプロジェクト全体にマルチセクションの knowledge base (ナレッジベース) を作成できます。

Eclipse または IntelliJ IDEA からのチューニング

Klocwork Desktop Java Plug-in for Eclipse および Klocwork Desktop Java Plug-in for IntelliJ IDEA を使用すると、エディターから Java knowledge base (ナレッジベース) ファイルを作成できます。選択したメソッドが JKB ファイルにコピーされるため、ここに適切な JKB 注釈を付加します。JKB ファイルが作成されると、プロジェクトまたはワークスペースに含まれるようになるため、インポートの必要がありません。

Eclipse では、[概要] ビューで JKB ファイルに複数のメソッドを選択できます。IntelliJ IDEA では、[構造] ビューから複数のメソッドを選択します。

Java knowledge base (ナレッジベース) のチューニングの概要

指摘 (チェッカー) および条件を特定した後は、次の手順でチェッカーに通知して防止する必要があります。

  1. 拡張子 .jkb のテキストファイルを作成します。
  2. テキストファイルにメソッドシグネチャを記述します。
  3. @CheckTrue などの knowledge base (ナレッジベース) 注釈を付加します。チューニングに一般的に使用される Java knowledge base (ナレッジベース) レコードに関する詳細については、Knowledge base (ナレッジベース) 注釈を参照してください。
  4. @Bind 注釈などを使用してレコードをチェッカーにバインドします。
  5. knowledge base (ナレッジベース) をプロジェクトにインポートします。
  6. kwcheck で knowledge base (ナレッジベース) をテストします。
  7. 必要に応じてメソッドや注釈を編集します。
  8. 別のメソッドを追加し、注釈を付け、チェッカーにバインドします。
  9. 結果に満足するまでテストします。
  10. 新しい knowledge base (ナレッジベース) を使用および共有します。

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

knowledge base (ナレッジベース) ファイルを作成する前に、クラスごとに 1 つの .jkb を作成するか (このガイドのチュートリアルと例ではこのアプローチを使用しています)、検証やセキュリティなどに 1 つの .jkb を作成するかを決定する必要があります。

さらに、マルチセクションの knowledge base (ナレッジベース) ファイルにプロジェクト全体のためのマルチセクションの .jkb を作成できます。詳細については、以下の「マルチセクション knowledge base (ナレッジベース) の使用」を参照してください。

knowledge base (ナレッジベース) ファイルを手動作成 (または編集) するには:

  1. 拡張子 .jkb の新規テキストファイルを作成します。
  2. 好みのエディターで、チェッカーに対して特定する必要のあるメソッドシグネチャを追加し、Knowledge base (ナレッジベース) 注釈の手順で注釈を付加して、それぞれの処理方法をチェッカーに指示します。各注釈をファイルの 1 行に指定します。

マルチセクション knowledge base (ナレッジベース) の使用

Java ソースファイルには 1 つのパッケージ宣言のみを指定することができ、import ブロックの完了後は import をオーバーライドできません。これはモジュール性の高い Java ソースコードに最適ですが、プロジェクトまたはライブラリ全体に対して knowledge base (ナレッジベース) を指定する場合の knowledge base (ナレッジベース) には不適切になります。

.jkb ファイルには複数のパッケージ宣言を使用できます。これらのパッケージ宣言は、.jkb ファイルを個別のパッケージ宣言およびインポート宣言としてマルチセクションに分割します。

package java.util;


import java.util.*;

interface Entry<K,V> {  
   @Source("return") K getKey();
}

package java.io; // Here starts another section

import java.net.URI;
import java.net.URL;

public class File {  
   @Source("return") int getPrefixLength();
}

import javax.swing.*; // Here starts another section

class About 
   @Source("return") JFrame getFrame();
}

パッケージに存在しないクラスを記述するには、以下のように "package;" を使用します。

@BindAll("ERROR")


class AKB {    
   void a(@Sink String s);
}

package java.lang;

public class String {  
   @Source("return") java.lang.String trim();
}

package;

class BKB {    
   void b(@Sink String s);
}

メソッドシグネチャの記述

ID の検証など、解析でチェッカーが考慮するメソッドシグネチャを記述するには:

  1. 対象のメソッドを含むクラスのパッケージ宣言を記述します (または実際のクラスからコピーします)。
  2. 対象のメソッドを含むクラスまたはインターフェイスの宣言を記述またはコピーします。宣言は次の形式になります。
    (modifiers)* ('class'|'interface') CLASS_NAME
  3. クラス宣言内に対象のメソッドのシグネチャを記述またはコピーします。

メソッドシグネチャの記述例

javax.naming.directory DirContext からのいくつかの検索メソッドを記述するとします。メソッドシグネチャは次のようになります。

package javax.naming.directory;


import javax.naming.*;

public class DirContext {  
   public NamingEnumeration<SearchResult> search(Name name, String filter, SearchControls cons)
      throws NamingException;

   public NamingEnumeration<SearchResult> search(String name, String filter, SearchControls cons) 
      throws NamingException;

}

Knowledge base (ナレッジベース) 注釈

次の注釈は、Java 解析をチューニングする目的でソースをマークアップするために非常に一般的に使用されます。

  • @Check
  • @CheckTrue
  • @CheckFalse
  • @Bind
  • @BindAll

トラブルシューティングを簡素化するためのベストプラクティスとして、以下を推奨します。

  • 一度に 1 つのメソッドシグネチャを特定し、通常 @Check、@CheckTrue、@CheckFalse などの 1 つの注釈を付加します。
  • @Bind を使用して 1 つ以上のメソッドを特定チェッカーにバインドします。
  • knowledge base (ナレッジベース) をテストして、変更が必要かどうかを判断します。
  • チェッカーの考慮事項にする次のシグネチャメソッドを .jkb で特定し、適宜注釈を付け、再テストします。

特定チェッカーへの knowledge base (ナレッジベース) レコードのバインド

特定チェッカーに knowledge base (ナレッジベース) エントリをバインドするには、@Bind (または @BindAll) 注釈を使用する必要があります。バインドは knowledge base (ナレッジベース) に指定する動作を変更するチェッカーにリンクするため、knowledge base (ナレッジベース) を使用した Java 解析のチューニングの不可欠な要素です。

解析への knowledge base (ナレッジベース) ファイルの適用

新しい構成ファイルを統合ビルド解析に適用するには、プロジェクトまたは projects_root にインポートします。このファイルは connected desktop (コネクテッドデスクトップ) と同期されます。

knowledge base (ナレッジベース) ファイルをスタンドアロンデスクトッププロジェクトに適用するには、デスクトップ解析のカスタマイズ を参照してください。