第九章:Dynamic Symbolic Execution

2023-11-06 20:44

本文主要是介绍第九章:Dynamic Symbolic Execution,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Dynamic Symbolic Execution
    • overview
    • motivation
    • dynamic symbolic execution
    • 常用的其他技术对比
      • Random Testing
      • symbolic execution
    • Combined static and symbolic - Dynamic Execution (DSE)
      • step1: 初始化两个具体的值 x,y
      • step2: 根据定义得出 z 的 concrete value 和 symbolic state
      • step3: 判断符合哪一个 path condition
      • step4:对条件取反,并生成新的 concrete value
      • step5:再次判断
      • step6:再次取反 constrain 并得到新的 test
      • step7: 再次重新初始化后开始
    • 书上内容 Symbolic Execution
      • symbolic test oracles
      • test input generation
      • Limitation
      • Dynamic Symbolic Execution
      • difference between symbolic 和 DSE
      • DSE 的好处
      • DSE 的 limitation

Dynamic Symbolic Execution

overview

Dynamic Symbolic Execution(DSE),也称为符号执行或符号化测试,是一种程序分析技术,用于自动发现软件中的错误。它是通过将程序的实际执行与抽象的符号执行相结合来完成的,这可以帮助发现程序中的各种路径,并验证这些路径上是否存在问题,如错误或安全漏洞。

motivation

  • 编写和维护测试是繁琐且容易出错的。

  • idea:

    • Generate regression test suite

    回归测试套件(regression test suite)是一组测试用例,它们被设计用来验证软件在修改后(比如说,修复了bug或添加了新功能)仍然按照预期工作,既有功能没有因为新的代码变动而发生故障。回归测试的关键目的是确保新的代码更改没有引入新的缺陷到已有的功能中,即没有“回归”或倒退。

    • Execute all reachable statements
    • Catch any assertion violations
  • new technique: dynamic symbolic execution

dynamic symbolic execution

在这里插入图片描述
- 存储程序状态的具体和符号化表示
- 解决约束以指导分支点处的执行
- 探索被测试单元的所有执行路径

  • 一种常用的 dynamic symbolic execution 是 hybrid analysis
    在这里插入图片描述

  • 程序可以看成是一个 binary tree,可能有无限的深度(因为可能存在循环),这个 tree 称为 computation tree

  • 每个 node 代表 一个条件语句的执行

  • 每条 edge 表示执行一系列非条件语句。也就是说,如果 node2是一个条件语句,那么 left 的分支就是使得 node2 条件为 false 的执行操作,而 node2 右边的分支就是使得其为 true 的执行操作

  • 树上的每条路径表示 inputs 的一个等价类

  • 实例:
    在这里插入图片描述

  • 通常会用 assert 来 if 不满足时抛出错误的操作

  • 还有因为这个里面没有循环操作,因此这个树是有界的

常用的其他技术对比

Random Testing

在这里插入图片描述

  • 如果使用 random testing,对于一个 if 条件,可能非常难测到,比如上面的例子

symbolic execution

在这里插入图片描述

  • symbolic execution 的核心是一个 test prover,而不使用任何具体的值

  • 当程序在第一个分支的时候,test prover 会证明是否存在一个 x 使得 x ∗ 3 = = 15 x*3==15 x3==15 这个条件成立;test prover 会说 “存在”,那么这个 condition 为 true 的分支就会成功执行;接下来会询问是否存在 x 使得 x ∗ 3 ! = 15 x*3!=15 x3!=15 这个条件成立(也就是 condition 的 else 分支),test prover 会说 “存在”,因此第一个 condition 的 else 也会成功执行

  • 接下来是第二层分支,继续询问 test prover,是否存在 x x x 满足 x ∗ 3 = = 15   & &   x % 5 = = 0 x*3==15 ~\&\& ~x \% 5==0 x3==15 && x%5==0 ,test prover 会说 “存在”,那么 print(ok) 成功可达;然后询问 else 的 condition,即是否存咋 x x x 满足 x ∗ 3 = = 15   & &   x % 5 ! = 0 x*3==15 ~\&\& ~x \% 5!=0 x3==15 && x%5!=0,test prover 会说 “不存在”;因此这个 else 永远不可达,无论在什么条件下。

  • 这成功避免了 random testing 的无法进入分支的问题。但他也存在自己的问题,那就是,在大型程序中,这种 if else 的叠加会迅速爆炸,因为条件太多了且都是级联的。

  • 另外一个缺点是 symbolic execution 可能不够强大
    在这里插入图片描述

  • 上述条件对于 test prover 来说是困难的,因此可能存在误报

