您如何在C/C++代码中进行死代码检测?我有一个非常大的代码库可供使用,至少10-15%是死代码.有没有基于Unix的工具来识别这个区域?有些代码仍然使用了很多预处理器,可以自动化处理吗?
我一直被告知编译器足以聪明地消除死代码.我编写的大部分代码在编译时都知道很多信息,但代码必须以最通用的形式编写.我不知道任何装配,所以我无法检查生成的装配.什么样的代码可以在最终的可执行文件中有效消除?
几个例子但不限于
f(bool b){
if(b){
//some code
}else{
//some code
}
}
f(true);
//////////////////////////
template<bool b>
f(){
if(b){
//some code
}else{
//some code
}
}
f<true>();
///////////////////////////
Run Code Online (Sandbox Code Playgroud)
如果f在其他目标代码中定义并且被调用f(true)是主要的,那该怎么办?链接时间优化会有效消除死代码吗?什么是编码样式/编译器选项/技巧,以促进死代码消除?
考虑以下代码:
@Test
public void testDeadCode() {
letsThrow();
System.out.println("will never be reached");
}
private final void letsThrow() {
throw new RuntimeException("guess you didnt see this one coming");
}
Run Code Online (Sandbox Code Playgroud)
对我来说,println()似乎绝对不可能执行 - 因为对letsThrow()的调用将始终抛出异常.
我就是这样
a)惊讶于编译器无法告诉我"这是死代码"
b)想知道是否有一些编译器标志(或eclipse设置)会告诉我:你那里有死代码.
我在寻找任何东西,例如qt-creator的插件,以突出显示c ++中未使用/无效的代码。或者,也许有一个独立的GUI工具。我正在使用基于cmake的项目。
提前致谢!
当我讨论这个话题时,我问自己以下问题。
是否存在翻译单元中一些未使用的代码将链接到 GCC 和 VC++ 等流行编译器的最终可执行代码(当然是在发布模式下)的情况?
例如假设我们有 2 个编译单元:
//A.hpp
//Here are declarations of some classes, functions, extern variables etc.
Run Code Online (Sandbox Code Playgroud)
以及源文件
//A.cpp
//defination of A.hpp declarations
Run Code Online (Sandbox Code Playgroud)
最后是主要的
//main.cpp
//including A.hpp library
#include "A.hpp"
//here we will use some stuff from A.hpp library, but not everything
Run Code Online (Sandbox Code Playgroud)
我的问题是。如果 main.cpp 中没有使用 A.hpp 中的所有内容怎么办?链接器是否会删除所有未使用的代码,或者在某些情况下,某些未使用的代码可以与可执行文件链接?
编辑:我对 G++ 和 VC++ 链接器感兴趣。
编辑:当然我的意思是在发布模式下。
编辑:我开始为这个问题提供赏金,以获得良好而完整的答案。我期待答案,它将解释在哪些情况下 g++ 和 VC++ 链接器链接垃圾以及它们能够从可执行文件中删除什么样的代码(不需要的函数、不需要的全局变量、不需要的类定义等...)以及为什么他们不能删除一些不需要的东西。
我正在发布一个独立的Linux应用程序,其中编译了Qt库.
我的应用程序是否有这将扫描我的源代码,看看哪个类/方法我的应用程序使用,那么它会掐了不必要的/没有用过的东西出了Qt源代码和编译的Qt工具库量身定做没有任何额外的膨胀?当然,这是最好的情况.但是,现有的最接近的解决方案是什么让我能够使用尽可能简化的qt库编译我的Linux独立应用程序?
c++ ×5
dead-code ×2
automation ×1
c ×1
g++ ×1
gcc ×1
java ×1
legacy-code ×1
linker ×1
linux ×1
optimization ×1
qt ×1
qt-creator ×1
templates ×1