南京大学《软件分析》李越, 谭添——1. 导论

news2024/10/9 23:29:30

导论

主要概念:

  • 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.coloradmin.cn/o/2200352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爆红网络的膨胀飞天视频,背后竟是Pika1.5 AI视频模型!

最近,社交网络上疯传着各种动物、建筑等物体膨胀飞上天的搞笑视频。无论是真实的还是虚构的物体,都在视频中被压扁、融化、膨胀,引发了广泛的病毒式传播。而这些有趣的效果,都是由Pika最新推出的1.5版本AI视频模型所制作的。 Ai …

STM32输入捕获模式详解(下篇):PWM输入捕获与PWI模式

1. 前言 在上篇文章中,我们详细介绍了STM32输入捕获模式的基本原理和应用方法,包括测频法和测周法。本文将重点探讨如何通过STM32的PWI(PWM Input)模式实现对PWM信号的频率和占空比测量。我们将结合具体的硬件电路,解…

[万字解析]从零开始使用transformers微调huggingface格式的中文Bert模型的过程以及可能出现的问题

系列文章目录 使用transformers中的pipeline调用huggingface中模型过程中可能遇到的问题和修改建议 [万字解析]从零开始使用transformers微调huggingface格式的中文Bert模型的过程以及可能出现的问题 文章目录 系列文章目录前言模型与数据集下载模型下载数据集下载 数据加载、…

单细胞转录组 —— simpleaf 原始数据处理

单细胞转录组 —— 原始数据处理实战(simpleaf) 前言 Alevin-fry 是一个快速、准确且内存节约的单细胞和单核数据处理工具。 Simpleaf 是用 Rust 编写的程序,它提供了一个统一且简化的界面,用于通过 alevin-fry 流程处理一些最…

软件设计师——系统基础开发

📔个人主页📚:秋邱-CSDN博客☀️专属专栏✨:软考——软件设计师🏅往期回顾🏆:软件设计师——信息安全🌟其他专栏🌟:C语言_秋邱 ​ 一、软件工程概述 1.1、考…

【Linux】man手册安装使用

目录 man(manual,手册) 手册安装: 章节区分: 指令参数: 使用场景: 手册内容列表: 手册查看快捷键: 实例: 仍致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 在开头先提醒一下:在 man 手册中退出的方法很简单…

数字IC/FPGA AMBA总线 (内容参考B站UP主数字逻辑君)

1、 串行总线 SPI IIC UART Fsmc (串行总线本文不再赘述,可以参考作者其他文章) 总线简介: AMBA常用的系统总线:AHB,ASB,APB,AXI总线,一个Soc和外部的外设不可能每…

zigbee学习

24.10.7学习目录 一.简介1.分层2.zstack通信 一.简介 其是一种新兴的短距离无线通信技术,用于传感控制应用; 特性: 低功耗,比wifi蓝牙功耗更低;低成本;低速率;近距离;短时延&…

老外发微信时说“I‘ll ping you”是什么意思?发微信怎么用英语说柯桥学英语到哪里?

“发信息”还可以怎么说? 其实很简单,message做动词时,可以直接表达:发信息 ▼ 🌰举个例子 I messaged him yesterday but havent had a reply. 昨天我给他发了短信,但没有回音。 我们现在常说的“发信…

使用Python批量修改文件修改日期为随机的6到8月份

使用Python批量修改文件修改日期为随机的6到8月份 每当雪花飘起的时候,总有一股抹不去的情节,会想起儿时雪天的记忆,虽然模糊但也清晰。那时每年的冬季很冷,但依然喜欢飘雪的日子,看着满天迷蒙飘舞的雪花总有想不完的心…

生成树实验

1 生成树关键点, 第一树根,第二在每个非根桥找root端口 第三 在每个物理片段找指定网桥,第四指定网桥对应的端口就是指定端口 bpdu 比较的方式 root 桥,到root 桥的路径开销,指定桥,指定端口&#x…

双登股份再战IPO:数据打架,实控人杨善基千万元股权激励儿子

撰稿|行星 来源|贝多财经 近日,双登集团股份有限公司(下称“双登股份”)递交招股书,准备在港交所主板上市,中金公司、建银国际、华泰国际为其联席保荐人。 贝多财经了解到,这并非双登股份首次向资本市场…

谷歌AI大模型Gemini API快速入门及LangChain调用视频教程

1. 谷歌Gemini API KEY获取及AI Studio使用 要使用谷歌Gemini API,首先需要获取API密钥。以下是获取API密钥的步骤: 访问Google AI Studio: 打开浏览器,访问Google AI Studio。使用Google账号登录,若没有账号&#xf…

体制内的必须要知道的“人情世故”及职场礼仪

最近,一位新来的小姑娘在参加活动的时候给外来领导带路,结果到跟前时,没有及时退让,夹在了自己领导与外来领导之间,妨碍了两位领导握手,下来后被一顿狠批。这其实是新人不太懂职场礼仪导致的,笔…

OpenCV库模块解析

1.OpenCV库每个模块解析 2.OpenCV的常用函数 它为计算机视觉应用程序提供了一个通用的基础设施,并加速了在商业产品中使用机器感知。作为BSD许可的产品,OpenCV使企业可以很容易地利用和修改代码。该库拥有超过2500个优化算法,其中包括经典和最…

大数据-158 Apache Kylin 安装配置详解 集群模式启动

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

无线麦克风什么牌子的音质效果好?选购中必须警惕劣质产品

在音频设备不断推陈出新、日益丰富多样的今天,无线领夹麦克风以其独有的优点崭露头角。它的设计非常精巧,佩戴起来既舒适又方便,并且在各种不同的环境下都能保证音质稳定以及传输效果良好。 无论是在户外进行拍摄、室内开展直播,…

uniapp学习(003-3 vue3学习 Part.3)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第21p-第p25的内容 文章目录 双向绑定的实现原理例子 计算属性例子1双向绑定格式改成计算属性 例子2 watchwatc…

STM32 -- USB通信 ( 虚拟串口)

本篇操作: 通过CubeMX Keil,配置STM32作为USB设备端,与电脑进行通信(CDC);通用带USB功能的 STM32 芯片 (如F1、F4等,系统时钟配置不同,代码通用)。 目录 一、 STM32内…

高质量带货短视频素材来源推荐

在抖音带货时,寻找高质量视频素材至关重要。今天,我为大家分享五个可以下载高清无水印带货短视频素材的网站,帮助你轻松获取灵感和素材! 蛙学网 蛙学网作为国内领先的短视频素材平台,提供多种类的带货短视频素材。无论…