我们正处于开发阶段,其中有很多代码可能是短暂存在的,因为它实际上是脚手架,在某些时候会被其他东西取代,但通常会继续存在并成为被遗忘了。
是否有任何好的技术可以在代码库中查找未使用的类?显然会有很多误报(例如库类:你可能没有使用所有的标准容器,但你想知道它们在那里),但如果它们按目录列出,那么它可能会更容易看到它一目了然。
我可以编写一个greps for all class XXX
的脚本,然后再次搜索所有实例,但是必须省略定义类的方法的cpp文件的结果。这也会非常慢--O( N ^ 2)代码库中的类数
代码覆盖率工具实际上并不是一个选项,因为它有一个GUI,无法以编程方式轻松调用所有函数。
平台是Visual Studio 2013或Xcode / clang
编辑:我不认为这是死代码问题的重复。虽然存在重叠,但识别死的或无法访问的代码与查找未引用的类并不完全相同。答案 0 :(得分:1)
如果您使用的是linux,那么您可以使用g++
来帮助您。
我将假设只有在创建类的实例时才会将其视为 used 。因此,您可以查找对构造函数的调用,而不仅仅是查找类的名称。
struct A
{
A () { }
};
struct B
{
B () { }
};
struct C
{
C () { }
};
void bar ()
{
C c;
}
int main ()
{
B b;
}
至少在Linux上,在二进制文件上运行nm
会有以下错位名称:
00000000004005bc T _Z3barv
00000000004005ee W _ZN1BC1Ev
00000000004005ee W _ZN1BC2Ev
00000000004005f8 W _ZN1CC1Ev
00000000004005f8 W _ZN1CC2Ev
我们马上就可以告诉他们没有任何一个建设者来自' A'叫做。
使用此SO answer稍加修改的信息,我们也可以g++
删除未使用的函数调用图:
结果是:
00000000004005ba W _ZN1BC1Ev
00000000004005ba W _ZN1BC2Ev
所以,至少在linux上,你可以说最终的可执行文件中既不需要A也不需要C.
答案 1 :(得分:0)
我想出了一个简单的shell脚本,它至少有助于将注意力集中在被引用最少的类上。我假设如果没有使用某个类,那么它的名称仍然会出现在一个或两个文件中(标题中的声明和cpp文件中的定义)。因此,该脚本使用ctags在源目录中搜索类声明。然后对于每个类,它执行递归grep以查找提及该类的所有文件(注意:您可以指定不同的类和用法目录),最后它将文件计数和类名写入文件并按数字顺序显示它们。然后,您可以查看仅有1或2个提及的所有条目。
#!/bin/bash
CLASSDIR=${1:-}
USAGEDIR=${2:-}
if [ "${CLASSDIR}" = "" -o "${USAGEDIR}" = "" ]; then
echo "Usage: find_unreferenced_classes.sh <classdir> <usagedir>"
exit 1
fi
ctags --recurse=yes --languages=c++ --c++-kinds=c -x $CLASSDIR | awk '{print $1}' | uniq > tags
[ -f "counts" ] && rm counts
for class in `cat tags`;
do
count=`grep -l -r $class $USAGEDIR --include=*.h --include=*.cpp | wc -l`
echo "$count $class" >> counts
done
sort -n counts
示例输出:
1 SomeUnusedClassDefinedInHeader
2 SomeUnusedClassDefinedAndDeclaredInHAndCppFile
10 SomeClassUsedLots