数据流分析

article/2025/10/1 8:03:32

基本原理

数据流分析是一种用来获取相关数据沿着程序执行路径流动的信息分析技术。分析对象是程序执行路径上的数据流动或可能的取值

  • 优点:具有更强的分析能力,适合需要考虑控制流信息且变量属性之操作十分简单的静态分析问题

  • 缺点:分析效率低,过程间分析和优化算法复杂,编程工作量大,容易出错且效率低

一个数据流分析框架(D, L, F)包含:

  1. D:数据流的方向,前向或者后向

  2. L:包含数值作用域V和操作符meet ⊓ 或 join ⊔ 的lattice

  3. F:一系列V to V的传递函数

Tips: 数据流分析可以看成在一个lattice的数值域上,迭代地使用传递函数和操作符

数据流分析的分类

  • 对程序路径的分析精度分类

    • 流不敏感分析(flow insensitive):不考虑语句的先后顺序,按照程序语句的物理位置从上往下顺序分析每一语句,忽略程序中存在的分支

    • 流敏感分析(flow sensitive):考虑程序语句可能的执行顺序,通常需要利用程序的控制流图(CFG)

    • 路径敏感分析(path sensitive):不仅考虑语句的先后顺序,还对程序执行路径条件加以判断,以确定分析使用的语句序列是否对应着一条可实际运行的程序执行路径

  • 分析程序路径的深度分类

    • 过程内分析(intra-procedure analysis):只针对程序中函数内的代码

    • 过程间分析(inter-procedure analysis):考虑函数之间的数据流,即需要跟踪分析目标数据在函数之间的传递过程

      • 上下文不敏感分析(context-insensitive):将每个调用或返回看做一个 “goto” 操作,忽略调用位置和函数参数取值等函数调用的相关信息

      • 上下文敏感分析(context-sensitive):对不同调用位置调用的同一函数加以区分

检测程序漏洞

基于数据流的源代码漏洞分析的原理如下图所示:

  • 代码建模

    • 该过程通过一系列的程序分析技术获得程序代码模型。首先通过词法分析生成词素的序列,然后通过语法分析将词素组合成抽象语法树。如果需要三地址码,则利用中间代码生成过程解析抽象语法树生成三地址码。如果采用流敏感或路径敏感的方式,则可以通过分析抽象语法树得到程序的控制流图。构造控制流图的过程是过程内的控制流分析过程。控制流还包含分析各个过程之间的调用关系的部分。通过分析过程之间的调用关系,还可以构造程序的调用图。另外,该过程还需要一些辅助支持技术,例如变量的别名分析,Java 反射机制分析,C/C++ 的函数指针或虚函数调用分析等

      • 代码解析:指词法分析、语法分析、中间代码生成以及过程内的控制流分析等基础的分析过程

      • 辅助分析:包括控制流分析等为数据流分析提供支持的分析过程

  • 程序代码建模

    • 漏洞分析系统通常使用树型结构的抽象语法树或者线性的三地址码来描述程序代码的语义。控制流图描述了过程内程序的控制流路径,较为精确的数据流分析通常利用控制流图分析程序执行路径上的某些行为。调用图描述了过程之间的调用关系,是过程间分析需要用到的程序结构

  • 漏洞分析规则

    • 漏洞分析规则是检测程序漏洞的依据。对于分析变量状态的规则,可以使用状态自动机来描述。对于需要分析变量取值的情况,则需要指出应该怎样记录变量的取值,以及在怎样的情况下对变量的取值进行何种的检测

      • 程序漏洞通常和程序中变量的状态或者变量的取值相关。状态自动机可以描述和程序变量状态相关的漏洞分析规则,自动机的状态和变量相应的状态对应

  • 静态漏洞分析

    • 数据流分析可以看做一个根据检测规则在程序的可执行路径上跟踪变量的状态或者变量取值的过程。在该过程中,如果待分析的程序语句是函数调用语句,则需要利用调用图进行过程间的分析,以分析被调用函数的内部代码。另外,数据流分析还可以作为辅助技术,用于完善程序调用图和分析变量别名等

      • 赋值语句控制转移语句过程调用语句是数据流分析最关心的三类语句

      • 过程内分析

        • 对于抽象语法树的分析,可以按照程序执行语句的过程从右向左、自底向上地进行分析

        • 对于三地址码的分析,则可以直接识别其操作以及操作相关的变量

        • 流不敏感分析中,常常使用线性扫描的方式依次分析每一条中间表示形式的语句

        • 流敏感的分析路径敏感的分析,则根据控制流图进行分析。对控制流图的遍历主要是深度优先广度优先两种方式

      • ​​

        • 如果在分析某段程序中遇到过程调用语句,就分析其调用过程的内部的代码,完成分析之后再回到原来的程序段继续分析

        • 借鉴基本块的分析,给过程设置上摘要,也包含前置条件和后置条件

          • 前置条件记录对基本块分析前已有的相关分析结果

          • 后置条件是分析基本块后得到的结果

  • 处理分析结果

    • 对检测出的漏洞进行危害程度分类等

