南大《软件分析》1.0 Introduction

南大《软件分析》1.0 Introduction

henry Lv4

课程环境:https://tai-e.pascal-lab.net/lectures.html

课程视频:https://www.bilibili.com/video/BV1b7411K7P4

南大《软件分析》1.0 Introduction

第一部分还是比较友好的,由于是笔记,仅记录个人认为重要的部分。

nipaste_2024-07-31_15-51-2

这一部分罗列了程序语言的整个体系,其中主要分为三部分:理论,环境,应用。其中程序分析是作为应用层面非常核心的一个内容,需要理解的是程序分析实际上就是静态分析,不会去真正执行目标程序,简单来说就是用程序来分析程序的行为。

静态分析的作用

  • 程序可靠性

    需要考虑空指针、内存泄漏等

  • 程序安全性

    注入攻击,隐私泄露

  • 编译优化

  • 程序理解

    帮助一些 IDE 去理解程序

莱斯定理

“Any non-trivial property of the behavior of programs in a r.e. language is undecidable.”

r.e. 代表可递归可枚举 (recursively enumerable)

换成人话来理解就是,你想通过静态分析把一个程序分析透彻是不可能的。举个例子,比如说你想知道目标程序(实际有10个bug)有多少个 bug,静态分析能做到的就是它会尽力的去找到这些可能存在的 bug。

注意:上面这句话中的可能很妙,这就意味着静态分析技术可能会产生漏报(存在的bug没有检测出来),误报(不是bug但是认为它是bug)

其实上面的这句话就引出了,软件分析中对应的两种情况:(1)complete(2)sound

nipaste_2024-07-31_16-13-3

上面这张图中的 Truth 可以理解为就是我们前面举得例子中目标程序实际的 bug,Sound 对应为它的超集,而 Complete 对应它的子集。

你可以这样认为,静态分析本身就是一个不确定性技术,它只能给出尽量靠近结果的答案,但这已经够用了,实际的生产环境中,大家都追求使结果 Sound,但不能 complete。其实这一点很容易理解,还是以前面的例子进行说明,在 Sound 的情况下,可能会产生误报,但是不会漏报,对于实际需求来说,我只要你 Sound 最后的结果包含所有实际存在的 bug 就行,误报一点也无所谓,但与之相对应的如果程序中有 bug(complete),但没检测出来,这种损失可能就比较严重了。

nipaste_2024-07-31_16-30-4

这里有两个概念 false negativefalse positives,其实理解上来说分别对应前面提到的漏报误报的情况。

另外一个就是静态分析中的两个思想:

  • abstraction
  • over-approximation

理解来说就是,学会抽象(doge)和过估计(宁可错杀1000也不放过1个)

思考题

nipaste_2024-07-31_16-38-3

  • Title: 南大《软件分析》1.0 Introduction
  • Author: henry
  • Created at : 2024-07-31 20:42:53
  • Updated at : 2024-07-31 20:45:31
  • Link: https://henrymartin262.github.io/2024/07/31/1.0_Introduction/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments
On this page
南大《软件分析》1.0 Introduction