2015-04-30 7 views
0

Я пытаюсь написать проверки пользовательских Klocwork для C++, однако IM застрял с вопросом:Доступ к левому или правому ребенку в пользовательском Klocwork Checker

Когда мы имеем выражение, как этот:

x = y + z; 

Я хочу получить доступ к левому узлу, который является переменной «x», но и обе переменные из правого узла (слева и справа от правого узла). Я не знаю, как получить доступ к каждой переменной, пока у меня есть это в моей проверке:

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

Что обнаруживает каждое BinaryExpression с другим выражением в левом узле (хранится в $ exprR), но после этого я не знаю, как получить доступ к левым и правым дочерним элементам из $ exprR.

Заранее благодарим за любую помощь!

ответ

0

Здесь два вложенных выражения, и вы хотите сохранить левый узел задания, а затем продолжить движение по 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 
Смежные вопросы