标签: dead-code

Windows上的本机C++应用程序中的自动死代码检测?

背景

我有一个用本地C++编写的应用程序,在几年的时间里,大约有60个KLOC.有很多功能和类已经死了(可能有10-15%像下面提到的类似Unix的问题).我们最近开始对所有新代码进行单元测试,并尽可能将其应用于修改后的代码.但是,我会做一个SWAG,目前我们的测试覆盖率不到5%.

假设/约束

方法和/或工具必须支持:

  • 本机(即非托管)C++
  • Windows XP
  • Visual Studio 2005
  • 不得要求用户提供测试用例以进行覆盖.(例如,不能依靠单元测试来生成代码覆盖)

如果方法支持超过这些要求,那么很好.

注意:我们目前使用Visual Studio 2005的专业版,而不是Team System.因此,使用Team System可能是一个有效的建议(我不知道,我从未使用它)但是我希望它不是唯一的解决方案.

为什么使用单元测试代码覆盖是有问题的

我相信通用工具不可能在任何具有零误报的任意应用程序中找到所有死的(例如无法访问的代码)(我认为这相当于Halting问题).但是,我也相信通用工具有可能找到很多类型的死代码,这些代码实际上很可能已经死了,就像类或函数一样,它们在代码中永远不会引用任何其他东西.

通过使用单元测试来提供此覆盖,您不再使用通用算法,从而增加了可以检测到的死代码的百分比以及任何命中不是误报的概率.相反,使用单元测试可能会导致漏报,因为单元测试本身可能是执行给定代码段的唯一事情.理想情况下,我会进行回归测试,以执行所有外部可用的方法,API,用户控件等,这些将用作代码覆盖率分析的基线测量,以排除某些方法的误报.但遗憾的是,我目前没有这种自动化测试.

由于我拥有如此庞大的代码库,但测试用例覆盖率如此之低,我正在寻找一些可以帮助的东西,而不需要花费大量时间来编写测试用例.

您如何使用Visual Studio 2005开发环境在Windows平台上的本机C++应用程序中以自动或半自动方式检测死代码?

也可以看看

传统C/C++项目中的死代码检测 我想告诉VC++编译器编译所有代码.可以吗?

c++ windows code-coverage visual-studio-2005 dead-code

12
推荐指数
1
解决办法
4808
查看次数

如何在企业Java项目(Java + JSP + Javascript)中检测死代码?

有没有人知道在Java EE项目中检测死代码的工具?

我已经研究了许多为纯Java项目做得很好的工具,但似乎没有什么能真正处理包含JSP和Javascript文件的项目.例如,检测Java方法正在使用中,因为它是从JSP调用的,或者检测到以前用作AJAX请求的某个JSP文件不再从任何Javascript调用.

谢谢.

javascript java jsp dead-code java-ee

12
推荐指数
1
解决办法
734
查看次数

在C#中检测死代码

如何在C#应用程序中检测死代码?

c# dead-code detection

11
推荐指数
2
解决办法
5244
查看次数

C++虚函数:链接器是否可以删除未调用的虚函数表中的条目?

这个问题是一种消除未使用的虚函数的后续问题,对我的兴趣不够深入.

问题:在定义具有虚函数的类时,编译器为虚函数表分配存储,并存储指向表中函数的指针.这会导致链接器保留这些函数的代码,无论它们是否被调用.即使编译器优化设置要求消除死代码,这也可能导致大量死代码保留在可执行文件中.

现在,如果在可执行文件中没有任何地方存在特定虚函数的调用(或者换句话说,访问虚函数表的相应槽),则可以从虚函数表中省略相应的函数指针,并且链接器将删除函数的代码,可能会进一步遗漏其他未引用的代码.

显然,这不能由编译器完成,因为它只在链接时变得清楚是否调用了特定的虚函数(假设静态链接 - 很明显它不能用动态链接完成).我对链接器不够熟悉,以便判断编译器是否能够以链接器可以选择性地忽略表中各个未使用的条目的方式发出虚函数表.

基本上,我的思路是这样的:虚函数表中的函数指针是对函数的引用,链接器使用该函数来确定函数的代码需要保留在可执行文件中.以类似的方式,虚函数调用是对从其虚函数被调用的类派生的所有虚函数表中的特定槽的引用.这种引用是否可以通过这样一种方式传递给链接器:当它没有引用时,它可以忽略虚函数表槽?

请注意,当编译器可以在编译时确定调用目标时,这与使用直接调用替换虚函数调用不同.我知道一些编译器可以做到这一点,但这是一个不同的情况,因为函数实际上被调用,并且它是被删除的虚函数调度的开销.在我的情况下,我希望删除未调用的函数的整个代码.

如果我可以控制所有类定义,我可以手动删除所有未调用的虚函数.但是在使用库时这是不现实的.

