例 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)