Skip to content

Commit

Permalink
Fix typo
Browse files Browse the repository at this point in the history
  • Loading branch information
RangerNJU committed Jan 7, 2021
1 parent ed39031 commit 39421bc
Show file tree
Hide file tree
Showing 9 changed files with 33 additions and 26 deletions.
6 changes: 3 additions & 3 deletions ch2/ch2.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,15 +185,15 @@ A:分别调用A和C中定义的foo方法。

![](../.gitbook/assets/image-20201029230504891.png)

1. 处理main后向WL中加入A.foo\(\)
2. 处理main后向WL中加入A.foo\(\)

![](../.gitbook/assets/image-20201029230535984.png)

1. 中间省略一些步骤,这里面对C.bar\(\)时,虽然会调用A.foo\(\),但由于A.foo\(\)之前已经处理过(在集合RM中),之后不会再进行处理
3. 中间省略一些步骤,这里面对C.bar\(\)时,虽然会调用A.foo\(\),但由于A.foo\(\)之前已经处理过(在集合RM中),之后不会再进行处理

![](../.gitbook/assets/image-20201029230622120.png)

1. 这里C.m\(\)是不可达的死代码
4. 这里C.m\(\)是不可达的死代码

![](../.gitbook/assets/image-20201029230909895.png)

Expand Down
2 changes: 1 addition & 1 deletion ch3/context-sensitivity/03-04-context-sensitivity.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Number id(Number n) {

**对于Java中被动态分配到heap上的对象,我们也需要对他们做相应的标记以提高分析精度。**例子:~~(或许真的需要录视频了?)~~

* 不做标记时,第八行new出来的对象无法区分,只能同一记作 $$o_8$$
* 不做标记时,第八行new出来的对象无法区分,只能同一记作 $$ o_8$$
* 做标记后,可以分别记为$$ 3:o_8$$$$ 4:o_8$$

![](../../.gitbook/assets/image-20201210151627827.png)
Expand Down
4 changes: 2 additions & 2 deletions ch3/context-sensitivity/03-05-cs2.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

因此,在接下来的内容中我们更关注和上下文相关的部分,而不像之前一样详细地关注所有细节。

值得一提的差异是,RM和CG两个集合在本节所述的上下文敏感算法中都是带有上下文信息的。举个例子,在C.S.的分析中,caller和callee都带有上下文信息($$c^t$$ 代表callee的上下文标记,c:2->$$c^t:\dots$$表示第二行的caller调用了带有$$c^t$$标记的callee):
值得一提的差异是,RM和CG两个集合在本节所述的上下文敏感算法中都是带有上下文信息的。举个例子,在C.S.的分析中,caller和callee都带有上下文信息($$ c^t$$ 代表callee的上下文标记,c:2->$$ c^t:\dots$$表示第二行的caller调用了带有$$ c^t$$标记的callee):

![](../../.gitbook/assets/image-20201210184850528.png)

Expand All @@ -51,7 +51,7 @@
* Select接收参数(这里虽然有3个参数,但并非每种实现方式都需要用到所有的3个参数)
* c。x的上下文标记
* l。调用点本身(call site),在例子中以行号标识调用点
* $$c' : o_i $$。receiver object
* $$ c' : o_i $$。receiver object
* Select返回callee的context $$ c^t$$

## Context Sensitivity Variants
Expand Down
4 changes: 3 additions & 1 deletion ch3/pointer-analysis/03-01-pointer-analysis-spa.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,9 @@ Java中的Pointers有以下几类:
* Array element: array\[i\]
* 涉及数组的分析中,我们**忽略下标**,代之以一个域(a single field)。例如,在下图中我们用arr表示。
* 原因之一:数组下标是变量时难以计算具体值
* 在之后介绍的算法中,**可作为Instance field处理**![](../../.gitbook/assets/image-20201105194030384.png)
* 在之后介绍的算法中,**可作为Instance field处理**

![](../../.gitbook/assets/image-20201105194030384.png)

### 关注的语句类型

Expand Down
14 changes: 7 additions & 7 deletions ch3/pointer-analysis/03-02-pointer2-analysis-spa.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

分别定义变量,域,对象(用下标标识是在第几行创建的对象),实例域和指针(是变量和实例对象的并),和指向关系。`X`表示笛卡尔积。

pt\(p\)代表的是指针p可能指向的对象。如在下面的代码块后,pt\(x\)可能指向的目标可以记为$${o_2,o_4}$$(以行号作为object的下标)。
pt\(p\)代表的是指针p可能指向的对象。如在下面的代码块后,pt\(x\)可能指向的目标可以记为$$ {o_2,o_4}$$(以行号作为object的下标)。

```java
if(...){
Expand Down Expand Up @@ -67,8 +67,8 @@ _别处的资料都没有全家桶,只介绍某些特殊情况下的分析算

inclusion constraints的具体解释:在上述表示的结论部分中可以写作两个集合间的包含关系。如Load应该表示为:

* 前提:`y=x.f`$$o_i \in pt(x)$$
* 结论:$$pt(o_i.f) \subset pt(y)$$
* 前提:`y=x.f`$$ o_i \in pt(x)$$
* 结论:$$ pt(o_i.f) \subset pt(y)$$

> Key to implementation: when 𝑝𝑡\(𝑥\)is **changed**, **propagate** the **changed par**t to the **related pointers** of 𝑥
Expand All @@ -92,7 +92,7 @@ inclusion constraints的具体解释:在上述表示的结论部分中可以

### Example

假设c和d一开始都指向 $$o_i$$,根据上述规则,我们能够从左侧的程序语句从上到下构建出右侧的指针流图。
假设c和d一开始都指向 $$ o_i$$,根据上述规则,我们能够从左侧的程序语句从上到下构建出右侧的指针流图。

![](../../.gitbook/assets/image-20201105201746860.png)

Expand All @@ -111,7 +111,7 @@ PFG的整个构造过程,需要在构建PFG和在已有的PFG上传递指向
* 由于做流不敏感分析。输入为Set,丢失了语句的顺序关系也没关系。
* WorkList:保存接下来要处理的指向信息,与BFS中的队列作用类似。
* pts定义:Each worklist entry 𝑛, 𝑝𝑡𝑠 is a pair of pointer 𝑛 and points-to set 𝑝𝑡𝑠, which means that 𝑝𝑡𝑠 should be propagated to 𝑝𝑡\(𝑛\)
* E.g., $$[(x,\{o_i\}),(y,\{o_j, o_k\}),(x.f,\{(o_l)\}),\dots]$$
* E.g., $$ [(x,\{o_i\}),(y,\{o_j, o_k\}),(x.f,\{(o_l)\}),\dots]$$

首先,四个红框部分对应之前提到的四种基本语句——New、Assign、Store和Load。接下来做详细讲解。

Expand Down Expand Up @@ -155,11 +155,11 @@ Solve(𝑆)
![](../../.gitbook/assets/image-20201112194234928.png)
然后是b->c->d的传递路线,虽然 $$\{o_1, o_3\}$$之前已经在c所指向的集合中了,但依然需要参与传播,这是冗余的。
然后是b->c->d的传递路线,虽然 $$ \{o_1, o_3\}$$之前已经在c所指向的集合中了,但依然需要参与传播,这是冗余的。
![](../../.gitbook/assets/image-20201112194358502.png)
我们再来看使用Differential Propagation的情况,只需要传播$$\{o_5\}$$一项即可。在实际应用中这能够大大减小开销。
我们再来看使用Differential Propagation的情况,只需要传播$$ \{o_5\}$$一项即可。在实际应用中这能够大大减小开销。
![](../../.gitbook/assets/image-20201112194555582.png)
Expand Down
14 changes: 7 additions & 7 deletions ch3/pointer-analysis/03-03-pointer3-analysis-spa.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ void foo(A a) {

![](../../.gitbook/assets/image-20201126184745576.png)

1. 传参数
3. 传参数

![](../../.gitbook/assets/image-20201126185008506.png)

1. 传返回值
4. 传返回值

![](../../.gitbook/assets/image-20201126185233403.png)

Expand All @@ -63,15 +63,15 @@ void foo(A a) {

#### Detail-1

**Question: Why not add PFG edge 𝑥 →** $$𝑚_{𝑡ℎ𝑖𝑠}$$****
**Question: Why not add PFG edge 𝑥 →** $$ 𝑚_{𝑡ℎ𝑖𝑠}$$****

通过这两个图可以直观地说明原因:

![](../../.gitbook/assets/image-20201126231403264.png)

![](../../.gitbook/assets/image-20201126231437769.png)

_在每次算法执行时,_$$o_i$$_是确定的某个(只有一个)对象,然后针对这个对象做Dispatch,能够找到对应的唯一的receiver object._
_在每次算法执行时,_$$ o_i$$_是确定的某个(只有一个)对象,然后针对这个对象做Dispatch,能够找到对应的唯一的receiver object._

#### Detail-2

Expand Down Expand Up @@ -102,7 +102,7 @@ _在每次算法执行时,_$$o_i$$_是确定的某个(只有一个)对象
AddReachable的作用是:

* **输入参数**m是最新的可达方法。
* 函数修改维护全局的RM、S和$$S_m$$,并处理新的方法m中的New和Assign语句。
* 函数修改维护全局的RM、S和$$ S_m$$,并处理新的方法m中的New和Assign语句。

![](../../.gitbook/assets/image-20201126194125039.png)

Expand All @@ -112,13 +112,13 @@ AddReachable的作用是:

_l代表call site。可以用行号作为call site的label。_

> Answer: $$o_j, o_k$$同样可能通过Dispatch返回同一个m。
> Answer: $$ o_j, o_k$$同样可能通过Dispatch返回同一个m。
### Function:ProcessCall

ProcessCall的作用是:

* 输入的$$o_i$$是x新指向的目标。
* 输入的$$ o_i$$是x新指向的目标。
* 函数在可达的语句集合S中,选择所有与x有关的过程调用,做之前提到的数据流相关四步处理(确定被调用方法、传对象、传参数,传返回值)。

![](../../.gitbook/assets/image-20201126195311513.png)
Expand Down
10 changes: 7 additions & 3 deletions ch4/04-02-Datalog-Based-PA.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ Datalog是一种命令式(Declarative)的编程语言。
Atoms可以分成两类

- Relational Atoms
- <img src="04-02-Datalog-Based-PA.assets/image-20201223185504296.png" style="zoom:50%;" />

<img src="04-02-Datalog-Based-PA.assets/image-20201223185504296.png" style="zoom:50%;" />

- Arithmetic Atoms
-`age >= 18`

Expand Down Expand Up @@ -236,7 +238,9 @@ e = d.f;

## Datalog Model

同样需要用户提供Source和Sink。输出被标记的数据可能流到的Sink方法。<img src="04-02-Datalog-Based-PA.assets/image-20201223201956852.png" style="zoom:50%;" />
同样需要用户提供Source和Sink。输出被标记的数据可能流到的Sink方法。

<img src="04-02-Datalog-Based-PA.assets/image-20201223201956852.png" style="zoom:50%;" />

## Datalog Rules

Expand All @@ -256,4 +260,4 @@ e = d.f;
- Overall Review
- **Datalog** language
- How to implement **pointer analysis via Datalog**
- How to implement **taint analysis via Datalog**
- How to implement **taint analysis via Datalog**
3 changes: 2 additions & 1 deletion ch5/05-01-IFDS.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@
- 这个问题和括号匹配问题本质上是一样的。
- 如果你是计算机系大一的学生,或许会想到用stack来做括号匹配问题。
- 而如果你刚刚修过计算理论课程,你应该能够想起来使用上下文无关文法能够很好地识别一个匹配的括号串(Balanced-Parenthesis Problem)。
- <img src="05-01-IFDS.assets/image-20201224201921134.png" style="zoom:50%;" />

<img src="05-01-IFDS.assets/image-20201224201921134.png" style="zoom:50%;" />

# CFL-Reachability

Expand Down
2 changes: 1 addition & 1 deletion ch5/05-02-Soundiness.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ JNI允许JVM与Native Code写出的Native Lib交互。进而提供与OS交互、

<img src="05-02-Soundiness.assets/image-20201224200127291.png" style="zoom:50%;" />

arraycory(src,3,dest,4,5)就是从src的第三个元素起,拷贝起始位置是dest的第四个元素,总共拷贝5个元素。
arraycopy(src,3,dest,4,5)就是从src的第三个元素起,拷贝起始位置是dest的第四个元素,总共拷贝5个元素。

如果不分析Native Code,我们就会失去很多信息。而Modeling的分析方法是:

Expand Down

0 comments on commit 39421bc

Please sign in to comment.