【发布时间】:2018-08-16 22:54:50
【问题描述】:
我需要在相当大的 (5-15,000) 组 C(不是 C++)文件中检测直接和间接递归。
文件已经过预处理。
出于安全原因,该代码非常“老派”,因此其中没有函数指针之类的花哨的东西,只有传递变量的函数和一些执行相同操作的函数宏。
检测递归最自然的方法是制作有向调用图,将每个函数视为一个节点,其边缘连接到它调用的所有其他函数。如果图有任何循环,那么我们就有递归。
查找函数调用的正则表达式很简单,但我还需要知道调用的是哪个函数。
PyCParser 很好,但它抱怨很多事情,例如未定义的变量或未定义源类型或在不同文件中定义的 typedef,这与我的用例完全无关。该项目使用自定义的依赖管理系统,所以一些包含和这些是自动添加的,所以我需要 PyCParser 不关心 anything 除了FuncCall 和 FuncDef 节点,我不认为有一种方法可以限制解析过程本身。
我宁愿不实现解析器,因为我没有时间学习如何在 python 中执行此操作然后实现解决方案。
回到问题,我将如何解析 C 文件中的函数?基本上得到一个以字符串(文件中定义的函数的名称)作为键,字符串列表(每个函数调用的函数)作为值的字典?正则表达式似乎是最自然的解决方案。
遗憾的是,使用 python 不是可选的。
【问题讨论】:
-
您要查找的输出是什么?将写入
stdout之类的函数Warning: <function_name> is recursive !? -
创建一个图表,指示哪个函数调用了哪些函数并搜索循环。
-
在不知道哪些标识符是类型的情况下无法解析 C,因此您的“自定义依赖管理系统”是一个硬块。
-
下次我会阅读您的帖子:) 当文件完全预处理时,pycparser 工作正常。我记得它试图预处理文件,但应该跳过那部分,因为你必须提供所有包含位置......最好提供一个已经预处理的文件,在这种情况下,你会得到所有信息。我听说
clang也很好。似乎有一个 python 绑定。 -
要详细说明我的评论,请考虑
A ( B ); ( C ) ( D );,这是多少个函数调用?