南京大学《软件分析》李越, 谭添——1. 导论
导论
主要概念:
- sound
- complete
- PL领域概述
动手学习
- 本节无
文章目录
- 导论
- 1. PL(Programming Language) 程序设计语言
- 1.1 程序设计语言的三大研究方向
- 1.2 与静态分析相关方向的介绍与对比
- 静态程序分析
- 动态软件测试
- 形式化(formal)语义验证(verification)
- 2. 静态分析:
- 2.1莱斯定理(Rice‘s Theorem):
- 2.2 perfect,sound(ness), complete(ness)
- 2.3 静态分析的目标
- 3. 静态分析的应用与前景
- 4. 静态分析的步骤
1. PL(Programming Language) 程序设计语言
1.1 程序设计语言的三大研究方向
理论: 语言怎么设计, 形式(Formal)逻辑是什么
环境: 语言要运行起来, 就要环境
应用: 保证运行起来要快, 要安全, 要可靠
拓展–语言的分类:
- 命令式(imperative)编程语言JAVA, C, CPP…
- 函数式(functional)Haskell…
- 逻辑式/声明式
语言没变, 环境变了, 软件越来越大越复杂
拓展阅读:
- 在 命令式语言 中,指令一个一个给出,用条件、循环等来控制逻辑(指令执行的顺序),同时这些逻辑通过程序变量不断修改程序状态,最终计算出结果。我觉得,尽管 IP 现在都是高级语言了,但是本质上并没有脱离那种“类似汇编的,通过读取、写入等指令操作内存数据”的编程方式(我后面会提及,这是源于图灵机以及后续冯诺依曼体系结构一脉的历史选择)。国内高等教育中接触的绝大多数编程语言都是 IP 的,比如 Java、C、C++等。
- 在 函数式语言 中,逻辑(用函数来表达)可以像数据一样抽象起来,复杂的逻辑(高阶函数)可以通过操纵(传递、调用、返回)简单的逻辑(低阶函数)和数据来表达,没有了时序与状态,隐藏了计算的很多细节。不同的逻辑因为没有被时序和状态耦合在一起,程序本身模块化更强,也更利于不同逻辑被并行的处理,同时避免因并行或并发处理可能带来的程序故障隐患,这也说明了为什么 FP 语言如 Haskell 在金融等领域(高并发且需要避免程序并发错误)受到瞩目。
- 逻辑式/声明式语言 抽象的能力就更强了,计算细节干脆不见了。把你想表达的逻辑直观表达出来就好了。 如今,在数据驱动计算日益增加的背景下,LP 中的声明式语言(Declarative programming language,如 Datalog)作为代表开始崭露头角,在诸多专家领域开拓应用市场。
1.2 与静态分析相关方向的介绍与对比
静态程序分析
- 优点:在选定的精度下能够保证没有bug。这在教程中会详细介绍。
- 缺点:
- 学术门槛相对高。目前已知国内高校公开的课程资料只有北京大学,南京大学,国防科大,吉林大学的,且通俗易懂的教材稀少(详细课程及教材链接见本文末尾)。作为一门计算机专业的高年级选修课,入门和提高都较困难。
- You tell me.
动态软件测试
- 优点:在工程中被广泛应用,并且有效。实现简单,便于自动化。
- 缺点:
- 无法保证没有bug。 这是无法遍历所有可能的程序输入的必然结果。
- 在当今的由多核与网络应用带来的并发环境下作用有限。 某个bug可能只在特定情况下发生,因而难以稳定地复现。如果你对并发程序的动态测试细节感兴趣,可以参考《拧龙头法测试并发程序》。(截图来自南京大学《形式化语义》课程资料)
形式化(formal)语义验证(verification)
- 优点:由于用数学的方法对程序做了抽象,能够保证没有bug。
- 缺点:
- 学术门槛较高,学习者必须有良好的数学基础才能入门。
- 验证代价较高,一般来说非常重要的项目会使用这一方式保证程序质量。甚至在操作系统这样重要的软件中,也并不一定会使用。(截图来自鸿蒙OS直播发布会)
2. 静态分析:
粗略定义: 在程序运行之前就通过分析行为完成一些检验, 无需编译运行
可能的检验: 有无信息泄密, 有无空指针解引用, 有无死代码…
2.1莱斯定理(Rice‘s Theorem):
-
原话: Any non-trivial property of the behavior of programs in a r.e. language is undecidable
-
概念解释:
- r.e.(recursively enumerable递归可枚举): 就是计算机可以识别的语言也就是我们能见到的所有语言
- non-trivial: 简单理解就是与程序运行时行为有关的性质
-
人话: 一个正常你见过的编程语言, 没有方法能让你确切知道程序是否有某个和运行时行为相关的性质: 比如对c语言程序来说, 不存在一个方法能确切的告诉你程序里有没有空指针
简单来说, 就是不存在完美(perfect)的静态分析方法
- perfect/truth = sound + complete
2.2 perfect,sound(ness), complete(ness)
Sound: 误报, 能够找全, 但是找的不一定对
Complete: 漏报, 找的全对, 但是不一定找全
一般静态分析追求sound
- 为什么追求sound而不是complete举例:
抓贼做类比, sound就是先抓嫌疑人, complete就是抓看一眼就是贼的
sound可以保证缩小排查范围, 保证贼就在嫌疑人里, 在嫌疑人中排查, complete做不到, 因为没抓全的贼还是要在全中国的人里排查, 还不如一开始就在全中国一个个排查谁是贼
- 举例: 一个程序里真实情况是有a, b, c三个地方有空指针
perfect就是报告真实情况: a, b, c三个地方有空指针
Sound就是报告a, b, c, d四个地方有空指针(d不是空指针也就是报错了, 但至少abc报全了)
Complete就是报告a, b两个地方有空指针(虽然ab都报对了, 但是c没有报到, 就是没有报全)
2.3 静态分析的目标
- 正确性——保证sound
怎样的程序分析是对的:
if input: x = 1
else: x = 0
想要分析x = ?
-
x = 1 or 0: sound&complete 正确
-
x = 1 or 0 or 2 or 3: sound 正确
-
x = 1 or -1: 啥也不是 错误
-
x = 1: complete 错误
- 精确性
能提供更多的信息
- 当inputTrue, x = 1; 当inputFalse, x = 0: precise精确的
- x = 1 or 0: imprecise不精确
目标: 保证sound的前提下, 让分析的精确度和速度尽可能高
动态特性: JAVA反射 本地代码可能会影响Sound很难真正的sound
帮助提高程序可靠性, 防止空指针内存泄漏
帮助提高安全性, 防止信息泄密, 注入攻击
编译优化, 死代码消除, 代码移动(code motion)
程序理解, 类型提示
3. 静态分析的应用与前景
人才非常少
- 学术界: 程序设计语言, 软件工程, 系统, 安全…等任何需要编程的方向,
- 工业界: 每个公司都有专门的软件分析的团队, 去分析本公司的代码质量, 还有专门做分析的公司: GrammarTech, Semmle, Sourcebrella
更具体的比如智能合约安全, 区块链安全, 智能漏洞检测等
程序分析的用途概览:
- **程序可靠性(Program Reliability)**想必你应该经历过程序崩溃后报错信息中显示的空指针异常吧,是的,像这种影响程序可靠性的诸多 bug,很多都可以被程序分析在静态时检测出来,包括那些可能会导致程序不响应的程序缺陷,如内存泄漏。
- **程序安全性(Program Security)**程序分析几乎是软件安全必学的内容之一。
- **编译优化(Compiler Optimization)**源码中的许多操作在编译时可以转换成更加高效的方式。此外,dead code elimination 可以避免永远执行不到的代码编译进程序; code motion 可以将某些表达式移动到其他位置,减少重复计算的冗余。
- **程序理解(Program Understanding)**程序理解和 IDE 设计非常相关,例如调用关系、继承关系、声明类型等信息都需要通过程序分析的方法获取。程序的调试有时也需要程序分析技术的辅助。
4. 静态分析的步骤
- abstraction: 把程序抽象化 定义符号
- over- approximation近似
- Transfer function传递函数 ,定义符号之间的转换规则
- Control flow控制流,
拓展: 模型检查, 用有限状态自动机(FSM)抽象判断程序属性的技术, 广泛应用于硬件领域, 在软件领域因为状态爆炸(状态太多, 比如几千个变量), 几乎无法应用到大型程序上
近似法: 在没办法得到准确答案时, 用近似法即给出不准确的答案来近似准确答案
相关文章:

