lecture1 Introduction-笔记

2023-10-30

本文参考了该作者的一些图解和见解:https://zhuanlan.zhihu.com/p/128156349

由于疫情原因,偶然间学习了南大的软件分析(Static Analysis)课程,后面会用SA来替代Static Analysis,因此从该篇起将每一节课的内容做一些记录和个人补充。若存在一些不合理或者有错的地方,请小伙伴们指出来。

一、什么是静态分析&为什么要用静态分析?

Programming Languages领域主要关注以下三个方面:

其中,Application是本课的重点内容,这个部分关注在运行前能对程序代码进行的一些工作,例如错误检测,代码优化等等,IDE里面就大量应用了SA的成果,如变量未定义的错误提示,循环中的不变量表达式的移出优化;程序的静态验证(或者叫程序证明),程序合成等等。

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)?

根据以上可知,SA也就是判断程序是否满足一些Non-trivial(非平凡特性) Properties(例如以上几点),而这些特性就是我们所需要判断的程序运行时行为的一些相关特性,如程序的安全性、可靠性等。

由于程序的复杂性在不断上升,对于程序的可靠性(reliability)、安全性(security)的要求也在不断上升,而静态分析则给予了这样一个工具来让我们能够对程序进行分析,实现查错、编译优化等功能。而SA主要用的技术有抽象解释(Abstract interpretation),数据流分析(Data-flow analysis, ),Hoare logic,Model checking,Symbolic execution等等,本课程只会讲到其中的两个,分别是数据流分析和抽象解释,重点讲的是数据流分析。

二、Implement Static Analysis

然而SA并不能给予一个exact answer:Yes or No,但能通过Sound和Comlete来满足我们的需求。

以SA的检错分析举例:

Truth:检测正确,没有发生误报和漏报;

Sound:全面,表示包含了Truth,但产生了误报,一定不会漏报;

Complete:属于Truth,一定不会误报,但会产生漏报,适用于不可发生分析错误的情况;

用个代码分析例子来说明什么是overapproximate也即sound和underapproximate也即complete:

if (input) {
    x = 1
} else {
    x = 0
}

对于这样的一段代码,静态分析的结果报告如果 x∈{0,1} ,就说这个静态分析是完美的,如果报告x∈{0},就说这个分析是complete的(也说对程序进行了underapproximate),如果报告x∈{0,1,2}就说这个分析是sound(也说对程序进行了overapproximate),如果报告是x∈{0,-1},就是既发生了漏报(漏报1),也发生了误报(误报-1),则这个分析是错误的。

还是上面的例子,

  1. x∈{0,1}
  2. x = 1 when input == true, x = 0 when input == false

可以看出第二种的精度更高一些,因为报告中包含了x具体情况下的取值,但是这种方式也要求分析过程维护上下文信息,从而提高了分析的代价,而静态分析的目标应该是在确保(或尽量接近)sound的前提下在精度和速度上做一个平衡,试想一下IDE在你写下使用一个未初始变量的代码后二十秒后才给出提示,做静态分析要把握住精度的控制,不然极端情况下岂不是要把静态分析往解释器的方向写了吗?

因此并不存在完美的SA,也即是Truth情况。所以SA只能选择妥协completeness保全soundness或妥协soundness保全completeness。大多数情况下,保全soundness是较为常见的用法,如航天军工等程序,宁愿花费更多的人力去进行bug真伪检验,也不希望出现漏检,又如编译器优化和程序验证等。

最后,实现SA的两步骤如下所示:Abstraction+Over-approximation

1、Abstraction

下图中,左边为程序,右边为抽象的结果。分为正、负、0、unknown和undefined。其中v不知道他是0、+、-则为unknown,而w/0发生了错误,为undefined。这是一个从“算术表达式”到“符号”的抽象。

2、Over-approximation

(1)Transfer functions

有了数据抽象之后,还需要定义一个transfer function,transfer function是作用在程序代码的抽象值上的,对应这个例子就是从“算术表达式抽象符号”到“符号”上的函数,有以下定义:

transfer function:
map:    + + + = +
map:    - + - = -
map:    0 + 0 = 0
map:    + + - = unknown
map:    + / + = +
map:    - / - = +
map:    unknown / 0 = undefined
map:    + / - = -

然后用上面的抽象值和transfer function在代码上做overapproximate分析,得到下面的结果

#include<stdio.h>
    void main() {
        int arr[3] = {0, 1, 2};
        int x = 10;     // +
        int y = -1;     // -
        int z = 0;      // 0
        int a = x + y;  // unknown
        int b = z / y;  // 0
        int c = a / b;  // undefined 除0错误
        int p = arr[y];
        int q = arr[a];
        printf("the number is %d", q);
    }

(2)Control flows

由下图可见,一个简短的程序拥有两个分支路径,数据的流动根据实际需求来决定。引用老师的一句话:As it’s impossible to enumerate all paths in practice,flow merging (as a way of over-approximation 过度逼近方式) is taken for granted in most static analyses.可知枚举所有路径是不可能的事,那么如何选择,在第三节开始会具体谈及。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lecture1 Introduction-笔记 的相关文章

