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 в других функциях.


Тем не менее, обратите внимание, что вы получите только статический граф вызовов из этого. В Си функции могут вызывать других через указатели на функции, и это не то, что вы можете знать статически в общем случае.

Другие вопросы по тегам