有没有一个工具可以检测C代码中的递归函数调用?

有没有一个工具可以检测C代码中的递归函数调用?,c,recursion,C,Recursion,我需要在继承的代码库中搜索并消除递归函数调用。 到目前为止,我找不到任何可以进行静态分析并找到这些函数的工具。您可能想试试: cflow实用程序应分析目标文件或汇编程序、C语言、lex或yacc源文件的集合,并尝试构建一个图形,写入标准输出,绘制外部参考 它应该打印一个调用图并标记递归函数。如果您的代码有通过函数指针的间接调用,则检测其中的递归调用可能非常困难(在一般情况下可能是不可能的,因为这相当于停止问题) 但我不确定消除递归是否值得。对于一些递归算法或问题,您只需用堆栈(在堆中)模拟它来替

我需要在继承的代码库中搜索并消除递归函数调用。 到目前为止,我找不到任何可以进行静态分析并找到这些函数的工具。

您可能想试试:

cflow实用程序应分析目标文件或汇编程序、C语言、lex或yacc源文件的集合,并尝试构建一个图形,写入标准输出,绘制外部参考


它应该打印一个调用图并标记递归函数。

如果您的代码有通过函数指针的间接调用,则检测其中的递归调用可能非常困难(在一般情况下可能是不可能的,因为这相当于停止问题)

但我不确定消除递归是否值得。对于一些递归算法或问题,您只需用堆栈(在堆中)模拟它来替换它,这没有多大帮助(并且使代码无法读取)

一个更实用的解决方案(至少在Linux上)是限制堆栈大小,并运行测试,直到它们通过填充堆栈而中断。然后您可以使用调试器来了解它是如何发生的


我认为你不应该为递归操心太多。

可以为C程序生成CFG,但这有点像用大锤钉钉一样。

@sth:你为什么想知道?@duedl0r:因为无论他试图解决什么问题,都可能有比避免使用递归函数更好的解决方案,这是不可协商的。客户机坚持认为代码中没有递归。我尝试了所有的方法,但没有使用Confundus魅力。我从未想过限制堆栈大小/导致堆栈溢出。好建议!对正在运行的程序进行采样的另一种方法是在启用评测的情况下编译它(-gcc中的pg),然后对结果运行(g)prof。Gprof displays(简陋的)callgraphs.cflow做得很好(在我写的ruby scrip的一点帮助下),我更喜欢静态分析器解决方案,而不是运行软件,因为我不想深入寻找最大覆盖场景。然而,GNUCflow似乎只能从基于linux的系统编译。有人知道windows端口吗?