function - pycparser 检索函数调用层次结构
问题描述
有没有办法用 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
中,我们创建一个新的调用访问者并在 上运行它node
,这意味着它只在函数定义的 AST 节点内运行。它会在您的代码中找到Func_2
and Func_3
,但不会在其他函数中找到 func 调用。
也就是说,请注意,您只会从中获得静态调用图。在 C 中,函数可以通过函数指针调用其他函数,而在一般情况下,这不是你可以静态知道的。
推荐阅读
- c++ - 在 Visual Studio 2017 中使用 Cmake 构建 ssh.dll
- sql - 如何同时检查两个表中的出现
- javascript - 我如何使用 jquery 在选项中显示选定的值
- azure - 如何在使用快照调试器为 Asp.net 网站构建代码或加载符号时为 Asp.net 网站生成 .PDB 文件
- python - 如何在列表中找到最大值?
- angular - Angular 5页面重新加载数据刷新不起作用
- smartcontracts - 松露编译
- flutter - 使用 BottomNavigationBar 时如何保留选项卡?
- android - 如何旋转使用 ARCORE SceneView 渲染的 3d 模型
- asp.net-mvc - 刷新令牌在 Microsoft Graph API 中不起作用