南京大学《软件分析》李越, 谭添——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 程序设计语言的三大研究方向

Programming Language\n程序设计语言
Theory\n理论
Enviroment\n环境
Application\n应用
语言设计\n类型系统Type System\n语义Semantics和逻辑
编译器Compiler\n运行时系统Runtime system
程序分析Analysis\n程序验证Verification\n程序合成Synthesis

理论: 语言怎么设计, 形式(Formal)逻辑是什么

环境: 语言要运行起来, 就要环境

应用: 保证运行起来要快, 要安全, 要可靠

拓展–语言的分类:

  1. 命令式(imperative)编程语言JAVA, C, CPP…
  2. 函数式(functional)Haskell…
  3. 逻辑式/声明式

语言没变, 环境变了, 软件越来越大越复杂

拓展阅读:

  • 在 命令式语言 中,指令一个一个给出,用条件、循环等来控制逻辑(指令执行的顺序),同时这些逻辑通过程序变量不断修改程序状态,最终计算出结果。我觉得,尽管 IP 现在都是高级语言了,但是本质上并没有脱离那种“类似汇编的,通过读取、写入等指令操作内存数据”的编程方式(我后面会提及,这是源于图灵机以及后续冯诺依曼体系结构一脉的历史选择)。国内高等教育中接触的绝大多数编程语言都是 IP 的,比如 Java、C、C++等。
  • 在 函数式语言 中,逻辑(用函数来表达)可以像数据一样抽象起来,复杂的逻辑(高阶函数)可以通过操纵(传递、调用、返回)简单的逻辑(低阶函数)和数据来表达,没有了时序与状态,隐藏了计算的很多细节。不同的逻辑因为没有被时序和状态耦合在一起,程序本身模块化更强,也更利于不同逻辑被并行的处理,同时避免因并行或并发处理可能带来的程序故障隐患,这也说明了为什么 FP 语言如 Haskell 在金融等领域(高并发且需要避免程序并发错误)受到瞩目。
  • 逻辑式/声明式语言 抽象的能力就更强了,计算细节干脆不见了。把你想表达的逻辑直观表达出来就好了。 如今,在数据驱动计算日益增加的背景下,LP 中的声明式语言(Declarative programming language,如 Datalog)作为代表开始崭露头角,在诸多专家领域开拓应用市场。

1.2 与静态分析相关方向的介绍与对比

静态程序分析
  • 优点:在选定的精度下能够保证没有bug。这在教程中会详细介绍。
  • 缺点:
    1. 学术门槛相对高。目前已知国内高校公开的课程资料只有北京大学,南京大学,国防科大,吉林大学的,且通俗易懂的教材稀少(详细课程及教材链接见本文末尾)。作为一门计算机专业的高年级选修课,入门和提高都较困难。
    2. You tell me.
动态软件测试
  • 优点:在工程中被广泛应用,并且有效。实现简单,便于自动化。
  • 缺点:
    1. 无法保证没有bug。 这是无法遍历所有可能的程序输入的必然结果。
    2. 在当今的由多核与网络应用带来的并发环境下作用有限。 某个bug可能只在特定情况下发生,因而难以稳定地复现。如果你对并发程序的动态测试细节感兴趣,可以参考《拧龙头法测试并发程序》。(截图来自南京大学《形式化语义》课程资料)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