南京大学《软件分析》李越, 谭添——1. 导论
导论 主要概念: soundcompletePL领域概述 动手学习 本节无 文章目录 导论1. PL(Programming Language) 程序设计语言1.1 程序设计语言的三大研究方向1.2 与静态分析相关方向的介绍与对比静态程序分析动态软件测试形式化(formal)语义验证(verification) 2. 静态分析:2.1莱斯…...

使用seata管理分布式事务
做应用开发时,要保证数据的一致性我们要对方法添加事务管理,最简单的处理方案是在方法上添加 Transactional 注解或者通过编程方式管理事务。但这种方案只适用于单数据源的关系型数据库,如果项目配置了多个数据源或者多个微服务的rpc调用&…...

浏览器指纹
引言 先看下 官网 给的定义。 WebAssembly (abbreviatedWasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server …...

W外链平台有什么优势?
W外链作为一种短网址服务,具备多项功能和技术优势,适用于多种场景,以下是其主要特点和优势: 短域名与高级设置:W外链提供了非常短的域名,这有助于提高用户体验,使其在社交媒体分享时更加便捷。…...

深入理解Spring Cache:加速应用性能的秘钥
一、什么是Spring Cache? Spring Cache是Spring框架中的一部分,它为应用提供了一种统一的缓存抽象,可以轻松集成各种缓存提供者(如Ehcache、Redis、Caffeine等)。通过使用Spring Cache,开发者可以在方法上…...

C语言入门基础题(力扣):完成旅途的最少时间(C语言版)
1.题目: 给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。 每辆公交车可以 连续 完成多趟旅途,也就是说,一辆公交车当前旅途完成后,可以 立马开始 下一趟旅途。每辆公交车 独立 …...

基于LORA的一主多从监测系统_0.96OLED
关联:0.96OLED hal硬件I2C LORA 在本项目中每个节点都使用oled来显示采集到的数据以及节点状态,OLED使用I2C接口与STM32连接,这个屏幕内部驱动IC为SSD1306,SSD1306作为从机地址为0x78 发送数据:起始…...

C#系统学习路线
分享一个C#程序员的成长学习路线规划,希望能够帮助到想从事C#开发的你。 我一直在想,初学者刚开始学习编程时应该学些什么?学习到什么程度才能找到工作?才能在项目中发现和解决Bug? 我不知道每位初学者在学习编程时是…...

UI开发:从实践到探索
UI开发:从实践到探索 参考博客文章:https://blog.jim-nielsen.com/2024/sanding-ui/ 在现代web开发中,用户界面(UI)的重要性不言而喻。一个优秀的UI不仅能提升用户体验,还能直接影响产品的成功。 UI开发…...

操作系统 | 学习笔记 | 王道 | 3.1 内存管理概念
3 内存管理 3.1 内存管理概念 3.1.1 内存管理的基本原理和要求 内存可以存放数据,程序执行前需要先放到内存中才能被CPU处理—缓和cpu和磁盘之间的速度矛盾 内存管理的概念 虽然计算机技术飞速发展,内存容量也在不断扩大,但仍然不可能将所有…...

Unity射线之拾取物体
实现效果: 可以移动场景内物品放置到某个位置。通过射线检测,点击鼠标左键,移动物体,再点击左键放下物体。 效果: 移动物体 实现思路: 通过射线检测,将检测到的物体吸附到摄像机前的一个空物…...

Python的numpy库矩阵计算(数据分析)
一、创建矩阵 import numpy as np#创建矩阵anp.arange(15).reshape(3,5) bnp.arange(15,30).reshape(3,5) 使用arrange和reshape创建的二维数组就可以看成矩阵。 此时a和b存储的是: [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] [[15 16 17 18 19]…...

R语言的基本语句及基本规则
0x01 赋值语句 使用 “<-” 或 “” 进行赋值。例如: x <- 5 # 将数值 5 赋值给变量 x y 10 # 另一种赋值方式0x02 输出语句 使用 print() 函数输出内容。例如: print("Hello, R!") print(x)0x03 注释语句 任何在 #之后的内容在…...

网络受限情况下安装openpyxl模块提示缺少Jdcal,et_xmlfile
1.工作需要处理关于Excel文件内容的东西 2.用公司提供的openpyxl模块总是提示缺少jdcal文件,因为网络管控,又没办法直接使用命令下载,所以网上找了资源,下载好后上传到个人资源里了 资源路径 openpyxl jdcal et_xmlfile 以上模块来源于:Py…...

【算法】- 查找 - 散列表查询(哈希表)
文章目录 前言一、哈希表的思想二、哈希表总结 前言 散列技术:在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key) 哈希表:采用散列技术将记录存储在一块连续的存储空间中,这块连…...