Combined static and symbolic - Dynamic Execution (DSE)

在这里插入图片描述

step1: 初始化两个具体的值 x,y

  • 除了两个具体的值之外,x,y 分别的 symbolic 的 state 也会记录下来,现在是 x = x 0 , y = y 0 x=x_0, y=y_0 x=x0,y=y0
    在这里插入图片描述

step2: 根据定义得出 z 的 concrete value 和 symbolic state

  • 可以计算出 z = 14 z=14

这篇关于第九章:Dynamic Symbolic Execution的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/358958

相关文章

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes 优势 1、构建了一个用于监督原始视频去噪的基准数据集。为了多次捕捉瞬间,我们手动为对象s创建运动。在高ISO模式下捕获每一时刻的噪声帧,并通过对多个噪声帧进行平均得到相应的干净帧。 2、有效的原始视频去噪网络(RViDeNet),通过探

C语言-第九章:文件读写

传送门:C语言-第八章:指针进阶 目录 第零节:准备工作  第一节:文件的简单介绍         1-1.绝对路径与相对路径         1-2.文件的作用 第二节:文件操作         2-1.打开文件         2-2.关闭文件         2-3.读操作                 2-3-1.fgetc 读取一个字符

兔子--Android Studio出现错误:Error:Execution failed for task ':myapp:dexDebug'. com.android.ide.common.pro

重点在:finished with non-zero exit value 2. 这里表明了有重复的内容存在。 由于:Android Studio中引入包的方式有如下2种:    compile 'com.android.support:support-v4:22.0.0'    compile files('libs/support-v

【硬刚ES】ES基础(十三)Dynamic Template和Index Template

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

第九章 软件维护

第九章  软件维护 软件维护:在软件交付使用后,为了改正错误或满足新的需要而进行修改软件的过程。 软件维护活动类型总起来大概有四种: 纠错性维护(校正性维护)、适应性维护、完善性维护或增强、预防性维护或再工程。

Spark动态资源分配-Dynamic Resource Allocation

关键字:spark、资源分配、dynamic resource allocation Spark中,所谓资源单位一般指的是executors,和Yarn中的Containers一样,在Spark On Yarn模式下,通常使用–num-executors来指定Application使用的executors数量,而–executor-memory和–executor-cores分别用来指定每个ex

【论文分享】MyTEE: Own the Trusted Execution Environment on Embedded Devices 23‘NDSS

目录 AbstractINTRODUCTIONBACKGROUNDARMv8 ArchitectureSecurity statesTrustZone extensionsVirtualization Communication with Peripherals MOTIVATIONATTACK MODEL AND ASSUMPTIONSYSTEM DESIGNOverviewExecu

【Arm Cortex-X925】 -【第九章】-L2 内存系统

9. L2 内存系统 Cortex®-X925 核心的 L2 内存系统通过 CPU 桥接器将核心与 DynamIQ™ Shared Unit-120 连接。它包括私有的 L2 缓存。 L2 缓存是统一的,并且对集群中的每个 Cortex®-X925 核心都是私有的。 以下表格显示了 L2 内存系统的特点。 9.1 L2 缓存 集成的 L2 缓存处理来自指令和数据侧的指令和数据请求,以及

第九章 【桥梁】 Apifox

第九章 【桥梁】 Apifox Apifox Apifox 是集 API 文档、API 调试、API Mock、API 自动化测试多项实用功能为一体的 API 管理平台,定位为 Postman + Swagger + Mock + JMeter。旨在通过一套系统、一份数据,解决多个工具之间的数据同步问题。只需在 Apifox 中定义 API 文档;API 调试、API 数据 Mock、API