KAST 式の作成
このステップでは、KAST 式を形成する構成要素の検索を始めます。これは、Checker Studio がテストケースコードから作成する AST 階層ツリーを調査することから始めます。
目的の KAST ノードの検索
AST 階層ツリーに、KAST ノード名、階層情報、演算属性といった、式の最初の要素を見つけることができます。
- Checker Studio を開き、テストケースコードを [ソースコード] ペインに貼り付けます。
- コードの最初のブロックで 'x = y' をクリックします。
AST ツリーの
ExprStmt
ノードの最初のインスタンスがハイライトされます。ExprStmt
ノードには 1 つの子ノードBinaryExpr
があります。これらの 2 つのノード名は、次に示すように、最初の KAST 式の構成要素の最初の 2 つの要素になります。//ExprStmt / Expr::BinaryExpr
- ソースコード式の '=' 記号をクリックします。
BinaryExpr
ノードがハイライトされ、"=" 演算子の KTC 属性コードが [属性] ペインに表示されます。この属性式は、次に示す KAST 式の最初の要素を実行します。//ExprStmt / Expr::BinaryExpr [@Op = KTC_OPCODE_ASSIGN]
ここまで作成した KAST 式の要素は、"演算が代入であるすべてのバイナリ演算を検索する" として解釈できます。
- その開発を行っている間に、すべてのテキストファイルに式を配置します。
KAST 条件の定義
KAST 式の次の要素は、チェッカーの検索に適用する条件を提供します。KAST 変数 (先頭に "$" が付く語) を使用すると、検索式の LHS および RHS を定義できます。
[$expr1:=Left]
[$expr2:=Right]
KAST 構文では、角括弧は式内の条件を表します。
また、このチェッカーの変数のみを検索することを指定することもあります。 それを行うには、変数と KAST 組み込み関数である isConstant、isArray、および isPointer を次の条件で使用します。
[not $expr2.isConstant()]
[not $expr1.isPointer() | not $expr2.isArray()]
これらの条件を KAST 式に追加すると、次のようになります。
//ExprStmt / Expr::BinaryExpr [@Op = KTC_OPCODE_ASSIGN] [$expr1:= Left] [$expr2:= Right] [not $expr2.isConstant()] [not $expr1.isPointer() | not $expr2.isArray()]
KAST 式作成の次のステップは、2 つの新しい KAST 変数と組み込み関数である getTypeSize を使用して変数サイズを取得する条件の追加です。
[$size1:=$expr1.getTypeSize()] [$size2:=$expr2.getTypeSize()]
最後のステップは、文の両側の変数とゼロを比較し、両側を互いに比較する条件の追加です。
[$size1 > 0] [$size2 > 0] [$size1 < $size2]
これらの条件を追加すると、KAST 式が完成します。
//ExprStmt / Expr::BinaryExpr [@Op = KTC_OPCODE_ASSIGN] [$expr1:= Left] [$expr2:= Right] [not $expr2.isConstant()] [not $expr1.isPointer() | not $expr2.isArray()] [$size1:= $expr1.getTypeSize()] [$size2:= $expr2.getTypeSize()] [$size1 > 0] [$size2 > 0] [$size1 < $size2]
この式は、"演算が代入であるすべてのバイナリ演算を検索し、その LHS 型サイズは RHS 型サイズより小さい" として解釈できます。
Checker Studio での式のテスト
チェッカーが意図したとおりに機能していることを確認するには、KAST 式を Checker Studio の [パターン] ペインに入力またはコピーします。 必要に応じて、Checker Studio で KAST 式とテストケースを調整します。
KAST 式のその他の例については「C/C++ KAST 例」を、KAST 構文の詳細については「C/C++ KAST 構文リファレンス」を参照してください。