方法实现

数据流分析使用的程序代码模型主要包括程序代码的中间表示以及一些关键的数据结构,利用程序代码的中间表示可以对程序语句的指令语义进行分析

抽象语法树(AST)

是程序抽象语法结构的树状表现形式,其每个内部节点代表一个运算符,该节点的子节点代表这个运算符的运算分量。通过描述控制转移语句的语法结构,抽象语法树在一定程度上也描述了程序的过程内代码的控制流结构

例子:

while b ≠ 0if a > ba := a − belseb := b − a
return a

对应的抽象语法树为:

由一组类似于汇编语言的指令组成,每个指令具有不多于三个的运算分量。每个运算分量都像是一个寄存器

静态单赋值形式(SSA)

是一种程序语句或者指令的表示形式,在这种表示形式中,所有的赋值都是针对具有不同名字的变量,也就是说,如果某个变量在不同的程序点被赋值,那么在这些程序点上,该变量在静态单赋值形式的表示中应该使用不同的名字。在使用下标的赋值表示中,变量的名字用于区分程序中的不同的变量,下标用于区分不同程序点上变量的赋值情况。另外,如果在一个程序中,同一个变量可能在两个不同的控制流路径中被赋值,并且在路径交汇后,该变量被使用,那么就需要一种被称为 Φ 函数的的表示规则将变量的赋值合并起来

 

作用:静态单赋值形式对于数据流分析的意义在于,可以简单而直接地发现变量的赋值和使用情况,以此分析数据的流向并发现程序不安全的行为

控制流图(CFG)

是指用于描述程序过程内的控制流的有向图。控制流由节点和有向边组成。典型的节点是基本块(BB),即程序语句的线性序列。有向边表示节点之间存在潜在的控制流路径,通常都带有属性(如if语句的true分支和false分支)

调用图(CG)

是描述程序中过程之间的调用和被调用关系的有向图。控制图是一个节点和边的集合,并满足如下原则

  • 对程序中的每个过程都有一个节点

  • 对每个调用点都有一个节点

  • 如果调用点 c 调用了过程 p,就存在一条从 c 的节点到 p 的节点的边

静态漏洞分析

数据流分析检测漏洞是利用分析规则按照一定的顺序分析代码中间表示的过程

  • 过程内分析:对于抽象语法树的分析,可以按照程序执行语句的过程从右向左、自底向上地进行分析。对于三地址码的分析,则可以直接识别其操作以及操作相关的变量

  • 过程间分析:如果在分析某段程序中遇到过程调用语句,就分析其调用过程的内部的代码,完成分析之后再回到原来的程序段继续分析。另一种思路是借鉴基本块的分析,给过程设置上摘要,也包含前置条件和后置条件

原文链接


http://chatgpt.dhexx.cn/article/nLZ65XFH.shtml

相关文章

数据流图DFD

数据流图和数据字典是结构化分析方法中常用的两种工具。本文中基础资料收集于网络,顶层数据流图部分加入里自己的理解。 数据流图 数据流图,简称DFD,是SA方法中用于表示系统逻辑模型的一种工具,它以图形的方式描绘数据在系统中流…

软考--数据流图(DFD)

数据流图的基本元素及其作用 数据流图通过外部代理(实体)描述系统与外界之间的数据交互关系,内部的活动通过处理(加工)表示,用数据流描述系统中不同活动之间的数据传输内容和方向,需要持久化存储的数据用数据存储表示,一般用文件…

数据流

数据流 引子 编译器后端会对前端生成的中间代码做很多优化,也就是在保证程序语义不变的前提下,提高程序执行的效率或减少代码size等优化目目标。优化需要依靠代码分析给出的"指导信息"来相应地改进代码,而代码分析中最重要的就是数…

数据流分析简介

文章目录 0. 前言1. 数据流分析简介1.1 数据流分析基本概念1.2 数据流分析结构简述 2. 数据流分析应用2.1 定义可达性分析(Reaching Definitions Analysis)2.1.1 定义可达描述2.1.2 定义可达算法2.1.3 定义可达算法示例 2.2 活变量分析(Live Variables Analysis)2.2.1 活变量描…

Swift抖动动画

一、直接实现某个视图的持续抖动、只需要给视图的layer添加动画就行。 /// 直接实现/// - Parameters:/// - repeatCount: 重复次数/// - duration: 持续时间/// - values: //抖动幅度数组:不需要太大:从-15度 到 15度、再回到原位置、为一个抖动…

os “抖动”与工作集

