我正在以一种非常简单的方式对死代码去除器进行刺激.
为此,我的想法是,
步骤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.我的想法是否有意义?还是可以实施?如何改进此算法?
虽然我试图实现这个想法,但我必须更多地处理字符串操作而不是删除死代码.有没有办法减少此算法中的字符串操作.
声明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) 说我有一个功能
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链接时的值,确定是否使用了代码,并在适当的情况下将其删除?
简介:我试图快速破解修复旧代码并使用__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优化的文档很糟糕,也就是说""是否禁用该函数的所有优化还不清楚.
我正在研究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语句似乎是"死代码".可以请有人帮我理解为什么?
我在 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) 我有一个使用我制作的静态库的应用程序.库中的一个.cpp文件有一个静态变量声明,其ctor在单例上调用一个函数来执行某些操作 - 例如添加一个字符串.
现在,当我从应用程序中使用该库时,我的单例似乎不包含应该添加的字符串的任何痕迹.
我肯定错过了一些东西,但我不知道是什么......
这段代码一直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) 我有这个代码,如果它为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) 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?只是不肯定这是否在死代码消除中被计算在内。谢谢。