2022-11-18-NJU程序分析实验

记录了一下做NJU PASCAL Lab的实验中的一些问题; 两位老师讲的非常好,实验设计的感觉也是环环相扣,逐步递进,只能说南大比武大还是强太多

一些有用的链接

  • https://github.com/MirageLyu/Tai-e-assignments
  • https://github.com/DianQK/Tai-e-assignments-tips/
  • https://dianqk.blog/2022/07/17/tai-e/
  • https://github.com/RicoloveFeng/SPA-Freestyle-Guidance/
  • https://meizjm3i.github.io/2022/07/09/taie-1/
  • https://github.com/canliture/nju-software-analysis-homework
  • https://github.com/pascal-lab/Tai-e-assignments/issues/2
  • https://tai-e.pascal-lab.net/
  • https://eterniter.github.io/Static%20Program%20Analysis/A2/
  • https://github.com/Xstar9/nju-Tai-e-assignments

A2 ConstantPropagation

需要注意的地方:

  1. 初始化Boundary的时候检查变量类型能否存放int;
  2. transferNode中out要copy in的数据;
  3. 对InvokeEXP做近似处理,否则无法处理interprocedual的程序;
  4. BinaryEXP中也可能有NAC和Undef的情况;

    int UNDEF(){
    	y = x+1;
    	return y;
    }
       
    int NAC(int p){
      x = p;
      y = x+1;
    }
    

https://github.com/RicoloveFeng/SPA-Freestyle-Guidance/blob/main/assignments/Assignment%202.md

看了这里和issue里面的提示

里面说到除零错返回的是UNDEF,即使a/0这里a是NAC也要返回UNDEF🤔

没太想明白

最后还是有两个测试用例没过

又读了一遍代码发现是最后的return null

如果有不支持的调用方式比如类的方法调用之类的,就会走到最后的情况

改成return Value.getNAC()就过了

A3 DeadCode Detection

这里做的时候首先得到了38/40的结果

后面看到一个提示说,在做DeadAssignment的处理的时候

LValue不一定总是Var

增加了一句lv instanceof Var的判断 就通过了

但是这个好奇怪,LValue还能不是Var的吗🤔

A5 Pointer Analysis

关于访问者模式:

https://refactoringguru.cn/design-patterns/factory-method

实际上主要是通过accept和visit的方法,抽象出来数据结构和算法

可以用visit来对不同的对象应用不同的操作