货币政策工具
本文为个人学习笔记,内容源于教材;整理记录的同时也作为一种分享。 1. 简介 货币政策工具作为央行实现货币政策目标的经济手段,以期达到最终目标,即物价稳定,充分就业,经济增长,国际收支平衡。…...

std::async概念和使用方法
std::async是 C 标准库中的一个函数模板,用于启动一个异步任务,并返回一个std::future对象,该对象可用于获取异步任务的结果。 1、概念 std::async允许你以异步的方式执行一个函数或者可调用对象,它会在后台启动一个新的线程或者…...

Chatgpt 原理解构
一、背景知识 1. 自然语言处理的发展历程 自然语言处理在不同时期呈现出不同的特点和发展态势。萌芽期,艾伦・图灵在 1936 年提出 “图灵机” 概念,为计算机诞生奠定基础,1950 年他提出著名的 “图灵测试”,预见了计算机处理自然…...

【每日刷题】Day135
【每日刷题】Day135 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. LCR 011. 连续数组 - 力扣(LeetCode) 2. 【模板】二维前缀和_牛客题霸_牛客…...

Linux运维01:VMware创建虚拟机
视频链接:05.新建VM虚拟机_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1nW411L7xm/?p14&spm_id_from333.880.my_history.page.click&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.点击“创建虚拟机” 2.选择“自定义(高级࿰…...

服务器平均响应时间和数据包大小关系大吗?
服务器的平均响应时间与数据包大小有一定的关系,但这只是影响响应时间的众多因素之一。具体来说,数据包大小对服务器响应时间的影响可以从以下几个方面来理解: 1. 数据传输时间 影响: 较大的数据包需要更多的时间在网络上传输,因此…...

Vue入门-指令学习-v-show和v-if
v-show: 作用:控制元素的显示隐藏 语法:v-show"表达式" 表达式值true显示,false隐藏 v-if 作用:控制元素的显示隐藏(条件渲染) 语法: vif"表达式" 表达式tr…...

nacos多数据源插件介绍以及使用
概述 在微服务架构中,服务配置的集中管理和动态调整是至关重要的。Nacos 提供了配置管理和服务发现的功能,其中配置管理支持动态数据源的切换,增强了其在复杂环境中的适用性。默认情况下,Nacos 支持 MySQL 和Derby,但…...

国庆档不太热,影视股“凉”了?
今年国庆档票房止步21亿元,属实有点差强人意。 根据国家电影局统计,2024年国庆档(2024年10月1日至7日)全国电影票房为21.04亿元,观影人次为5209万,总票房成绩、观影总人次同比均有所下滑。 作为传统观影高…...

QtDesign预览的效果与程序运行的结果不一致的解决方法
存在的问题 使用Qt designer软件设计出来的界面,与转换成python程序运行出来的结果不一致,具体看下图 Qt designer预览结果 程序运行出来的结果 原因分析 我自己的电脑是2560*1600分辨率的屏幕,采用的是200%的缩放比例,出现这种…...

模运算和快速幂
文章目录 模运算快速幂 模运算 模运算是大数运算中的常用操作。如果一个数太大,无法直接输出,或者不需要直接输出,则可以对它取模,缩小数值再输出。取模可以防止溢出,这是常见的操作。 取模运算一般要求a和m的符号一…...

【机器学习】——神经网络与深度学习:从基础到应用
文章目录 神经网络基础什么是神经网络?神经网络的基本结构激活函数 深度学习概述什么是深度学习?常见的深度学习算法 深度学习的工作流程深度学习的实际应用结论 引言 近年来,神经网络和深度学习逐渐成为人工智能的核心驱动力。这类模型模仿人…...

Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出
各个操作功能 部分功能 几种操作游戏物体的方式: Center:有游戏物体父子关系的时候,中心点位置 Global/Local:世界坐标系方向/自身坐标系方向 :调试/暂停/下一帧 快捷键 1.Alt鼠标左键:可以实现巡游角度查看场景 2.鼠标滚轮…...

QT入门教程攻略 QT入门游戏设计:贪吃蛇实现 QT全攻略心得总结
Qt游戏设计:贪吃蛇 游戏简介 贪吃蛇是一款经典的休闲益智类游戏,玩家通过控制蛇的移动来吃掉地图上的食物,使蛇的身体变长。随着游戏的进行,蛇的移动速度会逐渐加快,难度也随之增加。当蛇撞到墙壁或自己的身体时&…...

Linux No space left on device分析和解决
报错解释: "No space left on device" 错误表示你的Linux设备(通常是磁盘分区)上没有剩余空间了。这可能是因为磁盘已满,或者inode已满。磁盘空间是指磁盘上的实际空间,而inode是用来存储文件元数据的数据结…...