pycparser 检索函数调用层次结构
pycparser retrieving function 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_2 是从 Func_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
中,我们创建了一个新的call visitor并且运行它在node
,这意味着它在函数定义的AST节点中只有运行s .它会在您的代码中找到 Func_2
和 Func_3
,但不会在其他函数中找到 func 调用。
也就是说,请注意您只能从中获得 static 调用图。在 C 中,函数可以通过函数指针调用其他函数,这在一般情况下不是您可以静态知道的。
有没有办法用 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 中调用的?
您可以编写一个找到 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
中,我们创建了一个新的call visitor并且运行它在node
,这意味着它在函数定义的AST节点中只有运行s .它会在您的代码中找到 Func_2
和 Func_3
,但不会在其他函数中找到 func 调用。
也就是说,请注意您只能从中获得 static 调用图。在 C 中,函数可以通过函数指针调用其他函数,这在一般情况下不是您可以静态知道的。