如何在C/C++代码中检测死代码?我有一个相当大的代码库需要处理,其中至少有10-15%是死代码。是否有基于Unix的工具可以识别这些区域?有些代码片段仍然使用大量的预处理器,自动化过程能够处理吗?
如何在C/C++代码中检测死代码?我有一个相当大的代码库需要处理,其中至少有10-15%是死代码。是否有基于Unix的工具可以识别这些区域?有些代码片段仍然使用大量的预处理器,自动化过程能够处理吗?
gcov
)可以提供数据,指出特定运行软件的哪些代码未被覆盖——未被覆盖的代码不一定是死代码。软件的不同运行方式(例如不同的编译选项、不同的运行时选项或不同的输入数据)或不同的执行路径(例如错误处理)可能会触发之前未被调用的函数。 - Arun使用gcc进行编译,加上-Wunreachable-code参数。
我认为版本越新,结果就越好,但我可能对他们一直在积极开发这个工具的印象有误。请注意,这个工具会进行流程分析,但我不认为它会告诉你关于预处理器离开时就已经无用的代码,因为编译器从未解析过它。它也不会检测例如未被调用的导出函数或只是恰好永远不会调用具有特殊情况处理的代码 - 您需要使用代码覆盖率(而非单元测试)来完成这些任务。单元测试应该有100%的代码覆盖率,并且执行应用程序所涉及的“死”代码路径。尽管如此,考虑到这些限制,这仍然是一个简单的方法来开始查找代码库中最完全混乱的例程。
printf
的参数使用)。Frama-C有一个指出备用代码的选项。无论是Mozilla还是Open Office,都有自己的解决方案。
g++ 4.01 -Wunreachable-code 警告函数内部不可达的代码,但不会警告未使用的函数。
int foo() {
return 21; // point a
}
int bar() {
int a = 7;
return a;
a += 9; // point b
return a;
}
int main(int, char **) {
return bar();
}
g++ 4.01会对点b发出警告,但对于不可达的函数foo()(点a)却什么都不说,尽管在该文件中无法访问它。这种行为是正确的,尽管令人失望,因为编译器无法知道函数foo()是否在其他编译单元中未被声明为extern并从那里调用;只有链接器才能确定。
Bullseye 覆盖率工具会很有帮助。不过它并不是免费的。