形式化(formal)语义验证(verification)
  • 优点:由于用数学的方法对程序做了抽象,能够保证没有bug。
  • 缺点:
    1. 学术门槛较高,学习者必须有良好的数学基础才能入门。
    2. 验证代价较高,一般来说非常重要的项目会使用这一方式保证程序质量。甚至在操作系统这样重要的软件中,也并不一定会使用。(截图来自鸿蒙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 = ?

  1. x = 1 or 0: sound&complete 正确

  2. x = 1 or 0 or 2 or 3: sound 正确

  3. x = 1 or -1: 啥也不是 错误

  4. x = 1: complete 错误

  • 精确性

能提供更多的信息

  1. 当inputTrue, x = 1; 当inputFalse, x = 0: precise精确的
  2. x = 1 or 0: imprecise不精确

目标: 保证sound的前提下, 让分析的精确度和速度尽可能高

动态特性: JAVA反射 本地代码可能会影响Sound很难真正的sound

帮助提高程序可靠性, 防止空指针内存泄漏

帮助提高安全性, 防止信息泄密, 注入攻击

编译优化, 死代码消除, 代码移动(code motion)

程序理解, 类型提示

3. 静态分析的应用与前景

人才非常少

  1. 学术界: 程序设计语言, 软件工程, 系统, 安全…等任何需要编程的方向,
  2. 工业界: 每个公司都有专门的软件分析的团队, 去分析本公司的代码质量, 还有专门做分析的公司: GrammarTech, Semmle, Sourcebrella

更具体的比如智能合约安全, 区块链安全, 智能漏洞检测等

程序分析的用途概览:

  • **程序可靠性(Program Reliability)**想必你应该经历过程序崩溃后报错信息中显示的空指针异常吧,是的,像这种影响程序可靠性的诸多 bug,很多都可以被程序分析在静态时检测出来,包括那些可能会导致程序不响应的程序缺陷,如内存泄漏。
  • **程序安全性(Program Security)**程序分析几乎是软件安全必学的内容之一。
  • **编译优化(Compiler Optimization)**源码中的许多操作在编译时可以转换成更加高效的方式。此外,dead code elimination 可以避免永远执行不到的代码编译进程序; code motion 可以将某些表达式移动到其他位置,减少重复计算的冗余。
  • **程序理解(Program Understanding)**程序理解和 IDE 设计非常相关,例如调用关系、继承关系、声明类型等信息都需要通过程序分析的方法获取。程序的调试有时也需要程序分析技术的辅助。

4. 静态分析的步骤

  1. abstraction: 把程序抽象化 定义符号
  2. over- approximation近似
    1. Transfer function传递函数 ,定义符号之间的转换规则
    2. Control flow控制流,

见数据流分析

拓展: 模型检查, 用有限状态自动机(FSM)抽象判断程序属性的技术, 广泛应用于硬件领域, 在软件领域因为状态爆炸(状态太多, 比如几千个变量), 几乎无法应用到大型程序上

近似法: 在没办法得到准确答案时, 用近似法即给出不准确的答案来近似准确答案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443191.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis数据库与GO(一):安装,string,hash

安装包地址:https://github.com/tporadowski/redis/releases 建议下载zip版本,解压即可使用。解压后,依次打开目录下的redis-server.exe和redis-cli.exe,redis-cli.exe用于输入指令。 一、基本结构 如图,redis对外有个…

k8s的安装和部署

配置三台主机,分别禁用各个主机上的swap,并配置解析 systemctl mask swap.target swapoff -a vim /etc/fstab配置这三个主机上的主机以及harbor仓库的主机 所有主机设置docker的资源管理模式为system [rootk8s-master ~]# vim /etc/docker/daemon.json…

为什么推荐你一定要弄懂千门八将108局,学会做局思维的人有多么的厉害?

在纷繁复杂的社会与商业环境中,能够洞悉事物本质、预见趋势并巧妙布局的人,往往能在竞争中脱颖而出,成为时代的弄潮儿。而“千门八将108局”这一古老而深邃的智慧体系,不仅蕴含了中国传统文化中对于策略、心理学、人际交往的深刻理…

PCL 提取点云边界

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 计算法向量 2.1.2 提取边界点 2.1.3 可视化边界点 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总&#xff0…

动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络

李宏毅-卷积神经网络CNN 如果使用全连接层:第一层的weight就有3*10^7个 观察 1:检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1:感受野 根据观察1 可以做第1个简化,卷积神经网络会设定一个区域&#xff0c…

SolarWinds中如何添加华为交换机实现网络管理

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 SolarWinds作为一款广受好评的网络管理软件,它提供了全面的网络配置、监控和管理解决方案&#x…

组织病理学图像中的再识别|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Re-identification from histopathology images 组织病理学图像中的再识别 01 文献速递介绍 在光学显微镜下评估苏木精-伊红(H&E)染色切片是肿瘤病理诊断中的标准程序。随着全片扫描仪的出现,玻片切片可以被数字化为所谓…

【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象

文章目录 请求1. 传递单个参数注意事项1 . 正常传递参数2 . 不传递 age 参数3 . 传递参数类型不匹配 2. 传递多个参数3. 传递对象 请求 访问不同的路径,就是发送不同的请求。在发送请求时,可能会带一些参数,所以学习 Spring 的请求&#xff…

【093】基于SpringBoot+Vue实现的精品水果线上销售系统

系统介绍 视频演示 基于SpringBootVue实现的精品水果线上销售系统(有文档) 基于SpringBootVue实现的精品水果线上销售系统采用前后端分离的架构方式,系统设计了管理员、商家、用户三种角色,实现了公告类型管理、商家信誉类型管理…

自由学习记录

约束的泛型通配符? Java中的泛型 xiaomi和byd都继承了car&#xff0c;但是只是这两个类是car的子类而已&#xff0c;而arraylist<xiaomi> ,arraylist<byd> 两个没有半毛钱继承关系 所以传入的参数整体&#xff0c;是car的list变形&#xff0c;里面的确都能存car…

SDK4(note下)

以下代码涉及到了很多消息的处理&#xff0c;有些部分注释掉了&#xff0c;主要看代码 #include <windows.h> #include<tchar.h> #include <stdio.h> #include <strsafe.h> #include <string> #define IDM_OPEN 102 /*鼠标消息 * 键盘消息 * On…

数据湖数据仓库数据集市数据清理以及DataOps

一提到大数据我们就知道是海量数据&#xff0c;但是我们并不了解需要从哪些维度去考虑这些数据的存储。比如 数据湖、数据仓库、数据集市&#xff0c;以及数据自动化应用DataOps有哪些实现方式和实际应用&#xff0c;这篇文章将浅显的做一次介绍。 数据湖 数据湖是一种以自然…

SimpleFoc以及SVPWM学习补充记录

SimpleFoc SimpleFOC移植STM32&#xff08;一&#xff09;—— 简介 FOC控制的过程是这样的&#xff1a; 对电机三相电流进行采样得到 Ia,Ib,Ic。将 Ia,Ib,Ic 经过Clark变换得到 I_alpha I_beta。将 I_alpha I_beta 经过Park变换得到 Id,Iq。计算 Id,Iq 和其设定值 Id_ref 和…

网络知识点之—EVPN

EVPN&#xff08;Ethernet Virtual Private Network&#xff09;是下一代全业务承载的VPN解决方案。EVPN统一了各种VPN业务的控制面&#xff0c;利用BGP扩展协议来传递二层或三层的可达性信息&#xff0c;实现了转发面和控制面的分离。 EVPN解决传统L2VPN的无法实现负载分担、…

《神经网络》—— 长短期记忆网络(Long Short-Term Memory,LSTM)

文章目录 一、LSTM的简单介绍二、 LSTM的核心组件三、 LSTM的优势四、 应用场景 一、LSTM的简单介绍 传统RNN循环神经网络的局限&#xff1a; 示例&#xff1a;当出现“我的职业是程序员。。。。。。我最擅长的是电脑”。当需要预测最后的词“电脑”。当前的信息建议下一个词可…

[Python] 使用Python自定义生成二维码

文章目录 目录 安装 qrcode 库生成简单的二维码代码讲解 生成自定义样式的二维码代码讲解 生成带有链接的二维码代码讲解 Demo代码实现代码讲解 总结 收录专栏: [Python] 二维码是现在非常常用的一种信息存储和传递方式&#xff0c;我们可以通过扫描二维码来快速获取文本、链接…

如何在测试中模拟请求和响应?

在日常开发中&#xff0c;除了在服务器端进行单元测试之外&#xff0c;还经常需要做集成测试&#xff0c;为了能更好地做一些边界测试&#xff0c;我们常常需要mock一些HTTP请求或者响应&#xff0c;今天我们就来聊聊几种常见的方式。 服务器端设置 在开发中&#xff0c;我们…

车辆路径规划问题(VRP)优化方案

车辆路径规划问题&#xff08;VRP&#xff09;优化方案 车辆路径规划问题&#xff08;Vehicle Routing Problem, VRP&#xff09;是物流领域中一个经典的组合优化问题&#xff0c;目标是在满足客户需求的情况下&#xff0c;找到一组车辆的最优配送路径&#xff0c;以最小化总的…

C/C++复习(一)

1.sizeof 关于sizeof我们是经常使用的&#xff0c;所以使用方法就不需要提及了&#xff0c;这里我们需要注意的是&#xff0c;sizeof 后面如果是表达式可以不用括号&#xff0c;并且sizeof实际上不参与运算&#xff0c;返回的是内容的类型大小&#xff08;size_t类型&#xff0…

CDN绕过学习

1.什么是CDN&#xff1f; CDN就是分布在各个地区的服务器&#xff0c;这些服务器储存着数据的副本。 哪些服务器比较接近你&#xff0c;当你发起请求时&#xff0c;提前就会快速为你提供服务。 总结来说就是&#xff1a; 其实就是用来加速访问的&#xff0c;以及缓解压力&a…