标签: dead-code

我更简单的死码卸妆

我正在以一种非常简单的方式对死代码去除器进行刺激.

为此,我的想法是,

步骤1:逐行读取输入的C-Program并将其存储在双链表或数组中(因为删除和插入比文件操作更容易).

怀疑:我的方法是否正确?如果是这样,如何最小化每次遍历链接列表.

第2步:分析读取字符串将并行完成,并创建表以维护变量名称及其详细信息,函数及其调用等,

步骤3:将对变量表中的每个条目进行搜索,并且变量将被其时间的值替换(就像它一样).(例如)

i=0;
if(i==3) will be replaced by if(0==3).
Run Code Online (Sandbox Code Playgroud)

但在像......这样的情况

get(a);
i=a;
if(i){} 
Run Code Online (Sandbox Code Playgroud)

在这里,'我'将不会被替换,因为它取决于另一个变量.'a'不会被替换,因为它取决于用户输入.

怀疑:如果用户输入是if(5*5 + 6){print hello;},那肯定是不必要的检查.如何解决这个表达式来简化代码{print hello; }

步骤4:将搜索字符串if(0),while(0)等,并使用堆栈,移除动作块.if(0){//这将被删除*/}

步骤5 :(例如)函数foo(){/**/} ... if(0)foo(); ...,删除所有死代码后,检查函数表中的foo()条目以获得no.of.times它在代码中被引用.如果为0,则必须使用相同的堆栈方法删除该函数.

步骤6:在剩余的函数中,除了'}'之外,将删除返回语句下面的行(如果有的话).这种删除一直持续到功能结束.使用堆栈标识函数的结尾.

第7步:我将假设我的无死代码现已准备就绪.将链接列表或数组存储在输出文件中.

我的问题是...... 1.我的想法是否有意义?还是可以实施?如何改进此算法?

虽然我试图实现这个想法,但我必须更多地处理字符串操作而不是删除死代码.有没有办法减少此算法中的字符串操作.

c algorithm dead-code

2
推荐指数
1
解决办法
311
查看次数

抑制来自Eclipse的"所有"投诉

声明SuppressWarnings上方的注释有什么问题if?带有Sun JDK 6的Eclipse提供了两个语法错误描述,这些描述既无用又难以理解,在注释中显示.

class TestDeadCode
{
    //@SuppressWarnings("all")
    public static void main(String[] args)
    {
        @SuppressWarnings("all")  // syntax errors: insert enum body, insert enum id
        if ((Constants.flag0) && (Constants.flag1))
            System.out.println("hello\n");      
    }
}

interface Constants
{
    boolean flag0 = false;
    boolean flag1 = false;
}
Run Code Online (Sandbox Code Playgroud)

java eclipse dead-code suppress-warnings

2
推荐指数
1
解决办法
9678
查看次数

GCC LTO是否执行跨文件死代码消除?

说我有一个功能

void do_something() {
    //....
    #ifdef FEATURE_X
        feature_x();
    #endif
    //....
}
Run Code Online (Sandbox Code Playgroud)

我可以编译并运行它没有任何问题; 如果我想要我可以通过的功能-D FEATURE_X,它的工作原理.

但是,如果我想do_something放入另一个文件(并且每次我决定更改选项时也不必重新编译该文件)该怎么办?如果它在同一个文件中,我会认为

const int FEATURE_X=0;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}
Run Code Online (Sandbox Code Playgroud)

将正确使用死代码消除,取消呼叫.如果我把它放在另一个文件中,没有LTO,

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}
Run Code Online (Sandbox Code Playgroud)

它不会删除代码(它无法知道).因此,在启用链接时优化的情况下,编译器是否可以检测FEATURE_X链接时的值,确定是否使用了代码,并在适当的情况下将其删除?

gcc dead-code lto

2
推荐指数
1
解决办法
429
查看次数

如何防止编译器优化对从未使用过的变量的加载

简介:我试图快速破解修复旧代码并使用__try MSVC扩展来检查某些ptr是否指向某些合法内存,或者*ptr是否会导致内存违规(如果是这样我放弃处理此ptr).所以我写了类似的东西:

bool checkIsPtrPointingToValidAddress(const void *ptr)
{
    __try
    {
        auto cpy = *((int*)ptr); // force mem access...
        if ( (cpy ==42) && ((rand()+rand()+rand()+rand()+ rand()) == 1))
        {
            FILE* pFile = fopen ("tempdata.dat","w"); //... by unlikely but possible action
             fputs (" ",pFile);
             fclose (pFile);
        }
        return true;
    }
    __except(1)
    {
        return false;
    }

}
Run Code Online (Sandbox Code Playgroud)

