记录了一下做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
需要注意的地方:
- 初始化Boundary的时候检查变量类型能否存放int;
- transferNode中out要copy in的数据;
- 对InvokeEXP做近似处理,否则无法处理interprocedual的程序;
-
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来对不同的对象应用不同的操作