南京大学软件分析-听课笔记
纯粹做学习记录,如有错误非常欢迎指出(
课程笔记
lesson2
invokespecial: call constructor, call superclass methods, call private methods
invokevirtual: instance methods call(virtual dispatch)
invokeinterface: cannot optimization, checking interface implementation
invokestatic: call static methods
method signature: class name: return type method name(para1,para2)
clinit初始化类的静态属性
类加载和初始化是两个操作,加载了不一定初始化。
1 | class A{ |
上方的情况,b直接会被加载到内存,即使什么也没干,也没有进行new之类的操作。加载后就会初始化调用clinit的方法。而init是new的时候会调用。
lesson3
Reaching Definitions
may analysis:输出的信息可能为正确,保证了soundness,可能的情况都考虑
must analysis:输出的信息必须正确
boundary condition都可以用语义进行分析
比如这里的第一行。因为没有definition会经过out,所以out[entry]为空
may analysis一般为空,must analysis一般为top
很重要的两句话,data-flow value指的就是该图的八个01序列,也代表着每个block的abstract,表示了当前的block会被哪些statement作为definition
gens and kills remain unchanged
when more facts flow in IN[S],the “more” facts either
- is killed
- flows to OUT[S](survivors)
when a fact is added to OUT[S],through either gens,or survivors,it stays there forever
Thus OUT[S] never shrinks
As the set of facts is finite,there must exist a pass of iteration during which nothing is added to any OUT, and then the algorithm terminates
算法在out没有任何 changes的时候停止,因为此时reach了一个fixed point也就是不动点。因为如果IN不变OUT不变,OUT不变IN不变,所以如果without changes整个系统相当于静止了。
lesson4
!!!!!视频的1h25开始多看几遍理解一下,第一遍没看懂
live Variables Analsys
注意这个图的use的意思是used before redefiniton,不是纯粹的use。解释了死代码检测的transfer function
实际操作一遍需要注意的地方是,首先如果backward的时候block有两个及以上的out,首先铭记公式
$OUT[B] = U_{s a suuccessor of B}IN[S];$
意思就是block的OUT是由该block的所有后继块的IN union而成的。所以我们直接找到其所有后继块的IN然后U一下就行了,接着有了OUT就可以求block的IN
Available Expressions Analysis
和表达式有关,还是一句话,跟着公式定义去走几遍,就能理解了
其中块内是expression one by one去执行的,所以可能会有顺序的差别,不同的expreesion的in是和相邻的expression相关的
这里意思就是,如果一个expression是available的,但是report出来是unavailable,此时是满足must的,也就是under-approximation的。实际运用的时候只是相当于少了几处优化,不会导致代码出错。
注意这里先redefine了x,后面又生成了一个e^7x,这里是需要先进行kill再gen,最后还是会有e^7x
最后是不能忘记的图
实验记录
Assignment 1
10.5
研究半天没搞懂咋验证实验的,第一天基本就看看手册看看框架看看api和注释吧
10.10
中间有事没看。9号返回学校高铁上看了一集data analysis - foundmentation。今天接着看
终于看懂实验咋做的了,之前还是没看懂框架。
写了几个函数,明天结束这个实验
11.15
完成第一个实验