KAST 式の作成

このステップでは、KAST 式を形成する構成要素の検索を始めます。これは、Checker Studio がテストケースコードから作成する AST 階層ツリーを調査することから始めます。

目的の KAST ノードの検索

AST 階層ツリーに、KAST ノード名、階層情報、演算属性といった、式の最初の要素を見つけることができます。

  1. Checker Studio を開き、テストケースコードを [ソースコード] ペインに貼り付けます。
  2. コードの最初のブロックで 'x = y' をクリックします。

    AST ツリーの ExprStmt ノードの最初のインスタンスがハイライトされます。ExprStmt ノードには 1 つの子ノード BinaryExpr があります。これらの 2 つのノード名は、次に示すように、最初の KAST 式の構成要素の最初の 2 つの要素になります。

    //ExprStmt / Expr::BinaryExpr
  3. ソースコード式の '=' 記号をクリックします。

    BinaryExpr ノードがハイライトされ、"=" 演算子の KTC 属性コードが [属性] ペインに表示されます。この属性式は、次に示す KAST 式の最初の要素を実行します。

    //ExprStmt / Expr::BinaryExpr [@Op = KTC_OPCODE_ASSIGN]

    ここまで作成した KAST 式の要素は、"演算が代入であるすべてのバイナリ演算を検索する" として解釈できます。

  4. その開発を行っている間に、すべてのテキストファイルに式を配置します。

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 構文リファレンス」を参照してください。