pycparser извлекает иерархию вызовов функций
Есть ли способ получить стек вызовов функций с pycparser?
например, если у меня есть такой код:
static int Func_1(int *val)
{
unsigned int data_1 = 0;
int result;
result = Func_2(val,
data_1
);
result = Func_3(val,
result
);
return result;
}
поэтому с FuncDefVisitor я могу получить Func_1, а с FuncCallVisitor я могу получить Func_2 и Func_3
но как я могу получить информацию о том, что, например, Func_2 вызывается из Func_1?
1 ответ
Вы можете написать посетителю, который находит FuncDef
узлы и запускает на них другого посетителя, который находит все FuncCall
узлы. Например:
class FuncDefVisitor(c_ast.NodeVisitor):
def visit_FuncDef(self, node):
# Here node is a FuncDef node for the function definition.
v = FuncCallVisitor()
v.visit(node)
class FuncCallVisitor(c_ast.NodeVisitor):
def visit_FuncCall(self, node):
# do something
В visit_FuncDef
мы создаем нового посетителя звонка и запускаем его node
Это означает, что он работает только в узле AST для определения функции. Найдет Func_2
а также Func_3
в вашем коде, но не вызовы func в других функциях.
Тем не менее, обратите внимание, что вы получите только статический граф вызовов из этого. В Си функции могут вызывать других через указатели на функции, и это не то, что вы можете знать статически в общем случае.