【问题标题】:pycparser retrieving function call hierarchypycparser 检索函数调用层次结构
【发布时间】:2019-06-16 21:23:09
【问题描述】:

有没有办法用 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_2Func_3

但我怎样才能检索信息,例如Func_2 是从 Func_1 内部调用的吗?

【问题讨论】:

    标签: function callstack pycparser call-hierarchy


    【解决方案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_2Func_3,但不会在其他函数中找到func 调用。


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

    【讨论】:

    • 谢谢,我刚试了一下,效果和你描述的一样 :)
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2022-08-23
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多