我正在以一种非常简单的方式刺激死代码去除器。
为此,我的想法是,
步骤1:逐行读取输入的C程序并将其存储在双向链表或数组中。(因为删除和插入比文件操作更容易)。
怀疑:我的方法正确吗?如果是这样,如何最小化每次遍历链表。
第 2 步:将并行分析读取的字符串,并创建表以维护变量名称及其详细信息、函数及其调用等,
第 3 步:将对变量表中的每个条目进行搜索,并将变量替换为其当时的值(因为它有)。(例如)
i=0;
if(i==3) will be replaced by if(0==3).
但是在这样的情况下..
get(a);
i=a;
if(i){}
在这里,'i' 不会被替换,因为它取决于另一个变量。'a' 不会被替换,因为它取决于用户输入。
怀疑:如果用户输入的是 if(5*5+6){print hello;} ,那肯定是不必要的检查。我如何解决这个表达式以将代码简化为 { print hello; }
第 4 步:将在字符串中搜索 if(0)、while(0) 等,并使用堆栈移除操作块。if(0){//这将被删除*/}
第 5 步:(例如)函数 foo(){/**/} ... if(0) foo(); ...,一旦删除了所有死代码,就会检查函数表中 foo() 的条目,以获取它在代码中被引用的次数。如果为 0,则必须使用相同的堆栈方法删除该函数。
第 6 步:在其余函数中,除了“}”之外,return 语句(如果有)下面的行被删除。这种移除一直持续到函数结束。函数的结尾使用堆栈来标识。
第 7 步:我假设我的无死代码现在已经准备好了。将链表或数组存储在输出文件中。
我的问题是.. 1.我的想法是否有意义?还是可以实施?我该如何改进这个算法?
2.当我试图实现这个想法时,我必须更多地处理字符串操作而不是删除死代码。有什么方法可以减少此算法中的字符串操作。