随机推荐

  • android开发中遇到的一些问题及解决方案

    相信大家在打包也遇到过这样的问题把 打包失败 以下是昨天我昨天开发时遇到的一些问题 经过查找资料 顺利解决 不过多赘述 问题如下 问题一 Messages报错如下 Errors while building APK You can find
  • 剑指Offer62—圆圈中最后剩下的数字

    剑指Offer62 题意 0 1 n 1这n个数字排成一个圆圈 从数字0开始 每次从这个圆圈里删除第m个数字 删除后从下一个数字开始计数 求出这个圆圈里剩下的最后一个数字 例如 0 1 2 3 4这5个数字组成一个圆圈 从数字0开始每次删除
  • python——封装、继承、多态

    文章目录 继承 多继承 多态 type和isinstance的区别 类方法和静态方法 类方法 继承 class Father secrect xxx story 从前有座山 def tellAstory self print 我的故事 se
  • 低代码开发平台的优点和缺点

    随着数字化转型的加速 企业需要更快速地开发和交付应用程序 以适应市场需求和客户需求的变化 在这种情况下 低代码平台成为了企业的首选方案之一 想象一下 你可以用一个可视化工具构建自己的应用程序 而无需编写繁琐的代码 这就是低代码开发模式的魅力
  • SpringBoot-Shiro的使用

    一 什么是Shiro 权限体系在现代软件应用中有着非常重要的地位 一个应用如果没有权限体系都会显着这个系统 特别不安全 无论是传统的MIS系统还是互联网项目出于对业务数据和应用自身的安全 都会设置自己的安全策略 目前市场上专门的Java权限
  • 7.13模拟面试

    UDP协议的首部结构 只知道是8位 UDP首部有8个字节 由4个字段构成 每个字段都是两个字节 1 源端口号 可有可无 需要对方回信时选用 不需要时全部置0 2 目的端口号 必须有 在终点交付报文的时候需要用到 3 长度 UDP的数据报的长
  • VMware虚拟机Ubuntu无法连接网络的解决方法

    一 解决办法 网络适配器设置 终端依次执行下面命令即可 sudo nmcli networking off sudo nmcli networking on sudo service network manager start 或者 sud
  • Mysql学习笔记2: 索引优化分析

    文章目录 第 2 章 索引优化分析 1 慢 SQL 2 join 查询 2 1 SQL 执行顺序 2 2 JOIN 连接查询 3 索引简介 3 1 索引是什么 3 2 索引原理 3 3 索引优劣势 3 4 MySQL 索引分类 3 5 My
  • qtEvent, 事件传递、事件过滤器、update()、绘图事件、鼠标事件、鼠标穿透

    catalog 杂谈 构造函数内的connect 内存的父类 对象树的父类 QT的事件 信号处理 eventFilter event event和eventFilter应用 鼠标 绘图事件 鼠标穿透 杂谈 构造函数内的connect MyB
  • Using UTF-8 as the internal representation for strings in C and C++ with Visual Studio

    In today s long post I m going to explain the guidelines we follow at Retibus Software in order to handle Unicode text i
  • 算法竞赛进阶指南 货仓选址

    题目链接 https ac nowcoder com acm contest 1001 B 题意 在一条数轴上有 N N N 家商店 它们的坐标分别为 A 1
  • Java中的Optional使用

    Java中的Optional使用 下文笔者将详细讲述java中Optional对象 如下所示 Optional对象的功能 可使用最简化的代码 并高效的处理NPE Null Pointer Exception空指针异常 Optional对象的
  • cookies、sessionStorage和localStorage解释及区别

    转载自此文 cookies sessionStorage和localStorage解释及区别 目录 一 cookie和session 两者区别 1 保持状态 2 使用方式 1 cookie机制 2 session机制 3 存储内容 4 存储
  • 华为研发工程师编程题

    空汽水瓶 某商店规定 三个空汽水瓶可以换一瓶汽水 允许向老板借空汽水瓶 但是必须要归还 小张手上有n个空汽水瓶 她想知道自己最多可以喝到多少瓶汽水 数据范围 输入的正整数满足 注意 本题存在多组输入 输入的 0 表示输入结束 并不用输出结果
  • 生成echarts雷达图并传到Server端生成图片

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 需求 使用百度的echarts生成雷达图 并上传到服务器端然后处理 使用各个工具 一 echarts实例及文档 请查看官方地址链接地址 二 html2canvas 代码示例
  • 组合总和(回溯),leetcode习题

    组合总和 找出所有相加之和为 n 的 k 个数的组合 组合中只允许含有 1 9 的正整数 并且每种组合中不存在重复的数字 说明 所有数字都是正整数 解集不能包含重复的组合 示例 1 输入 k 3 n 7 输出 1 2 4 示例 2 输入 k
  • protobuf反射详解及应用(pb/json相互转换)

    关于protobuf的使用 编码原理 编码原理应用 可以分别参见以下文章 Python 操作 protobuf 常见用法 linux环境下protobuf的安装与使用 Protobuf编码规则详解 protobuf编码原理及其在schema
  • SpringCloud(三):Hystrix服务降级与熔断

    前言 上期SpringCloud 二 服务调用和负载均衡通过Eureka注册中心构建一个简单微服务 并通过RestTemplate进行远程调用 当系统中微服务较多 某些微服务会不可避免出现异常 雪崩效应 在微服务架构中 服务与服务之间存在相
  • vue-cli3.0实现播放rtmp直播流

    前言 用vue来实现播放rtmp 代码很简单 主要用的ckplayer 在使用过videojs video等其他插件以后 在播放视频直播流这里 觉得还是ckplayer比较给力 这里说下使用方法 实现效果 目录 实现步骤 一 下载ckpla
  • lecture1 Introduction-笔记

    本文参考了该作者的一些图解和见解 https zhuanlan zhihu com p 128156349 由于疫情原因 偶然间学习了南大的软件分析 Static Analysis 课程 后面会用SA来替代Static Analysis 因