From 90b8c4cfc79e698d4eed5a2ca1c1fa52d5a36314 Mon Sep 17 00:00:00 2001 From: Ranger Date: Thu, 5 Nov 2020 15:23:27 +0800 Subject: [PATCH] Move lec2-6 to drafts directory. --- README.md | 42 +++++---- SUMMARY.md | 2 - ch0/00-01-why-this-book.md | 3 +- ch0/00-02-sources-and-license.md | 2 +- ch1/01-01-whats-spa.md | 150 ------------------------------- ch1/01-02-ir.md | 78 ---------------- ch1/README.md | 4 +- ch2/README.md | 6 +- ch3/README.md | 6 +- ch4/04-01-inter-analysis-spa.md | 30 +++---- ch4/README.md | 6 +- 11 files changed, 46 insertions(+), 283 deletions(-) diff --git a/README.md b/README.md index c933363..87e313b 100644 --- a/README.md +++ b/README.md @@ -8,18 +8,21 @@ Getting started with static program analysis. Read this and start writing your f 静态程序分析入门。阅读此书并着手编写你的第一个静态程序分析器吧! -## 我想听到你的声音 +## 表达你的声音 -- **批评的意见很有价值。** 这是我第一次书写教程,一定有很多做得不好的地方。如果你觉得我写得不好,可以选择提issue或者通过邮箱联系我(ranger.nju#gmail.com)。 +- **批评的意见很有价值。** 这是我第一次书写教程,一定有很多做得不好的地方。如果你觉得有值得修改或值得讨论的地方(包括但不仅限于行文风格,内容准确性,图例与解释的易读性等等),可以选择: + 1. 加入QQ群(951182704)匿名或实名表达你的意见与看法 + 2. 提issue + 3. 通过邮箱联系我(ranger.nju#gmail.com) - 如果你觉得我写得不错,可以到GitHub仓库中给我一个Star,也可以在自己的社交圈子中宣传,让更多的人了解这个项目。 +## 更新记录与里程碑事件 -## 更新记录与里程碑事件记录 - -1. Oct, 2020. 设立Github Repo -2. 16th, Oct. 第一次得到Star,第一次被Fork -3. 29th, Oct . 更新第七课《过程间分析》至第四章 -4. 30th, Oct. 处理第一次PR,更新文档结构 +1. Oct, 2020. 设立Repo +2. 16th, Oct. 第一次Star和Fork +3. 29th, Oct . 更新第七课《Interprocedural Analysis》 +4. 30th, Oct. 第一次PR +5. 5th, Dec. 将一至六课的文稿暂时移出仓库,晚上更新第八课《Pointer Analysis》 # 这一《静态程序分析》教程对谁有用? @@ -27,8 +30,8 @@ Getting started with static program analysis. Read this and start writing your f 学生,开发者,研究者……几乎所有当代生活者都能从中受益。 - 学习方向与程序有关的**学生。** - - 计算机方向的学生可以通过深入学习这一领域知识而为自己建立独特的学术和就业优势。 - - 其他方向的学生同样可以通过了解这一技术,了解静态分析软件能够为你提供怎样的功能和便利,以及如何更好地使用这些软件以保证你所关心的程序质量。 + - 计算机方向的学生可以通过深入学习这一领域知识而为自己建立独特的学术和就业优势,也能加深对编程的理解以降低自己写出bug的频率。 + - 其他方向的学生既然已经开始阅读这一页面,想必对计算机方向的内容有一定兴趣。你可以通过了解这一技术,了解静态分析软件(包括其内置于编译器,集成开发环境的部分)能够为你提供怎样的功能和便利,以及如何更好地使用这些软件,以此保证你所关心的程序质量。 - 工作内容与程序有关的**开发者。** - 无论你希望更好地理解[Wiki](https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis)上众多的开源或是闭源的静态程序分析技术,还是希望自己开发一个适用于眼下工作内容的静态程序分析器以保证程序质量,了解静态程序分析都会有所帮助。 - 研究领域与程序相关的**研究者。** 或许你希望微调研究方向,却因没有合适的入门材料而苦恼;或许你希望了解计算机领域的相关知识以期获得启发……这一教程可以作为你的入门材料或是闲暇读物。 @@ -42,9 +45,9 @@ Getting started with static program analysis. Read this and start writing your f -**静态程序分析**是**编程语言**中**应用**层面下的一个细分领域。它是一个非常重要的核心内容。 +**静态程序分析**是**编程语言**中**应用**层面下的一个细分领域,它是一个非常重要的核心内容。 -在理论部分,研究者考虑的是如何设计一个语言的语法和语义,如何设计语言的类型系统等等问题;有了语言的语法、语义和类型系统之后,我们需要支撑语言的运行。因此,在环境部分,研究者考虑的是如何为运行中的程序提供运行时环境——如何设计编译器,在运行时需要怎样的支持(如内存的分配管理)等等;应用部分则关注如何保证语言所写出程序的效率、安全性和可靠性,研究者们考虑如何对程序进行分析,验证和合成(如何自动合成一个程序)。 +在理论部分,考虑的是如何设计一个语言的语法和语义,如何设计语言的类型系统等等问题;有了语言的语法、语义和类型系统之后,我们需要支撑语言的运行。因此,在环境部分,需要考虑如何为运行中的程序提供运行时环境——如何设计编译器,在运行时需要怎样的支持(如内存的分配管理)等等;应用部分则关注如何保证语言所写出程序的效率、安全性和可靠性,主要考虑如何对程序进行分析,验证和合成(如何自动合成一个程序)。 ### 编程语言的分类 @@ -60,8 +63,7 @@ Getting started with static program analysis. Read this and start writing your f ## 静态程序分析的应用 - -静态程序分析即是屠龙的宝刀之一,这一技术可以处理以下问题(*以下概念只需要了解,重要的应用在后文中会详细讲解。*): +静态程序分析即是屠龙的宝刀之一,举例来说这一技术可以处理以下问题(*以下概念只需要了解,重要的应用在后文中会详细讲解。*): 1. 提高程序可靠性 - Null pointer dereference, memory leak, etc. @@ -76,7 +78,9 @@ Getting started with static program analysis. Read this and start writing your f - [循环不变量的代码移动](https://en.wikipedia.org/wiki/Loop-invariant_code_motion):在编译器的机器无关优化环节,在保证不影响程序执行结果的情况下,将循环中的特定语句移动到循环外,使得程序运行时执行的语句数减少。更为详细的解释可以参考[StackOverFlow上的回答](https://stackoverflow.com/questions/5607762/what-does-code-motion-mean-for-loop-invariant-code-motion)。 4. 有助于程序理解 - IDE call hierarchy, type indication, etc. - - 为集成开发环境的功能提供帮助:当你使用VS 2019/Idea/Clion/Eclipse/Android Studio等等IDE时,将鼠标悬停在代码上,IDE能够动态地分析并提示你所悬停对象的相关信息,背后使用的技术就是静态程序分析。 + - 为集成开发环境的功能提供帮助:当你使用VS/Idea/Clion/Eclipse/Android Studio等等IDE时,将鼠标悬停在代码上,IDE能够动态地分析并提示你所悬停对象的相关信息,背后使用的技术就是静态程序分析。 + +此外,静态程序分析技术也可以分析多线程程序,这是一个有难度的研究领域。主要困难在于处理多线程间的interleaving。本书定位入门,不会涉及相关内容。 ## 静态程序分析的市场 @@ -96,6 +100,7 @@ Getting started with static program analysis. Read this and start writing your f - 优点:在选定的精度下能够保证没有bug。这在教程中会详细介绍。 - 缺点: + 1. 学术门槛相对高。目前国内高校只有北京大学和南京大学开设有关课程,且暂无教材。作为一门计算机专业的高年级选修课,入门和提高都较困难。 2. You tell me. @@ -106,7 +111,7 @@ Getting started with static program analysis. Read this and start writing your f - 缺点: 1. **无法保证没有bug。** 这是无法遍历所有可能的程序输入的必然结果。 - 2. 在当今的由多核与网络应用带来的**并发环境下作用有限。** 某个bug可能只在特定情况下发生,因而难以稳定地复现。如果你对并发程序的测试细节感兴趣,可以参考[《拧龙头法测试并发程序》](https://zhuanlan.zhihu.com/p/51341151)。(截图来自南京大学《形式化语义》课程资料) + 2. 在当今的由多核与网络应用带来的**并发环境下作用有限。** 某个bug可能只在特定情况下发生,因而难以稳定地复现。如果你对并发程序的动态测试细节感兴趣,可以参考[《拧龙头法测试并发程序》](https://zhuanlan.zhihu.com/p/51341151)。(截图来自南京大学《形式化语义》课程资料) @@ -117,7 +122,6 @@ Getting started with static program analysis. Read this and start writing your f - 缺点: 1. 学术门槛较高,学习者必须有良好的数学基础才能入门。 - 2. 验证代价较高,一般来说非常重要的项目会使用这一方式保证程序质量。甚至在操作系统这样重要的软件中,也并不一定会使用。(截图来自鸿蒙OS直播发布会) @@ -132,11 +136,11 @@ Getting started with static program analysis. Read this and start writing your f ## English -If you wanna translate this project into English, I can proofread for you. All you need to do is `fork, modify, PR` . +If you wanna translate this project into English, I can proofread for you. All you need to do is `fork, translate, PR` . ## 日本語 -このプロジェクトを日本語に翻訳したい場合は、翻訳されたコンテンツの校正をお手伝いします. `fork, modify, PR` で始めましょう! +このプロジェクトを日本語に翻訳したい場合は、翻訳されたコンテンツの校正をお手伝いします. `fork, translate, PR` で始めましょう! # 其他相关项目 diff --git a/SUMMARY.md b/SUMMARY.md index 4d49c6b..05dc767 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -5,8 +5,6 @@ * [为什么是这本书?](ch0/00-01-why-this-book.md) * [来源与版权信息](ch0/00-02-sources-and-license.md) * [第一章-静态程序分析简介](ch1/README.md) - * [初见——静态分析是什么?](ch1/01-01-whats-spa.md) - * [中间表示——静态分析器的输入](ch1/01-02-ir.md) * [第二章-数据流分析——应用](ch2/README.md) * [第三章-数据流分析——理论](ch3/README.md) * [第四章-过程间分析](ch4/README.md) diff --git a/ch0/00-01-why-this-book.md b/ch0/00-01-why-this-book.md index 75a1744..617c368 100644 --- a/ch0/00-01-why-this-book.md +++ b/ch0/00-01-why-this-book.md @@ -35,5 +35,4 @@ * 最主要的动力还是老师现场授课时我感受到的passion * 这是一个少有人涉足的领域,写这方面的内容很符合我的性格 -* 我从开源社区中获益颇多,找到了合适的机会也希望能为开源社区(尤其是中文社区)作出自己的贡献 - +* 我从开源社区中获益颇多,找到了合适的机会也希望能为开源社区(尤其是中文社区)作出自己的贡献 \ No newline at end of file diff --git a/ch0/00-02-sources-and-license.md b/ch0/00-02-sources-and-license.md index 876a2d0..c60592a 100644 --- a/ch0/00-02-sources-and-license.md +++ b/ch0/00-02-sources-and-license.md @@ -10,4 +10,4 @@ 教程文字部分遵循CC BY-NC-SA许可协议。 -图片部分若无特殊说明,均出自课程资料,使用已获作者同意。 +图片部分若无特殊说明则出自课程资料,使用已获作者同意。其他材料会注明出处,侵删。 diff --git a/ch1/01-01-whats-spa.md b/ch1/01-01-whats-spa.md index f7d7194..e69de29 100644 --- a/ch1/01-01-whats-spa.md +++ b/ch1/01-01-whats-spa.md @@ -1,150 +0,0 @@ -# 初见——静态分析是什么? - -**WARNING:即将进入施工未完毕区域。** - -> 静态程序分析是指**不编译**出二进制代码通过测试用例对程序进行测试,仅通过**静态地**分析程序得到程序**不平凡**的性质的过程。 - -## 静态程序分析的抽象定义与诠释 - -### 定义 - -> Static analysis analyzes a program P to reason about its behaviors and determines whether it satisfies some properties before running P. - -- Does P contain any private information leaks? -- Does P dereference any null pointers? -- Are all the cast operations in P safe? -- Can v1 and v2 in P point to the same memory location? -- Will certain assert statements in P fail? -- Is this piece of code in P dead (so that it could be eliminated)? - -即:对一个程序P,静态程序分析在运行P之前分析它的行为并确认它是否满足某些性质。例如: - -- P会导致隐私信息泄漏吗? -- P中会不会有空指针被解引用? -- P中的所有cast操作(掌握JAVA或C++的读者应该熟悉这一操作)都是安全的吗? -- P中的两个指针是否会指向同一个内存地址? -- P中某个特定的断言会失败吗? -- P中的某部分代码是死代码吗? - -### 诠释 - -> Ensure \(or get close to\) soundness, while making good trade-offs between analysis precision and analysis speed. - -在分析精度和速度之间做平衡的同时,保证(或近似)soundness。*(对于soundness这个词,有很多种不同的翻译方式,如可靠性、安全性等。)*通常来说,分析的精度要求越高,分析的速度就会越慢。类似的trade-off在计算机世界非常常见。 - -## 静态程序分析的具体解释 - -静态程序分析技术中最重要的两个技术,分别是Abstraction(抽象)和Over-Approximation(过近似) - -### Abstraction - - - -**抽象是将值从Concrete Domain(具体域)映射到Abstract Domain(抽象域)的过程,也即将具体值映射为抽象值。** - -例如,在上图中: - -- Concrete Domain中变量的值可以是具体的数值,也可能是某种表达式或函数的返回值。 -- Abstract Domain中变量的值分为五类: - 1. 正 - 2. 负 - 3. 零 - 4. unknown(未知),通常表达为正的T,读作top - 5. undefined(未定),通常表达为上下颠倒的T,读作bottom - -关于unknown和undefined: - -- unknown(未知):根据表达式或函数返回决定,程序运行时会有具体的正负零数值,但运行前只通过该表达式无法确定。如应用C语言中的三目运算符(TODO:加Link)`x = flag ? 1 : -1`中x的值就是unknown的。 -- undefined(未定)程序运行时会遇到错误,并产生未定义行为(TODO:加Link)。如许多语言中divided by zero(除数为零)通常会触发异常/硬件错误,此时如`a=b/0`中a的值就是undefined的。 - -### Over-approximation - -**过近似主要是指对抽象值进行操作时的思想。** - -继续上面的例子,具体来说操作可以分为两类:Data flow(数据流)和Control flow(控制流): - -#### Data flow - -(TODO-加图) - -* 两个正数相加为正数 -* ... -* 正数和负数相加,结果为unknown/top。**这是因为运行前只知道表达式的正负号,无法确定结果是正负零中的任何一个,但程序运行时会有具体的数值。** -* unknown/top除以0,结果为undefined。**这是因为会触发未定义行为。** - -#### Control flow - -在程序执行过程中往往会有分支结构,如果x的值在两个分支中分别被赋抽象正值和抽象负值,那么合并时x抽象值应该是五类中的哪一种呢? - -对于分支合并时的x,**运行前只知道抽象值的正负号,无法确定结果是哪一种,但程序运行时会有具体的数值**。无论是抽象为正还是负都无法准确描述x合并后的状态,所以x合并后的抽象值是unknown/top。 - -## Rice‘s Theorem与静态程序分析目标 - -### Rice's Theorem - -> Any non-trivial property of the behavior of programs in a r.e. language is undecidable. (TODO:加中文) - -(TODO:加中文) 这句话中有很多很难的词汇,接下来一一解释: - -* non-trivial properties ~= interesting properties ~= the properties related with run-time behaviors of programs -* r.e. \(recursively enumerable\) 递归可枚举语⾔: recognizable by a Turing-machine -* There is no such approach to determine whether P satisfies such non-trivial properties, i.e., giving exact answer: Yes or No -* 故不存在 perfect \(sound & complete\) static analysis - -### 两个重要概念:Sound与Complete - -> 思考: 作为一个开发者,你使用静态分析器分析自己的代码时,哪种情况更让你觉得糟糕? -> -> * 静态分析器**没有分析出代码错误**的部分。 -> * 静态分析器**判断代码正确的部分为错**的部分。 - -Over- and under-approximations are both for safety of analysis. - -sound: 报出所有问题 may analysis: outputs information that may be true \(over-approximation\) \(safe=over\) - -complete: 报出的问题都是对的 must analysis: outputs information that must be true \(under-approximation\) \(safe=under\) - -### 实际应用中静态分析器的设计目标 - -(TODO:加图) **实际应用中往往没有办法做到完美。因而需要妥协。** - -需要静态分析器能在可接受的时间内给出精度满足要求的解。为此: - -妥协 soundness \(false negatives 可能漏报\) - -妥协 completeness \(false positives 可能误报\) \(⼤多数情况的分析,因为 soundness 很重要\) - -## 再讲五块钱的? - -### 关于未定义行为 - -- [未定义行为](https://en.wikipedia.org/wiki/Undefined_behavior)在Wiki上的解释: - -> In computer programming, undefined behavior (UB) is the result of executing a program whose behavior is prescribed to be unpredictable, in the language specification to which the computer code adheres. - -- 一个经典的未定义行为例子: - - ```c++ - int a[7]; - ... - int j = 0; - - //输出结果根据编译器实现不同而不同 - std::cout << a[j++] + a[j] - ``` - -### 关于trade-off - -- [存储器层次结构](https://en.wikipedia.org/wiki/Memory_hierarchy):cache-memory-disk-network的经典结构,正是当代计算机设计者们对价格、读写速度和存储容量的典型trade-off。 -- 段页式内存管理:分段和分页方式的存储管理各有其特点,而段页式存储管理将两种方式结合,优缺点互补。 - -### 关于判定问题中经常用到的术语 - -在计算机的判定性问题中和各种医学诊断中,都会提到这几种概念: -1. True positive -2. True negative -3. False positive -4. False negative - -[Youtube上](https://www.youtube.com/watch?v=rFwu69tuMiU)有一个简单的介绍视频。 - diff --git a/ch1/01-02-ir.md b/ch1/01-02-ir.md index e55cd1d..e69de29 100644 --- a/ch1/01-02-ir.md +++ b/ch1/01-02-ir.md @@ -1,78 +0,0 @@ -# 中间表示——静态分析器的输入 - -如果你学习过编译原理课程,能理解: - -> 静态分析器的输入是线型IR(三地址码3AC),而非树型IR(抽象语法树AST) - -可以直接跳过本小节。 - -**WARNING:即将进入施工未完毕区域。** - -## 从编译器的组件谈起 - -一个典型的编译器分成一下几个部分: - -* Scanner:读入源代码,借助正则表达式完成词法分析,输出Tokens或报告错误的词法输入。如`goouojd`并是一个有效的英文单词,就会被报告为错误。 -* Parser:读入Tokens,通过上下文无关文法完成语法分析,构建抽象语法树或报告错误的语法输入。如`Like your hair I`就不符合英语语法,会被报告为错误。 -* Type Checker:读入抽象语法树,以属性文法进行语义分析并检查类型兼容性等,输出Decorated AST或报告错误的语义。如`Apples eat you`在语法上正确,但不可能有苹果会吃人,这是语义上的错误。 -* Translater:读入Decorated AST,通过遍历Decorated AST将树型IR(AST)翻译为线型IR(通常是三地址码的形式)。然后可以**通过静态分析**进行机器无关的代码优化。 -* Code Generator:读入线型IR,并根据指定的CPU指令集将机器无法直接执行的IR转换为机器可直接执行的机器代码。 - -### AST与IR的比较 - -AST: - -* high-level and closed to grammar structure -* usually language dependent -* suitable for fast type checking -* lack of control flow information - -即: - -* 更接近于语法规定的结构 -* 通常与语言有关 -* 适于快速类型检查 -* 没有控制流信息 - -IR: - -* low-level and closed to machine code -* usually language independent -* compact and uniform -* contains control flow info -* usually considered as the basis for static analysis - -即: - -* 更接近于机器码 -* 通常与语言无关 -* 紧凑而通用 -* 包含控制流信息 -* 通常被视为静态分析的基础 - -**总的来说,线型IR更适合静态分析。线型IR没有固定的定义,实际使用中常用三地址码。** - -~~在计算机领域,直接用英文常常更容易将概念表达清楚,如果有读者认为有更好的翻译,可以联系作者(邮箱或github issue都可以)~~ - -### 三地址码 - -> Definition: Each 3AC contains at most 3 addresses \(name, constant, temporary\) - -定义:每一条三地址码最多包含3个地址(地址包括程序员显式定义的有名字变量,常量和临时变量) 一些形式 - -TBD - -### 其他预备内容 - -举例说明: -Data/Method/Call Graph - -invoke specail:构造函数,super等使用 -virtual:其他的Class Method -interface:2 plus checking -static:静态方法调用 - -Java7 中引入dynamic cast? - -SSA->只需要记住FreshName和Phi-Function - diff --git a/ch1/README.md b/ch1/README.md index a41b4db..8a2b370 100644 --- a/ch1/README.md +++ b/ch1/README.md @@ -5,11 +5,9 @@ - 什么是静态程序分析(下简称为静态分析)? - 如何设计一个实用的静态程序分析器? -**注:第一章到第三章在B站上有相应的视频。不建议读者现在阅读一到三章的内容。在作者腾出时间整理文稿之前,建议读者先到B站观看相应的视频。** +**注:第一章到第三章在B站上有相应的视频。在作者腾出时间整理文稿之前,建议读者先到B站观看相应的视频。对应的文字部分暂时移出本仓库。** 对应的视频在这里: - [第二课-IR](https://www.bilibili.com/video/BV1zE411s77Z) 从[这里](https://ranger-nju.gitbook.io/static-program-analysis-book/ch4)直接跳转到施工完毕区域(第四章)。 - -**WARNING:即将进入施工未完毕区域。** \ No newline at end of file diff --git a/ch2/README.md b/ch2/README.md index a47469c..84c06b2 100644 --- a/ch2/README.md +++ b/ch2/README.md @@ -1,11 +1,9 @@ # 第二章-数据流分析的理论与应用 -**注:第一章到第三章在B站上有相应的视频。不建议读者现在阅读一到三章的内容。在作者腾出时间整理文稿之前,建议读者先到B站观看相应的视频。** +**注:第一章到第三章在B站上有相应的视频。在作者腾出时间整理文稿之前,建议读者先到B站观看相应的视频。对应的文字部分暂时移出本仓库。** 对应的视频在这里: - [第三课-数据流分析一](https://www.bilibili.com/video/BV1oE411K79d) - [第四课-数据流分析二](https://www.bilibili.com/video/BV19741197zA) -从[这里](https://ranger-nju.gitbook.io/static-program-analysis-book/ch4)直接跳转到施工完毕区域(第四章)。 - -**WARNING:即将进入施工未完毕区域。** \ No newline at end of file +从[这里](https://ranger-nju.gitbook.io/static-program-analysis-book/ch4)直接跳转到施工完毕区域(第四章)。 \ No newline at end of file diff --git a/ch3/README.md b/ch3/README.md index a0c59d7..5c524dc 100644 --- a/ch3/README.md +++ b/ch3/README.md @@ -2,12 +2,10 @@ 帮助理解之前所数的数据流分析技术,让你在将来review的时候更有效率。忘记了也能自己推导出大概。 -**注:第一章到第三章在B站上有相应的视频。不建议读者现在阅读一到三章的内容。在作者腾出时间整理文稿之前,建议读者先到B站观看相应的视频。** +**注:第一章到第三章在B站上有相应的视频。在作者腾出时间整理文稿之前,建议读者先到B站观看相应的视频。对应的文字部分暂时移出本仓库。** 对应的课程在这里: - [第五课-数据流分析理论一](https://www.bilibili.com/video/BV1A741117it) - [第六课-数据流分析理论二](https://www.bilibili.com/video/BV1964y1M7nL) -从[这里](https://ranger-nju.gitbook.io/static-program-analysis-book/ch4)直接跳转到施工完毕区域(第四章)。 - -**WARNING:即将进入施工未完毕区域。** \ No newline at end of file +从[这里](https://ranger-nju.gitbook.io/static-program-analysis-book/ch4)直接跳转到施工完毕区域(第四章)。 \ No newline at end of file diff --git a/ch4/04-01-inter-analysis-spa.md b/ch4/04-01-inter-analysis-spa.md index 2707f0a..d677ad0 100644 --- a/ch4/04-01-inter-analysis-spa.md +++ b/ch4/04-01-inter-analysis-spa.md @@ -1,3 +1,5 @@ +**建议使用屏幕较大的设备查看以便纵览全局,在手机上及其他小屏幕设备上查看可能无法查看默认包含的Table of Contents。** + # 过程间分析简介 本小节通过四个部分介绍过程间分析。 @@ -19,8 +21,6 @@ - - # Call Graph Construction (CHA) 接下来我们讨论一个必要的数据结构Call Graph,中文可以理解为调用关系图。 @@ -53,27 +53,21 @@ Call Graph有很多种不同的构造方法,我们接下来会讲解两个极 ### Virtual call and dispatch -接下来重点讨论Virtual call,在动态运行时,Virtual call基于两点决定调用哪个具体方法: +Virtual call是几种调用中最为复杂的一种,我们首先重点讨论它。在动态运行时,Virtual call基于两点决定调用哪个具体方法: 1. Type of object - 2. Method signature - - Signature = class type + method name + descriptor - Descriptor = return type + parameter types - - Java中Dispatch机制决定具体调用哪个方法:c是一个类的定义,m是一个方法。如果能在本类中找到name和descriptor一致的方法,则调用c的方法,否则到父类中寻找。 > We define function Dispatch(𝑐, 𝑚) to simulate the procedure of run-time method dispatch. - - **练习问题** Q:两次对foo的调用分别调用了哪个类的foo? @@ -90,12 +84,10 @@ A:分别调用A和C中定义的foo方法。 - Require the class **hierarchy information (inheritance structure)** of the whole program - 需要首先获得整个程序的继承关系图 -- Resolve a virtual call based on the declared type of receiver - variable of the call site +- Resolve a virtual call based on the declared type of receiver variable of the call site - 通过接收变量的声明类型来解析Virtual call - 接收变量的例子:在`a.foo()`中,a就是接收变量 -- Assume the receiver variable a may point to objects of class A - or all subclasses of A(Resolve target methods by looking up the class hierarchy of class A) +- Assume the receiver variable a may point to objects of class A or all subclasses of A(Resolve target methods by looking up the class hierarchy of class A) - 假设一个接收变量能够指向A或A的所有子类 ## Call Resolution of CHA @@ -157,7 +149,7 @@ A:分别调用A和C中定义的foo方法。 - 递归地处理对每个可达的方法 - Repeat until no new method is discovered - 当不能拓展新的可达方法时停止 -- 整个过程和计算机领域中求闭包的过程很相似 +- 整个过程和计算理论中求闭包的过程很相似 @@ -180,7 +172,7 @@ A:分别调用A和C中定义的foo方法。 *注:忽略new A()对构造函数的调用,这不是例子的重点。* -**这个例子是对本小节的总结,如果不能读懂并独立推导建议重读一遍。** +**这个例子是对本小节的总结,如果不能读懂并独立推导建议重读一遍。如果你理解了第一到第六课的内容但是觉得上面的内容写得不清晰,可以到本书简介中提到的QQ群交流吐槽。** ## Interprocedural Control-Flow Graph @@ -201,7 +193,7 @@ ICFG可以通过CFG加上两种边构造得到。 ## 定义与比较 -目前这一分析领域没有标准方法。首先对过程间和过程内的分析做一个对比,并以常量传播为例子进行解释。 +目前这一分析领域没有标准方法。首先对过程间和过程内的分析做一个对比,并以常量传播(本校同学第一次实验作业主题,需要一到六课的基础)为例子进行解释。 @@ -248,10 +240,12 @@ Edge transfer处理引入的call & return edge。为此,我们需要**在之 # Key points +**The X You Need To Understand in This Lecture** + 1. How to build call graph via class hierarchy analysis - - 如何构建CHA的call graph + - 如何利用CHA构建调用关系图(call graph) 2. Concept of interprocedural control-flow graph - - 过程间CFG的概念 + - 过程间控制流图(CFG)的概念 3. Concept of interprocedural data-flow analysis - 过程间数据流分析的概念 4. Interprocedural constant propagation diff --git a/ch4/README.md b/ch4/README.md index d1def00..5727996 100644 --- a/ch4/README.md +++ b/ch4/README.md @@ -1,5 +1,7 @@ # 过程间分析简介 -即将抵达没有视频辅助的区域啦,如果想看看视频,请到[第七课](https://www.bilibili.com/video/BV1GQ4y1T7zm)和[第八课](https://www.bilibili.com/video/BV1gg4y1z78p)。 +**建议使用屏幕较大的设备查看以便纵览全局,在手机上及其他小屏幕设备上查看可能无法查看默认包含的Table of Contents。** -写成gitbook形式力求能够更快地掌握要点(虽然还是因为偷懒留了一部分英文没有翻译),而视频则能动态地呈现内容。欢迎大家提出意见和建议!(方式见[Github repo](https://github.com/RangerNJU/Static-Program-Analysis-Book)) \ No newline at end of file +即将抵达没有视频辅助的区域,如果想看看视频,请到[第七课](https://www.bilibili.com/video/BV1GQ4y1T7zm)和[第八课](https://www.bilibili.com/video/BV1gg4y1z78p)。 + +写成gitbook形式力求能够更快地掌握要点(虽然还是因为偷懒留了一部分英文没有翻译),而视频则能动态地呈现内容。欢迎大家提出意见和建议!(方式见[Github repo](https://github.com/RangerNJU/Static-Program-Analysis-Book))。 \ No newline at end of file