EN JP CN

チュートリアル - Java KAST チェッカーの作成

チュートリアル - Java KAST チェッカーの作成

チュートリアル - Java KAST チェッカーの作成

チュートリアル - Java KAST チェッカーの作成

このチュートリアルでは、カスタム Java KAST checker の作成方法について説明します。

kwcreatechecker を実行する

チェッカースタブファイルを作成するディレクトリから次のオプションを指定してkwcreatecheckerを実行します。

kwcreatechecker --language java --type kast --code KASTJ.MYCHECKER
注: --code オプションでは、特殊 (およびマルチバイト) 文字はサポートされていません。

結果

ディレクトリは--code で指定した名前で作成されます。このディレクトリには、チェッカースタブファイルが含まれます。上述の例では、ディレクトリの名前は KASTJ.MYCHECKERです。KASTJ.MYCHECKER ディレクトリには以下が含まれます。

  • チェッカー設定ファイル (checkers.xmlhelp.xml)
  • テストケースサンプル (testcase.java)
  • Ant ビルドファイル (build.xml)

最も単純なテストケースを作成する

チェッカーの最初のテストケースはできるだけ単純なものにしてください。チェッカーの開発が進むとともに、より複雑なケースを追加してテストすることができます。

例:式で '+=' 演算子の代わりに代入演算子を使用する。

式 'a += 5' では '+=' 演算子を代入演算子'a =+ 5' ('+=' の代わりに '=+') として間違って入力しがちです。それでもこのエラーは有効な Java コードを生成します。

次のこのエラーに対する Klocwork 指摘を生成する非常に単純なコードフラグメントを示します。

class Testcase {
   public void method() {
      int x = 2;
      int j = x =+5; //Error: assignment instead of +=
   }
}

このコードをチェッカーのテストケースファイル (KASTJ.MYCHECKER/Testcase.java) に追加します。

Checker Studio を使用して目的の KAST ノードを検索する

単純なテストケースを作成したら、次のステップは Checker Studio を開き、抜粋を貼り付けて、KAST ノード名、コード例およびヘルプ情報を表示します。これらは、チェッカーで特定する指摘へのパスを追跡する KAST 式の構成要素になります。

  1. デスクトップで Checker Studio アイコンをダブルクリックするか、コマンドラインで次のように入力します。
    kwstudio
    
  2. テストケースを [ソースコード] ペインに貼り付けます。

チュートリアルテストケースを参照する

  1. [ソースコード] ペインで、式 'x =+ 5' の '=' をクリックします。
    2 番目の変数初期化子ステートメントの ExprBinary ノードが AST でハイライトされていることに注意してください。例では、これはKAST 式内の目的の最初のノードです。
  2. AST で ExprBinary を拡張します。
    子 Expr1 とExpr2、および '@Op' 属性 (AST の下の属性テーブルに表示されています) があります。このチェッカーは代入式のみを処理するため、属性の値が OP_ASSIGN と等しいことを確認する必要があります。
  3. さらに、チェッカーはバイナリ式の 2 番目のオペランドも処理するため、このことを書き留め、Expr2 子を展開します。
  4. Expr2 はタイプ ExprPrefix の唯一のノードにつながっています。これは ExprBinary にタイプ ExprPrefix の Expr2 が含まれることを意味します。
  5. ソースコード内の '+' をクリックします。これにより AST で ExprPrefix ノードがハイライトされます。このノードには '@Op' 属性があることに注意してください。欠陥は、この属性が OP_PLUS と等しい必要があることを示しています。
ヒント: コンテキスト依存ヘルプを表示するには、ツリーノードを選択して F1 キーを押すか、[表示] > [コンテキストヘルプ] ウィンドウ に移動します。[ソースコード] ペインの下にコンテキスト依存ヘルプが表示され、必要に応じてスーパータイプやサブタイプなどのノード情報が提供されます。

KAST 式のドラフトを作成する

前のステップで特定したエンティティは、ExprBinary ノートと ExprPrefix ノード、Expr2 子、および 2 つの Op 属性 (一方は OP_ASSIGN と、そして他方は OP_PLUS と等しい必要があります) です。

これを KAST 式にまとめると、次のようになります。

//ExprBinary[@Op=OP_ASSIGN]/Expr2::ExprPrefix[@Op=OP_PLUS]

この KAST 式は、AST で代入の左側オペランドである prefix plus 式を検索します。上記の KAST 式を使用すると、'+5' のみがハイライトされます。

