pycparser检索函数调用层次结构

时间:2019-01-23 10:05:45

标签: function callstack pycparser call-hierarchy

有没有办法用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_1 内部调用 Func_2 吗?

1 个答案:

答案 0 :(得分:0)

您可以编写一个访问者,以找到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_2Func_3,但在其他函数中找不到func调用。


也就是说,请注意,您只会从中获得 static 调用图。在C语言中,函数可以通过函数指针调用其他函数,而在通常情况下,这不是您可以静态了解的。