我已经通过网络问了几个关于这个问题的问题,但我没有找到任何问题的答案,或者它是针对另一种语言的,或者它没有完全回答(死代码不是无用的代码)所以这是我的问题:
编译器是否忽略(显式或非显式)无用代码?
例如,在此代码中:
double[] TestRunTime = SomeFunctionThatReturnDoubles;
// A bit of code skipped
int i = 0;
for (int j = 0; j < TestRunTime.Length; j++)
{
}
double prevSpec_OilCons = 0;
Run Code Online (Sandbox Code Playgroud)
for循环会被删除吗?
背景是我维护了很多代码(我没有写),我想知道无用的代码是否应该是目标,或者我是否可以让编译器处理它.
我刚刚为Eclipse 安装了不必要的代码检测器并在我的项目上运行它.我看到很多所谓的"死代码".虽然从组织的角度来看,删除死/不必要的代码是有道理的,但它让我思考:
死代码实际上会阻碍Java应用程序的性能吗?!?!
对我来说,如果代码真的"死",它永远不会被执行,所以我不知道如何删除它(再次,除了组织/内务/代码清理目的)可以提高性能.
我在Eclipse中尝试了以下内容:
if (false) {}:警告'死码'while (false) {}:编译错误'无法访问的代码'我想知道这种差异是否存在真正的"原因".我已经发现了......
...但为什么不允许while (false)相同的调试目的?
如何判断是否正在使用PL/SQL包,过程或函数?是否有包含有关PL/SQL包,过程或函数用法的统计信息的Oracle表或视图?
我试图从我的项目中删除未使用的函数.由于它有数千条线,这需要永远.
代码覆盖工具可能会建议在给定测试用例中未使用的函数,但仅依赖于此可能是危险的.
还有其他工具可以帮助解决这个问题吗?
我正在阅读 JDK 11 中的 LinkedHashMap 源代码,我发现了一段死代码(我不确定)
众所周知,LinkedHashMap 使用双向链表来保存所有元素的顺序。它有一个成员叫做 accessOrder
final boolean accessOrder;
Run Code Online (Sandbox Code Playgroud)
默认情况下它是 false,但如果它被设置为 true,每次运行时get,它都会将它到达的元素移动到链表的末尾。这就是函数afterNodeAccess所做的。
//if accessOrder were set as true, after you visit node e, if e is not the end node of the linked list,
//it will move the node to the end of the linkedlist.
void afterNodeAccess(Node<K, V> e) {
LinkedHashMap.Entry<K, V> last;
if(accessOrder && (last = tail) != e) {
//if enter `if` ?it indicates that e is not the end of …Run Code Online (Sandbox Code Playgroud) 我正在使用一个继承的代码库,其中包含数千行注释掉的代码.我知道以前的编码器意味着为后代保存他所有的辛勤工作,而不是简单地删除它,但是:我永远不会读它,它只会妨碍它.一个问题的例子是当我对某些代码段执行文本搜索时,我在注释代码中得到了数十个"错误"命中.PITA.
有没有快速/简单的方法来检测大块注释掉的代码?一个聪明的RegEx或许?
我恰好在VB.NET工作,评论字符是单个撇号.
我有一个用本地C++编写的应用程序,在几年的时间里,大约有60个KLOC.有很多功能和类已经死了(可能有10-15%像下面提到的类似Unix的问题).我们最近开始对所有新代码进行单元测试,并尽可能将其应用于修改后的代码.但是,我会做一个SWAG,目前我们的测试覆盖率不到5%.
方法和/或工具必须支持:
如果方法支持超过这些要求,那么很好.
注意:我们目前使用Visual Studio 2005的专业版,而不是Team System.因此,使用Team System可能是一个有效的建议(我不知道,我从未使用它)但是我希望它不是唯一的解决方案.
我相信通用工具不可能在任何具有零误报的任意应用程序中找到所有死的(例如无法访问的代码)(我认为这相当于Halting问题).但是,我也相信通用工具有可能找到很多类型的死代码,这些代码实际上很可能已经死了,就像类或函数一样,它们在代码中永远不会引用任何其他东西.
通过使用单元测试来提供此覆盖,您不再使用通用算法,从而增加了可以检测到的死代码的百分比以及任何命中不是误报的概率.相反,使用单元测试可能会导致漏报,因为单元测试本身可能是执行给定代码段的唯一事情.理想情况下,我会进行回归测试,以执行所有外部可用的方法,API,用户控件等,这些将用作代码覆盖率分析的基线测量,以排除某些方法的误报.但遗憾的是,我目前没有这种自动化测试.
由于我拥有如此庞大的代码库,但测试用例覆盖率如此之低,我正在寻找一些可以帮助的东西,而不需要花费大量时间来编写测试用例.
您如何使用Visual Studio 2005开发环境在Windows平台上的本机C++应用程序中以自动或半自动方式检测死代码?
有没有人知道在Java EE项目中检测死代码的工具?
我已经研究了许多为纯Java项目做得很好的工具,但似乎没有什么能真正处理包含JSP和Javascript文件的项目.例如,检测Java方法正在使用中,因为它是从JSP调用的,或者检测到以前用作AJAX请求的某个JSP文件不再从任何Javascript调用.
谢谢.
随着讨论这里,javac的和其他Java编译器可以提供代码消除能力if-statements这里的条件是"常量表达式".
如果我的代码使用依赖于不同包中定义的其他常量表达式的常量表达式,这会受到什么影响?
例如,假设我在相应的指定包中有以下类:
package foo;
public class Foo {
public static final boolean CONDITION = false;
}
Run Code Online (Sandbox Code Playgroud)
和
package bar;
import foo.Foo;
public class Bar {
public void test() {
if (Foo.CONDITION) {
System.out.println("This line of code could be eliminated.");
} else {
System.out.println("This line of code will be executed.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,如果foo-package是在从外部JAR文件运行时加载,编译器不能在技术上只是假设,Foo.CONDITION将是错误的,不应该消除true的分枝的if语句来.
然而,如果Foo并且Bar实际上在同一个包中,则true应该绝对消除-branch(如果编译器完全支持代码消除).
不太确定如何最好短语这个问题,但:如何"亲密"也Foo必须是Bar常量表达式在 …
java compiler-construction dead-code constant-expression code-elimination