0

有没有办法用 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 中调用信息 ?

4

1 回答 1

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_2and Func_3,但不会在其他函数中找到 func 调用。


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

于 2019-01-24T13:22:24.143 回答