pycparser извлекает иерархию вызовов функций - PullRequest
0 голосов
/ 23 января 2019

есть ли способ получить стек вызовов функций с помощью 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 Ответ

0 голосов
/ 24 января 2019

Вы можете написать посетителя, который найдет узлы 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 в других функциях.


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

...