指摘を (prefix plus 式ではなく) 代入ノードで報告するには、このパターンを次のように作成しなおしてください。

//ExprBinary[@Op=OP_ASSIGN][Expr2::ExprPrefix[@Op=OP_PLUS]]

2 番目の KAST 式では、次の代入式全体がハイライトされます。(x=+5)

KAST 式の詳細については、Java KAST 構文リファレンスを参照してください。

KAST 式をテストする

  1. KAST 式を Checker Studio の [パターン] ペインに貼り付けます。
    式と一致した AST ノードが選択され、対応するソースコードフラグメントがハイライトされます。
    Image:test_expression_Java.png
  2. 必要に応じて KAST 式とテストケースを調整し、再テストします。

テストケースに複雑度を加える

KAST チェッカー開発プロセスでの次のステップは、テストケースにテストを追加することです。追加できるテストは次のとおりです。

  • 誤検知テスト - チェッカーが特定の条件に対してエラーを生成しないことを確認します。
  • より複雑なテスト - チェッカーが特殊なケースまたは複雑度の高いケースに対してエラーを生成することを確認します。

このチュートリアルのサンプルチェッカーでは、誤検知テストケースがさらに 3 つ追加されます。追加されるチェックは次のとおりです。

  • '+' または '-' が前にない代入演算
  • 単項マイナス式が続く代入式
  • 正規の '+=' 演算

これらのケースでは、Klocwork 指摘レポートを生成できません。

Testcase.java のコードを次のように変更します。

class Testcase {
   public void method() {
      int x = 2; // OK - assignment only 
      int j = x =+ 5; // Error: assignment instead of '+=' 
      int k = x =- 100; // OK - unary '-' instead of unary '+' 
      x += 12; // OK - normal '+=' operation, no typo 
   }
}

Checker Studio を使用してテストを再実行します。KAST 式をテストするを参照してください。

結果は、誤検知が生成されなかった (すべてのテストケースが処理された) ことを示します。

KAST 式を checkers.xml ファイルに追加する

チェッカーの KAST 式が完成しテストされたら、このチュートリアルの最初の部分で生成された checkers.xml ファイルにそれを追加できます。

  1. 好みのエディターで KASTJ.MYCHECKER/checkers.xml を開きます。
    ファイルが生成されると、その値にはエラー ID、重要度、メッセージ、タイトル、およびサンプル KAST 式が自動的に指定されます。
  2. <pattern> タグを探します。
  3. サンプル KAST 式をテスト済みの以下の KAST 式で置換します。
    //ExprBinary[@Op=OP_ASSIGN][Expr2::ExprPrefix[@Op=OP_PLUS]]
  4. さらに、必要に応じて <error id> 属性を編集することもできます。このチュートリアルでは、タイトル属性を "Assignment instead of plusequal" に、メッセージ属性を "Possible undesired assignment instead of plusequal operation" に変更します。
  5. ファイルを保存します。

チェッカーのヘルプを作成する

help.xml ファイルを編集することによりチェッカードキュメントを作成できます。

チェッカーをビルドするとヘルプファイルの内容はチェッカーとバンドルされます。

サーバープロジェクト (および connected desktop (コネクテッドデスクトップ) ) に展開すると、Klocwork Static Code Analysis のオンラインヘルプにヘルプの目次が表示されます。

最小限でもチェッカーの説明を入力する必要があります。

カスタムチェッカーの help.xml ファイルの例を参照してください。

チェッカーをビルドする

チェッカーの KAST 式が完成し、checkers.xml ファイルに追加され、ヘルプが作成されたら、Ant を使用してチェッカーをビルドできます。

このチュートリアルの最初に Kwcreatechecker がチェッカーディレクトリに build.xml ファイルを生成しました。

チェッカーディレクトリ (KASTJ.MYCHECKER) からチェッカーライブラリをビルドするには、以下を実行します。

ant install

これにより <CHECKER.CODE>.jar ファイル (フィールドは KASTJ.MYCHECKER.jar) が生成されます。

次は何?

これでチェッカーを Klocwork サーバーに展開できます。その場合、Klocwork connected desktop (コネクテッドデスクトップ) はすべて、サーバーと同期するとチェッカーを使用できるようになります。また、個々のデスクトップインストールに展開することもできます。

この方法については、以下を参照してください。