由于请求分页式虚拟存储器系统的性能优越,在正常运行情况下,它能有效地减少内存碎片,提高处理机的利用率和吞吐量,故是目前最常用的一种系统。但如果在系统中运行的进程太多,进程在运行中会频繁地发生缺页情况&#xf…

ADC 采样数据抖动

MSP430或STM32,在使用内部ADC出现的采样数据异常抖动问题 采样设计: 用于检测供电线路电流及电压。 产品运行在两种模式下,1、低功耗静态模式(仓储态),2、全功能全速运行模式(工作态&#xff09…

SiTime 硅晶振抖动定义和测量方法

1 简介 抖动是时钟信号边沿事件的时间点集合相对于其理想值的离散时序变量。时钟信号中的抖动通常是由系统中的噪声或其他干扰导致的。具体因素包括热噪声、电源变化、负载条件、器件噪声以及相邻电路耦合的干扰等。 2 抖动的类型 时钟信号抖动定义有多种主要是:…

如何理解相位噪声与时间抖动的关系?

每当介绍相位噪声测试方案时,都会提到时间抖动,经常提到二者都是表征信号短期频率稳定度的参数,而且是频域和时域相对应的参数。正如题目所示,相位噪声与时间抖动有着一定的关系,那么相噪是与哪种类型的抖动相对应&…

网络延时抖动

问题背景: 上线后延时抖动很频繁,正常延时为10ms左右,抖动时延达到300ms以上,严重影响了该业务的性能 问题结论:tcp传输报文段延时异常,传输内容越大,受网络影响越大 index模块延时正常&…

html图片抖动,css3图片抖动

受1楼启发Document .sdf{ width:500px; height:500px; overflow:hidden; margin:200px auto; position:relative; } .outter{ width:174px; height:155px; position:absolute; top:100px; left:200px; transition:all 1s ease; } .dd{ background:url(http://www.ppt123.net/be…

图像随机抖动算法

本文参考知乎博客:图像处理之 Dithering(https://zhuanlan.zhihu.com/p/110104674) 图像抖动(dithering)常用于颜色量化(color quantization)的后处理,即去除颜色量化产生的一些视觉…

时钟抖动

本文转载至:http://m.elecfans.com/article/646572.html 随着通信系统中的时钟速率迈入GHz级,抖动这个在模拟设计中十分关键的因素,也开始在数字设计领域中日益得到人们的重视。在高速系统中,时钟或振荡器波形的时序误差会限制一个…

图像“抖动”原理

转载自博主:NWSUAF_LiuZhenHua,博客地址:https://blog.csdn.net/wzz110011/article/details/78170516?biz_id102&utm_term%E5%8A%A8%E5%9B%BE%E6%8A%96%E5%8A%A8&utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~soba…

时钟抖动(Jitter)的基本概念 【转载】

时钟抖动(Jitter)的基本概念 李倩 发表于 2018-03-13 10:21:08 电子说 随着通信系统中的时钟速率迈入GHz级,抖动这个在模拟设计中十分关键的因素,也开始在数字设计领域中日益得到人们的重视。在高速系统中,时钟或振荡…

什么是抖动?什么叫抖动

什么是抖动?什么叫抖动 抖动的定义是“数字信号的各个有效瞬时对其当时的理想位置的短期性偏离”,这意味着抖动是不希望有的数字信号的相位调制。相位偏离的频率称为抖动频率,与抖动有密切关系的第二个参数称为漂移,把它定义为“数字信号的…

什么是进程的抖动 | 抖动现象

抖动现象是指如果分配给进程的存储块数量小于进程所需要的最小值,进程的运行将会很频繁地产生缺页中断 ,这种频率非常高的页面置换现象称为抖动。 也可以说:页面在内存与外存之间频繁调度,以至于调度页面所需时间比进程实际运行时…

APP运营推广:新APP建设之后该怎么做好品牌运营?

APP市场推广的方法和渠道非常多,但是并不是每一个渠道都是适用所有APP的;对于一个APP市场推广的人员来说,这是值得认真思考的问题!“多面出击”是大部分APP运营人员都会采取的方法,把能够想到能做到的各种方法途径都尝…

【创业说】零经验接手APP运营推广,聊聊这两个月我是怎么熬过来的

编者按:本文来自一位创业者的匿名投稿(反复强调不要公开自己的身份),讲述了自己离职创业,从零开始做APP推广,所经历的各种推广方式,并且根据自己的情况评估了各个渠道的效果,创业容易…

APP生存法则:教你如何快速找到APP运营推广的捷径

APP的运营是一个APP能否生存的主要依靠,在运营的世界里有八大黄金法则,小编认为任何APP都可以运营这八大法则来进行推广。下面我们来了解一下移动APP运营的八大法则。 1、运营与推广一样重要 App上线一定阶段之后(基本上在10用户万以上),App…