例 2:エラーメッセージの変更

この例では、TUTORIAL チェッカーを変更して、関連するチェッカーメッセージを、解析するソースのコンテキストで表示します。

これには、予約されている一連の KAST 変数、$0 ..$9 を使用します。これは {0} ..{9}.表記を使ってチェッカーメッセージに配置できます。。これらの番号が付けられたパラメーターを使用して、チェッカーのエラー要素のメッセージ属性を変更します。

<error id="TUTORIAL"
  enabled="true" 
  severity="3" 
  title="Function Definition" 
  message="Called on function {0}()"> 
  <pattern>
    // FuncDef [ $0 := getMyText() ] 
  </pattern> 

</error> 

KAST 式の $0 への割り当ては、チェッカーメッセージの {0} パラメーターを通じて反映されます。あとは、$0 変数に保存するための適切な文字列を返すカスタム関数のコード化です。

 #include <stdio.h>
 #include <XPath_plugins.h>
 #include <ktcAPI.h>
   
 ktc_string_t getMyText(ktc_tree_t node)
 {
   return ktc_string_new("foo");
 }
  
 HOOKS_SET_START
   XPath_register_string_hook("getMyText", getMyText);
 HOOKS_SET_END


'make' を使用してこの変更済みのチェッカーを実行すると、出力は次のようになります。

1 (Local) ./TUTORIAL/testcase.cc:1 TUTORIAL (3:Warning) Analyze

Called on function foo().

Summary: 1 Local
1 Total Issue(s)

ハードコードされた関数名はほとんど役に立たないため、これを拡張して渡されたノードから関数名を取得します (KAST 式に基づき FuncDef ノードとなります)。名前やタイプなどにアクセスするには、ノード自体ではなくセマンティック情報を調べる必要があります。getMyText() の実装を変更します。

 ktc_string_t getMyText(ktc_tree_t node)
 {      
   ktc_semanticInfo_t si = ktc_getSemanticInfo(node);
   return ktc_string_new(ktc_sema_getIdentifier(si));
 }


テストケースを実行すると、出力には、'test' というテストケースの最初の関数の名前が含まれます。

1 (Local) ./TUTORIAL/testcase.cc:1 TUTORIAL (3:Warning) Analyze

Called on function test().

Summary: 1 Local
1 Total Issue(s)

適切なコンテキストのチェックの追加

セマンティックスについての説明の一部として、チェッカーの定義を拡張して、if() ステートメントおよび関数定義ノードから関数を呼び出してみます。if() ステートメントには名前がないため、関数定義と同じテクニックを使用することはできません。その代わりに、カスタム関数を制限して、期待される環境だけで動作するようにします。

 ktc_string_t getMyText(ktc_tree_t node)
 {      
   ktc_semanticInfo_t si = ktc_getSemanticInfo(node);
   return ktc_sema_isFunction(si) ?
     ktc_string_new(ktc_sema_getIdentifier(si)) :
     ktc_string_new("** invalid **");
 }

新しいパターン要素を if() ステートメントのチェッカー定義に追加します。

<error id="TUTORIAL" 
  severity="3" title="Function
  Definition" message="Called on function {0}.">
  <pattern>
    // FuncDef [ $0 := getMyText() ]  
  </pattern> 
  <pattern> 
    // IfStmt [ $0 := getMyText() ]  
  </pattern>  
</error>     

testcase.cc からの出力は次のようになります。

1 (Local) ./TUTORIAL/testcase.cc:1 TUTORIAL (3:Warning) Analyze
Called on function test().

2 (Local) ./TUTORIAL/testcase.cc:3 TUTORIAL (3:Warning) Analyze
Called on function ** invalid **().

Summary: 2 Local
2 Total Issue(s)