我有遗留的C++代码,我应该从中删除未使用的代码.问题是代码库很大.
如何找出从未调用/从未使用过的代码?
您使用什么工具在大型Java项目中查找未使用/死代码?我们的产品已经开发了几年,手动检测不再使用的代码变得非常困难.但是,我们尝试尽可能多地删除未使用的代码.
还赞赏对一般战略/技术(特定工具除外)的建议.
编辑:请注意,我们已经使用了代码覆盖率工具(Clover,IntelliJ),但这些都没有多大帮助.死代码仍然有单元测试,并显示为覆盖.我想一个理想的工具可以识别出具有很少其他代码的代码簇,从而允许docues手动检查.
struct SemanticDirection;
fn main() {}
Run Code Online (Sandbox Code Playgroud)
warning: struct is never used: `SemanticDirection`
--> src/main.rs:1:1
|
1 | struct SemanticDirection;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: #[warn(dead_code)] on by default
Run Code Online (Sandbox Code Playgroud)
我会将这些警告重新发送给任何严肃的事情,但我只是在修补这种语言而这正在驱使我蝙蝠.
我尝试添加#[allow(dead_code)]
到我的代码,但这不起作用.
有一个检查"未使用的声明",它可以找到Intellij Idea中所有未使用的代码.(看到这个问题)但我想找到所有未使用的类,而不是方法,变量等.只有类.(很难找到3000个结果列表中的类).我怎么能这样做?
请考虑以下声明:
*((char*)NULL) = 0; //undefined behavior
Run Code Online (Sandbox Code Playgroud)
它明确地调用未定义的行为.在给定的程序中是否存在这样的语句意味着整个程序是未定义的,或者一旦控制流命中这个语句,该行为只会变得不确定?
如果用户从未输入数字,3
是否可以明确定义以下程序?
while (true) {
int num = ReadNumberFromConsole();
if (num == 3)
*((char*)NULL) = 0; //undefined behavior
}
Run Code Online (Sandbox Code Playgroud)
或者,无论用户输入什么,它都是完全未定义的行为?
此外,编译器是否可以假定在运行时永远不会执行未定义的行为?这样可以及时推理:
int num = ReadNumberFromConsole();
if (num == 3) {
PrintToConsole(num);
*((char*)NULL) = 0; //undefined behavior
}
Run Code Online (Sandbox Code Playgroud)
在这里,编译器可以推断,以防num == 3
我们总是调用未定义的行为.因此,这种情况必须是不可能的,并且不需要打印该号码.整个if
声明可以优化.根据标准,是否允许这种向后推理?
c++ dead-code undefined-behavior language-lawyer unreachable-code
您如何在C/C++代码中进行死代码检测?我有一个非常大的代码库可供使用,至少10-15%是死代码.有没有基于Unix的工具来识别这个区域?有些代码仍然使用了很多预处理器,可以自动化处理吗?
我们正在重构遗留的Web应用程序,因此"杀死"了相当多的JavaScript代码,但我们害怕因为不确定而删除我们认为是死代码的内容.是否有任何工具/技术可以在JavaScript中正确识别死代码?
有谁知道原因:
public void foo()
{
System.out.println("Hello");
return;
System.out.println("World!");
}
Run Code Online (Sandbox Code Playgroud)
将被报告为Eclipse下的"无法访问的错误",但是
public void foo()
{
System.out.println("Hello");
if(true) return;
System.out.println("World!");
}
Run Code Online (Sandbox Code Playgroud)
只触发"死代码"警告?
我能想到的唯一解释是Java编译器只标记第一个,而Eclipse中的一些额外分析计算出第二个.但是,如果是这种情况,为什么Java编译器不能在编译时弄清楚这种情况呢?
Java编译器不会在编译时弄清楚if(true)没有效果,从而产生基本相同的字节码吗?在什么时候应用可达代码分析?
我想一个更通用的方法来思考这个问题是:"什么时候应用可达代码分析"?在将第二个Java代码片段转换为最终字节码时,我确信在某些时候删除了"if(true)"运行时等效项,并且两个程序的表示变得相同.然后,Java编译器不会再次应用其可访问的代码分析吗?
我有一个在Visual Studio 2008下编译的大型遗留C++项目.我知道有相当数量的"死"代码无法在任何地方访问 - 未调用的方法,未使用的整个类.
我正在寻找一种可以通过静态分析识别出来的工具.
这个问题:传统C/C++项目中的死代码检测建议使用代码覆盖工具.这不是一个选项,因为测试覆盖率不够高.
它还提到了一个无法访问的代码.gcc的选项.我想要一些类似于Visual Studio的东西.我们已经使用链接器的/ OPT:REF选项来删除冗余代码,但是这并没有报告死代码的有用级别(当与/ VERBOSE一起使用时,有超过100,000行,包括来自库的很多行).
有没有更好的选项适合Visual Studio项目?
所以你在一个相当沉重的项目中有一些遗留代码.如何查找和删除死函数?
我已经看到了这两个引用:查找未使用的代码和工具来查找php项目中未使用的函数,但它们似乎分别特定于C#和PHP.
是否有一个Python工具可以帮助您找到源代码中其他地方未引用的函数(尽管有反射/等)?
dead-code ×10
c++ ×4
java ×3
refactoring ×3
automation ×1
eclipse ×1
javascript ×1
legacy-code ×1
optimization ×1
python ×1
rust ×1
warnings ×1