事实是我强制mem访问的解决方案看起来很奇怪,丑陋,作为奖励,我不确定它是否正确.另外请不要我不能禁用整个项目的优化,所以这不是一个选项.在MSDN上进行pragma优化的文档很糟糕,也就是说""是否禁用该函数的所有优化还不清楚.

c++ seh dead-code compiler-optimization visual-c++

2
推荐指数
1
解决办法
3679
查看次数

条件声明:死代码

我正在研究JavaEE应用程序,我有以下方法:

public String alterar_data_ato_med (int cod_ato, GregorianCalendar nova_data) {
    AtoMedico a=em.find(AtoMedico.class,cod_ato);
    Medico m=a.getmedico();
    Utente u=a.getutente();
    GregorianCalendar today=new GregorianCalendar();
    if(a==null){
        return "Ato Médico inexistente!";
    }else{
        if(m.getAgenda_atos().contains(nova_data)||m.getAgenda_consultas().contains(nova_data)){
            return "Médico indisponível";
        }else{
            if(u.getAgenda().contains(nova_data)||nova_data.before(today)){
                return "Data indisponível!";
            }else{
                GregorianCalendar antiga_data=a.getData_ato_med();
                a.setData_ato_med(nova_data);
                m.getAgenda_atos().remove(antiga_data);
                u.getAgenda().remove(antiga_data);
                return "Data do ato médico alterada!";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个if-else语句似乎是"死代码".可以请有人帮我理解为什么?

java if-statement dead-code

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

为什么我在 Java 中收到死代码警告?

我在 eclipse 中从if(line == null)语句到r.close()语句收到死代码警告。

BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));

int counter = 0;

while(true)
{
    String line = r.readLine();
    counter++;

    if(line.contains(" = "))
    {
        String[] keyVal = new String[2];

        keyVal[0] = line.substring(0, line.indexOf(" = ") - 1);
        keyVal[1] = line.substring(line.indexOf(" = ") + 3);

        buffer.add(keyVal);
    }
    else
    {
        new Exception("Invalid expression at line " + counter + " in file " + file.getPath()).printStackTrace();
    }

    if(line == null) // dead code here
    { …
Run Code Online (Sandbox Code Playgroud)

java dead-code

2
推荐指数
1
解决办法
784
查看次数

静态变量初始化代码永远不会被调用

我有一个使用我制作的静态库的应用程序.库中的一个.cpp文件有一个静态变量声明,其ctor在单例上调用一个函数来执行某些操作 - 例如添加一个字符串.

现在,当我从应用程序中使用该库时,我的单例似乎不包含应该添加的字符串的任何痕迹.

我肯定错过了一些东西,但我不知道是什么......

c++ static-variables dead-code

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

for循环中i ++部分中的死代码警告

这段代码一直i++在for循环中给我一个死代码警告,并且i由于某种原因它没有递增!

import java.util.Scanner;


public class HideThatNumber {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int enc=input.nextInt();
        int tur=0;
        String test="";
        double x;
        for (int i=1;i<10;i++){
            test="";
            test+=i;
            test+=enc;
            x=Integer.parseInt(test);
            x/=11;
            if(x==Math.round(x));{
                tur=i;
                break;
            }
        }
        if(tur==0)
            System.out.println("Impossible");
        else 
            System.out.println(Integer.parseInt(test)/11);
    }
}
Run Code Online (Sandbox Code Playgroud)

java loops for-loop dead-code

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

为什么在null检查后将int设置为0被认为是没有意义的?

我有这个代码,如果它为null,则将int val设置为0:

if (null == frbdcbl.QtyOrdered)
{
    frbdcbl.QtyOrdered = 0;
}
Run Code Online (Sandbox Code Playgroud)

......但是这项任务是灰色的,好像这样的行动没有实际意义.那为什么会这样?毕竟,null!= 0.

要检查的值没有默认值0或者这样:

public class FillRateByDCByLocation
{
    . . .
    public int QtyOrdered { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

具有灰色分配的代码(AddFillRateByDCByLocationRow(())被调用如下:

foreach (FillRateByDCByLocation frbdcbl in _fillRateByDCByLocGroupedSortedSummed)
{
    AddFillRateByDCByLocationRow(frbdcbl);
}
Run Code Online (Sandbox Code Playgroud)

c# null dead-code zero

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

GCC 死码消除

GCC 或一般的编译器是否会删除被操作的变量,但根本不影响代码的结果?例如,说 main 只包含

int a = 0;
int b = 0;
for (int i = 0; i < 10; i++) {
     a += 10;
     b += 10;
}
printf("%d", a);
Run Code Online (Sandbox Code Playgroud)

变量 b 是否曾经存在于内存中,甚至在编译后进行过操作?是否有任何汇编逻辑存储和处理 b?只是不肯定这是否在死代码消除中被计算在内。谢谢。

c compilation dead-code

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