这可以通过"链接时间优化"或"整个程序优化"来完成吗?是否有成功的编译器?

c++ linker dead-code vtable compiler-optimization

11
推荐指数
1
解决办法
879
查看次数

检测未使用的Spring bean

给定一个只包含eager(非惰性)单例bean的Spring配置,即默认值,如果没有将任何bean注入任何地方,是否可以让Spring抛出异常?我本质上是在寻找一种以Spring bean的形式检测死代码的方法.

我的问题有点类似于这些.

然而,

  • 我对手动检查图形或解析日志数据不感兴趣.
  • 我没有多个上下文文件,覆盖bean,bean后处理或xml的复杂性.这是一个简单,直接,注释驱动的配置.
  • 我正在使用Spring Boot 1.2.6,这比那些问题要新几年(可能存在新功能).

如果缺少必要的bean,Spring肯定会抛出异常.它是否也会在相反的情况下抛出异常,在这种情况下找到bean但不必要?

java dead-code spring-bean spring-boot

11
推荐指数
1
解决办法
1459
查看次数

使用GCC查找无法访问的函数("死代码")

嘿伙计们,我一直在寻找一种在(非常)大的C++项目中找到静态无法访问的函数的方法.我曾尝试使用doxygen和其他静态分析工具,但似乎项目太复杂,无法处理.最后我决定使用GCC工具(g ++,gprof,gcov等)是最安全的选择,虽然我无法弄清楚如何做到这一点.我认为g ++优化消除了静态无法访问的函数,但我不确定如何获取它消除的函数的名称.

你有什么建议吗?

谢谢!

c++ gcc dead-code

10
推荐指数
1
解决办法
3621
查看次数

Java:消除死代码

我想知道Java将如何处理以下场景:

假设我有一个名为Debug的类,它看起来像这样:

public class Debug 
{
    private static final boolean isAssertEnabled = true;

    public static void assertTrue(boolean b, String errorMessage) {
        if (isAssertEnabled) {
            if (!b) {
                throw new RuntimeException(errorMessage);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并假设我的代码有一个看起来像这样的调用:

...
Debug.assertTrue((x + y != z) && (v - u > w), "Some error message");
....
Run Code Online (Sandbox Code Playgroud)

我有几个问题:

  1. 如果isAssertEnabled标志设置为false,那么整个对Debug.assertTrue的调用是否会被编译出来?请注意,检查isAssertEnabled == true是否仅在函数调用后在函数内部进行.
  2. 如果整个调用都被编译出来,那是否也意味着编译出布尔表达式的评估?如果没有任何评价表达将是一种浪费.

谢谢你的帮助!

java compilation dead-code

10
推荐指数
1
解决办法
4050
查看次数

Java编译器:停止抱怨死代码

出于测试目的,我经常开始在现有项目中键入一些代码.所以,我想要测试的代码出现在所有其他代码之前,如下所示:

public static void main(String[] args)
{
    char a = '%';
    System.out.println((int)a);
    // To know where '%' is located in the ASCII table.

    // But, of course, I don't want to start the whole project, so:
    return;

    // The real project starts here...
}
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨return-statement,因为下面的"死代码".(在C++中,编译器服从程序员并简单地编译return语句)

为了防止编译器抱怨,我写了一个愚蠢的if陈述:

if (0 != 1) return;
Run Code Online (Sandbox Code Playgroud)

我讨厌它.为什么编译器不能按我要求做?是否有一些编译标志或注释或其他什么来解决我的问题?

谢谢

java compiler-construction return dead-code

8
推荐指数
1
解决办法
1171
查看次数

.NET在多个解决方案中找到死代码

我们的产品有大约15个解决方案,每个解决方案都有很多项目.

问题很简单:哪个工具可以让我们在整个代码库中搜索死代码?

在单个解决方案中搜索很容易(对于那个解决方案,有很多答案).

但是,确定AlphaSol解决方案AlphaProj项目中的"public void Foo()"是否实际上用于例如BetaSol?

.net projects-and-solutions reference dead-code visual-studio

8
推荐指数
1
解决办法
1234
查看次数

Eclipse将行标记为死代码

我有这个函数,有一些死的代码,由Eclipse标记.

我有两行检查a&b.检查b的行标记为空.

    public int[] runThis(List<Integer> buildIds, List<Integer> scenarios, boolean oflag) {

    int rating[] = new int[scenarios.size()];

    if(buildIds == null) {
        System.out.println("ERROR - Building ID list is null!");
        return null;
    }

    if(scenarios == null) {
        System.out.println("ERROR - Scenario list is null!"); //dead
        return null; //dead
    }

    return rating;      

}
Run Code Online (Sandbox Code Playgroud)

为什么Ellipse让这两条线死了?有帮助吗?非常感谢你花时间陪伴.

java eclipse dead-code

8
推荐指数
1
解决办法
3942
查看次数