我有遗留的C++代码,我应该从中删除未使用的代码.问题是代码库很大.
如何找出从未调用/从未使用过的代码?
我有一个在Visual Studio 2008下编译的大型遗留C++项目.我知道有相当数量的"死"代码无法在任何地方访问 - 未调用的方法,未使用的整个类.
我正在寻找一种可以通过静态分析识别出来的工具.
这个问题:传统C/C++项目中的死代码检测建议使用代码覆盖工具.这不是一个选项,因为测试覆盖率不够高.
它还提到了一个无法访问的代码.gcc的选项.我想要一些类似于Visual Studio的东西.我们已经使用链接器的/ OPT:REF选项来删除冗余代码,但是这并没有报告死代码的有用级别(当与/ VERBOSE一起使用时,有超过100,000行,包括来自库的很多行).
有没有更好的选项适合Visual Studio项目?
我有一个用本地C++编写的应用程序,在几年的时间里,大约有60个KLOC.有很多功能和类已经死了(可能有10-15%像下面提到的类似Unix的问题).我们最近开始对所有新代码进行单元测试,并尽可能将其应用于修改后的代码.但是,我会做一个SWAG,目前我们的测试覆盖率不到5%.
方法和/或工具必须支持:
如果方法支持超过这些要求,那么很好.
注意:我们目前使用Visual Studio 2005的专业版,而不是Team System.因此,使用Team System可能是一个有效的建议(我不知道,我从未使用它)但是我希望它不是唯一的解决方案.
我相信通用工具不可能在任何具有零误报的任意应用程序中找到所有死的(例如无法访问的代码)(我认为这相当于Halting问题).但是,我也相信通用工具有可能找到很多类型的死代码,这些代码实际上很可能已经死了,就像类或函数一样,它们在代码中永远不会引用任何其他东西.
通过使用单元测试来提供此覆盖,您不再使用通用算法,从而增加了可以检测到的死代码的百分比以及任何命中不是误报的概率.相反,使用单元测试可能会导致漏报,因为单元测试本身可能是执行给定代码段的唯一事情.理想情况下,我会进行回归测试,以执行所有外部可用的方法,API,用户控件等,这些将用作代码覆盖率分析的基线测量,以排除某些方法的误报.但遗憾的是,我目前没有这种自动化测试.
由于我拥有如此庞大的代码库,但测试用例覆盖率如此之低,我正在寻找一些可以帮助的东西,而不需要花费大量时间来编写测试用例.
您如何使用Visual Studio 2005开发环境在Windows平台上的本机C++应用程序中以自动或半自动方式检测死代码?
在我正在研究的项目的一些序列化代码中,我有一个类型,其大小取决于编译器.为了解决这个问题,我决定使用模板专业化,这非常有效.一切都在编译时解决.代码看起来有点像这样(不是真正的代码,只是一个例子):
template <int size>
void
special_function()
{
std::cout << "Called without specialization: " << size << std::endl;
}
template <>
void
special_function<4>()
{
std::cout << "dword" << std::endl;
}
template <>
void
special_function<8>()
{
std::cout << "qword" << std::endl;
}
int
main()
{
special_function<sizeof(int)>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的32位系统上dword,按预期执行上述程序输出.但这样做的全部意义并不仅仅是if (sizeof(int) == 4) { ... } else if ...我希望编译器只为适当的函数生成代码.由于special_function<4>是这个程序中唯一调用的,我希望它是编译器生成的唯一一个(在本例中为gcc 4.1.2,在x86 Linux上).
但这不是观察到的行为.
虽然它确实有效,但每个模板专业化的代码都会生成,尽管从未使用过.但是,不生成通用定义.
我应该提一下,这是一步编译,而不是编译到中间对象文件后跟一个链接.在这种情况下,将死代码删除推迟到链接阶段似乎很自然,我知道链接器并不总是非常擅长这一点.
有谁知道发生了什么?我在这里缺少模板专业化的微妙之处吗?上帝知道魔鬼在C++的细节中.
编辑:因为它已被提及,这种行为发生在-O3和-Os.
EDIT2:Rob建议将函数放在匿名命名空间中.这样做并使用任何级别的优化进行编译确实会删除死代码,这很好.但我很好奇,所以我尝试用以下程序做同样的事情:
namespace {
void foo() { std::cout << "Foo!" << …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来检查我的C项目,编译成ELF,是否有未使用的函数,并找到它们.这是声明的函数,但在我的代码中没有被调用.
解决方案可以是以下之一:
解决方案不能是以下之一:
gprof(有些函数需要几天才能调用它们,但在代码流中你可以看到它们最终被调用)谢谢