EN JP CN

例 1:'Hello world'

例 1:'Hello world'

この例では、呼び出された各ノードに、呼び出されたという事実だけをログして、単にエラーを生成するチェッカーを作成します。通常のパターンに従って、'helloWorld()' と呼ばれるカスタム関数を定義し、標準的な AST ノードから呼び出します。この例では、以下を説明します。

  • カスタム関数の一般的な形式と、それをチェッカーから実行する方法
  • デバッグ情報のログ方法と、その保存場所

KAST 式の作成

kwcreatechecker でチェッカーのスタブファイルを作成したら、最初のステップは checkers.xml を編集して、カスタム関数を呼び出す簡単な KAST 式を定義することです。この抜粋は、ファイルの <pattern> 属性を示しています。

<pattern>
  // FuncDef [ helloWorld() ]
</pattern>        

この pattern は、単純に各関数定義ノードをカスタム関数に駆動します。(新しい pattern と同様に、エラー要素のタイトルとメッセージを、チェッカーの目的を表すものに置き換えると便利です。)KAST 式のその他の例については、C/C++ KAST 例を参照してください。

testcase ファイルの編集

この例では、kwcreatechecker によってテンプレート testcase.cc ファイルに提供される基本的なテストケースを変更せずに使用します。

カスタム関数の定義

次のステップは、カスタム関数 'helloWorld()' の定義です。テンプレート PluginSource.cpp を見ると、コメントから最低でも定義できる 2 つのタイプのカスタム関数があることがわかります。

// Such C functions must match one of the following patterns:
// 1. int <function_name:><ktc_tree_t node>
// or
// 2. ktc_tree_t <function name> <ktc_tree_t node>
// If you want to implement a boolean custom predicate, use the first pattern;
// 0 must be returned for false, and a non-zero value for true.

1 つ目のタイプの関数であるカスタム述語は、入力される KAST ノードに関する何かが true かどうかを単純にチェックし、true の場合は 1 を、その他は 2 を返します。2 つ目のタイプは getter 関数です。KAST ツリーからノードを取得し、それを KAST 式に返します (想定される追加処理のため)。組み込み関数のコンテキストでは、

 isClassMember()
 isVirtual()

といった関数は、述語パターンに整合し、

 getParent()
 getReturnType()

などの関数は getter パターンに整合します。(組み込み KAST 関数には暗示的な命名規則を使用しますが、カスタム関数についてこの規則に従わなければならないという絶対的な要件はありません。

記述できる 3 つ目のタイプの関数は文字列を返します。このタイプの関数は、例 2 で説明します。

簡単にするため、フィールドはカスタム述語の関数タイプを使用します。テンプレート PluginSource.cpp を編集して、以下の内容で置き換えます。

 #include <stdio.h>
 #include <XPath_plugins.h>
 #include <ktcAPI.h>
  
 int helloWorld(ktc_tree_t node)
 {
   fprintf(stderr, "Hello world\n");
   return 1;
 }
  
 HOOKS_SET_START
   XPath_register_int_hook("helloWorld", helloWorld);
 HOOKS_SET_END

これで、カスタム KAST 関数とそれを実行するチェッカーを作成できました。

カスタム関数の実行とテスト

カスタム関数の実行とテストは、'make' を実行して行うことができます (上記の説明に従って Makefile を変更したと仮定)。'make' の最終的な出力により、testcase.cc コード内の 'helloWorld()' カスタム関数の 1 つの呼び出しに対する警告メッセージが表示されます。

Klocwork ビルドプロセス により stderr がビルドログファイルにリダイレクトされ、アップビートな "Hello world" メッセージが TUTORIAL/.kwlp/workingcache/tables にあるビルドログファイルに表示されるようになります。

デバッグメッセージに stdout を使用しないでください。Visual Studio などのオンザフライ解析デスクトップに展開されたチェッカーでプロトコルエラーが発生するためです。