找出是否在C ++项目中调用函数?

时间:2009-12-10 16:10:16

标签: c++

我正在尝试删除C ++项目中未使用的函数。随着时间的推移,它变得臃肿,我正在寻找删除根本没有使用的功能。

我将所有项目都放在Visual Studio的解决方案文件中,但我使用cmake,这样我就可以在必要时为另一个IDE生成项目文件(这就是为什么没有用visual-studio标记)。

这样的事情存在吗?它会分析源并告诉我哪些函数没有被调用。我在这里看到了几个问题中提到的PC-Lint,但似乎没有这样做。

我真正想做的是在每个函数上调用“查找所有引用”并删除未调用的函数,但手动执行此操作需要的时间太长。

8 个答案:

答案 0 :(得分:9)

在要删除的函数声明前面使用__declspec(deprecated)。如果在编译时实际使用该函数,那将抛出编译警告。

答案 1 :(得分:3)

听起来你需要一个代码覆盖工具。这个wikipedia article中有一个列表。

答案 2 :(得分:3)

来自http://www.campwoodsw.com/的优秀(且免费)源监视器静态分析工具可以为您提供对方法的调用次数的计数,我认为这是您想要的。

编辑:似乎是我的晚上搞砸了。呼叫指标实际上并没有按照我的想法行事。尽管如此,SM仍然是一个很好的工具,所以我希望能引起人们的注意,它已经做了一些好事!

答案 3 :(得分:2)

我非常确定在数学上,在一般情况下无法做到这一点。如果你允许递归和函数指针(或第一类函数),那么你最终会简单地减少停机问题。

当然,这是一个你永远不必处理的案例,但你应该知道它... ...

答案 4 :(得分:1)

如果您的代码足够简单,静态分析可能会起作用。但是C ++对上下文非常敏感:/。所以我个人甚至不会尝试在该地区寻找工具。至少直到CLANG完全符合C ++:D

我希望你有单元测试,我会得到visual studio来编译生成运行时配置文件的代码,然后从生成的配置文件中添加函数名称(使用脚本语言)。如果您已经在应用程序中涵盖了所有用例(手动或单元测试),那么您应该能够识别最少使用(或从未使用过)的功能。然后你可以使用标记一个眼球来修剪源基础。

没有什么比手动做的更好:D

答案 5 :(得分:1)

Visual Studio可以生成调用图,显示每个函数的“被调用”。如果您不想使用Visual Studio,Doxygen也会这样做。

但是这两种方法都无法检测通过指针调用的函数,但通常应该很容易手动检查。

答案 6 :(得分:1)

如果你想动态地知道正在使用哪些函数,你可以让(vc ++)编译器插入callcap钩子,然后使用它们来转储使用信息。

这可能是对基于静态分析的方法的有用补充,因为它将看到在执行期间输入的每一段代码(无论执行如何到达那里)。

有关visual studio中呼叫配置文件挂钩的信息,请参阅http://msdn.microsoft.com/en-us/library/ms254291(VS.80).aspx

答案 7 :(得分:0)

我想最简单的方法是删除一个函数(或类,变量,你可能认为不需要的任何东西),然后查看它是否编译。如果使用该函数,则在重建期间的某个时刻会出现编译或链接错误。

通常你应该删除定义而不是声明,否则像重载函数和专用模板这样的东西它可以编译并链接到其他一个,不会导致错误,但会改变程序行为。通过删除定义,编译器仍然可以看到声明,但链接器将无法链接它。

声明但未定义的项目如果未使用则不会导致错误,因为链接器永远不会尝试链接到它们。