c++ - 如何在代码库中查找未引用的类

标签 c++ static-analysis

我们正处于开发阶段,其中创建了许多可能短暂存在的代码,因为它实际上是脚手架,在某些时候会被其他东西取代,但通常会继续存在并成为忘记了。

是否有任何好的技术可以在代码库中找到未使用的类?显然会有很多误报(例如库类:你可能没有使用所有标准容器,但你想知道它们在那里),但如果它们按目录列出,那么它可能更容易看到一瞥。

我可以编写一个脚本,对所有 class XXX 进行 grep,然后再次搜索所有实例,但必须忽略定义该类方法的 cpp 文件的结果。这也令人难以置信慢 - O(N^2) 代码库中类的数量

代码覆盖工具在这里并不是一个真正的选择,因为它有一个 GUI,不能以编程方式轻松调用所有功能。

平台是 Visual Studio 2013 或 Xcode/clang

编辑:我认为这不是死代码问题的重复。尽管存在重叠,但识别死代码或无法访问的代码与查找未引用的类并不完全相同。

最佳答案

如果您使用的是 Linux,则可以使用 g++ 来帮助您。

我假设只有当类的一个实例被创建时,我们才会认为它被使用。因此,与其只查找类的名称,不如查找对构造函数的调用。

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。

关于c++ - 如何在代码库中查找未引用的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24158251/

相关文章:

javascript - Android平台上的QWebView HTML5 GeoLocation

objective-c - OCLint 在 html 报告文件中出现编译错误,但我的项目构建成功。为什么

c++ - 在 C++ 中强制不使用秃头指针

c++ - 在 GYP 中检测 MSVC 版本

c++ - 二叉查找树递归显示函数,不知道是怎么实现的?

C++ SendMessage 试图接收字符串

c++ - -std=c++11 标志在 gcc/g++ 4.4.6 中无法识别

xcode - 在 Travis 上使静态分析失败导致构建失败

static-analysis - 如何构建静态代码分析工具?

java - 在java环境下解析C++源码