在自定义 KlocWork Checker 中访问 Left 或 Right child

Access a Left or Right child in a Custom KlocWork Checker

我正在尝试为 C++ 编写自定义 KlocWork 检查器,但我遇到了一个问题:

当我们有这样一个表达式时:

x = y + z;

我想访问左节点,它是变量 'x',但也想访问右节点的两个变量(右节点的左节点和右节点)我不知道如何访问每个变量,所以到目前为止,我的检查器中有这个:

// BinaryExpr [ getOperationCode() = KTC_OPCODE_ASSIGN]
    [$exprL:= Left]
    [$size1:= $exprL.getTypeSize()]
    [$exprR:= Right]
    [$exprR.getOperationCode() = KTC_OPCODE_ADD]

它检测每个 BinaryExpression 和左节点上的另一个表达式(存储在 $exprR 中)但之后我不知道如何访问 $exprR 的左右子节点。

在此先感谢您的帮助!

这里有两个嵌套表达式,你想存储赋值的左节点然后继续遍历AST进一步使用全模式到第二个二元表达式节点得到赋值的左节点和右节点添加。例如:

// BinaryExpr [getOperationCode() = KTC_OPCODE_ASSIGN] [$exprOL:= Left]

这里我们找到并存储赋值表达式的左节点。

// BinaryExpr [getOperationCode() = KTC_OPCODE_ASSIGN] [$exprOL:= Left] / Right::BinaryExpr [getOperationCode() = KTC_OPCODE_ADD]

然后我们继续得到加法表达式。最后,我们可以抓取这个表达式的 Left 和 Right:

// BinaryExpr [getOperationCode() = KTC_OPCODE_ASSIGN] [$exprOL:= Left] / Right::BinaryExpr [getOperationCode() = KTC_OPCODE_ADD] 
[$exprL:= Left] 
[$exprR:= Right]

您可以使用 println() 函数进行测试。所以完整的表达式

// BinaryExpr [getOperationCode() = KTC_OPCODE_ASSIGN] [$exprOL:= Left] / Right::BinaryExpr [getOperationCode() = KTC_OPCODE_ADD]
[$exprL:= Left]
[$exprR:= Right]
[$exprOL.getName().println()]
[$exprL.getName().println()]
[$exprR.getName().println()]

对于以下代码:

int func (int x, int y)
{
    int local;
    local = x;
    local = x + y;
    local = y - x;
    return local;
}

将打印出:

local
x
y