Я пытаюсь построить граф вызовов с помощью Clang AST.
Есть ли способ каким-либо образом связать параметры функции с аргументами вызова внутренней функции?
Например,учитывая следующую функцию:
void chainedIncrement(int *ptr) {
simplePointerIncr(ptr);
for (int i=0;i<3;i++) {
simplePointerIncr(ptr);
}
}
Я искал способ связать функцию ptr
из chainedIncrement
с аргументом функции simplePointerIncr
.Это позволит построить граф вызовов.Может быть, есть способ получить тот же идентификатор при вызове getId()
для параметров и аргументов.
Я попытался использовать следующее сопоставление AST:
functionDecl(hasDescendant(callExpr(callee(functionDecl().bind("calleeFunc")),unless(isExpansionInSystemHeader())).bind("callExpr");)).bind("outerFunc")
Кажется, что аргументы имеютвведите Expr
, в то время как параметры функции имеют тип ParmVarDecl
.Предполагая, что параметр передается как есть, без изменения внутренней функции, есть ли способ как-то связать их?
Спасибо
ОБНОВЛЕНИЕ : добавлено мое решение
Существует сопоставитель по имени forEachArgumentWithParam()
.Он позволяет привязать аргументы функции вызываемого к ее параметрам.
Другой сопоставитель, equalsBoundNode()
, позволяет привязать параметры внешней функции к аргументам функции вызываемого.
auto calleeArgVarDecl = declRefExpr(to(varDecl().bind("callerArg")));
auto innerCallExpr = callExpr(
forEachArgumentWithParam(calleeArgVarDecl, parmVarDecl().bind("calleeParam")),
callee(functionDecl().bind("calleeFunc")),unless(isExpansionInSystemHeader())).bind("callExpr");
auto fullMatcher = functionDecl(forEachDescendant(innerCallExpr),forEachDescendant(parmVarDecl(equalsBoundNode("callerArg")).bind("outerFuncParam"))).bind("outerFunc");