0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鉴源实验室·代码缺陷检查中的数据流分析技术

上海控安 来源:上海控安 作者:上海控安 2025-02-19 14:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者 | 甘智杰上海控安可信软件创新研究院 鉴源实验室

在软件开发的测试与维护阶段,代码缺陷的早期检测能显著降低修复成本。传统静态检查工具(如语法规则匹配)常因缺乏对程序运行逻辑的建模,导致高误报率或漏检风险。数据流分析(Data Flow Analysis, DFA)通过追踪变量状态在程序执行路径中的传播过程,为精准识别空指针引用、资源泄漏等隐蔽缺陷提供了系统性解决方案。

01

数据流分析的基本原理

1.1 定义与目标

数据流分析属于静态程序分析的子领域,其核心目标是通过抽象程序执行时的数据状态变化,推断程序中每个可达点的变量属性(如是否为空、是否已初始化)。与动态测试不同,数据流分析无需实际运行代码,即可模拟所有可能的执行路径。

1.2 工作流程

1. 控制流图(CFG)构建:将代码转换为由基本块(Basic Block)和跳转边组成的图结构,每个基本块表示一组顺序执行的语句。

2. 状态转移方程定义:针对特定缺陷模式(如空指针),设计变量状态在基本块间的传播规则。

3. 迭代求解:通过定点迭代算法,计算每个程序点的变量状态集合。

1.3 基本思想

在实现层面,数据流分析往往会在程序各点构造约束并迭代求解,通常采用以下思路进行构建:

1. 抽象程序:将程序划分为若干基本块,建立控制流图;

2. 初始信息:在程序入口点或某些边界(如函数入口、出口)赋予初始分析信息(如变量初始状态);

3. 传递函数:在基本块内根据代码语义确定如何转移状态(例如 x = y + 1 会影响 x 的值域);

4. 迭代求解:沿着控制流图迭代传播,直到各个基本块的分析信息都趋于稳定(不再发生变化)。

5. 缺陷检测:对分析结果进行检查,根据预先设定的规则或警告条件(如“变量从未初始化却被使用”),识别可能的缺陷。

02

技术实现的关键维度

2.1 分析方向

· 正向分析(Forward Analysis):从程序入口开始,沿控制流方向推导变量状态,适用于分析变量初始化问题。

· 逆向分析(Backward Analysis):从程序出口或特定缺陷点反向推导,常用于检测未释放的资源(如文件句柄)。

2.2 敏感度类型

· 流敏感(Flow-Sensitive):考虑语句执行顺序对状态的影响。

· 路径敏感(Path-Sensitive):区分不同条件分支下的状态分支,减少误报(如对if-else不同分支分别建模)。

· 上下文敏感(Context-Sensitive):在函数调用时区分不同调用上下文,避免过程间分析的精度损失。

03

数据流分析在代码缺陷检查中的应用示例

下面通过一个简化的示例来说明数据流分析如何帮助发现代码中的缺陷。假设我们有一个用C语言编写的函数,用于处理用户输入的字符串并将其拷贝到目标缓冲区中进行后续处理。

wKgZPGe1ev6AVgfUAAKsxLeXZnc773.png

3.1 分析目标

这段示例代码中,我们可以通过数据流分析发现以下可能的缺陷或问题:

1. 缓冲区使用边界:当 userInput 的长度大于等于 8 时,是否会发生溢出?

2. 指针值有效性:userInput 是否可能为空?如若为空则会引起空指针引用。

3. 字符串截断:在使用 strncpy 后,是否保证了缓冲区尾部有 '' 终止符?

3.2生成控制流图并进行数据流分析

1. 控制流图划分

· 基本块A:声明 buffer,计算 length;

· 分支判断:length < BUF_SIZE;

· 基本块B:执行 strcpy(buffer, userInput);;

· 基本块C:执行 strncpy(buffer, userInput, BUF_SIZE - 1); buffer[BUF_SIZE - 1] = '';;

· 基本块D:打印并返回。

2. 前向分析示例

· 初始信息:假设 userInput 可以来源于任何长度(包括空字符串、过长字符串)以及可能为 NULL。

· 在基本块A中,length = strlen(userInput) 得到的 length 值域未知,但会与 BUF_SIZE 比较。

· 当条件 length < 8 为真时,程序会调用 strcpy。若 userInput 的长度确实小于8,则 strcpy 是安全的;反之则可能引发溢出。数据流分析可以在此捕获到“如果输入长度大于等于8但仍走到这个分支,那么调用 strcpy 会导致潜在的缓冲区溢出”。

· 当条件 length < 8 为假时,程序会调用 strncpy 并手动添加 ''。在此路径中,如果 userInput 恰好是长度8的字符串,strncpy 会将前7个字符拷贝并加上 '',相对安全。但仍需分析输入为 NULL 的情况。

3. 发现缺陷

· 如果在实际代码逻辑中由于某些复杂条件或拼接错误导致 length 判断出错(或者分支条件被其他因素干扰),执行了 strcpy,则可能发生溢出。

· 如果 userInput 为 NULL,调用 strlen 和后续函数也会崩溃。

· 好的实践应当在进入函数时先检查 userInput 是否为 NULL,并在后续操作时严格确保 length 小于缓冲区大小或使用更安全的函数(如 snprintf 等)。

04

挑战与优化方向

4.1精度与效率的权衡

路径敏感分析易导致“路径爆炸”,尤其对包含循环或递归的代码。工程中常采用摘要(Summary)技术压缩重复计算(如函数调用的上下文合并)。

4.2 动态特性的处理

面对多态、反射等动态语言特性,需引入保守假设(如认为反射调用的对象可能为任意类型),可能导致分析结果过近似。

4.3 机器学习辅助优化

近年研究尝试使用机器学习预测关键分析参数(如循环迭代次数上限),或通过模式识别减少冗余计算。例如,Facebook的Infer工具结合符号执行提升路径敏感的实用性。

05

结 语

数据流分析通过形式化建模程序行为,为代码缺陷检查提供了理论严谨的解决方案。尽管面临路径敏感性和可扩展性等挑战,随着符号执行、AI辅助等技术的融合,其实用性将持续增强。

上海控安针对嵌入式软件安全测试需求,推出集静态分析、单元测试、集成测试于一体的软件智能测试一体化工具——SmartRocket TestGrid 嵌入式软件自动化测试平台,支持不同等级的结构化覆盖测试要求,并对目标及环境进行适配。工具遵循GJB8 114、GJB 5369、GJB-Z-141、GJB 438B/C以及GJB 5000等标准。能够全面覆盖软件测试的各个阶段,包括测试策划、测试设计和实现、测试执行以及测试总结。其静态分析功能作为静态分析领域的前沿工具,深度融合上下文敏感与路径敏感的数据流分析技术,在保证执行效率的同时显著提升缺陷检测精度。通过构建跨函数边界的变量状态传播模型,TestGrid可精准识别C/C++语言中由复杂控制流导致的空指针异常、资源泄漏等问题,助力开发者快速定位缺陷位置,确保软件的功能安全。

wKgZPGe1exaAc0JCACs-YSEi8tQ518.png

SmartRocket TestGrid

嵌入式软件自动化测试平台

通过运用先进的测试技术和方法,自动化和简化测试流程,进一步保障了软件开发过程中的高可靠性、高安全性和高实时性。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • 数据流
    +关注

    关注

    0

    文章

    129

    浏览量

    15660
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    实验室·基于MQTT协议的模糊测试研究

    作者 |  张渊策 上海控安可信软件创新研究院工控网络安全组 来源 |  实验室 社群 |  添加微信号“ TICPShanghai ”加入“上海控安51fusa安全社区” 随着物联网技术
    的头像 发表于 07-30 15:21 1353次阅读
    <b class='flag-5'>鉴</b><b class='flag-5'>源</b><b class='flag-5'>实验室</b>·基于MQTT协议的模糊测试研究

    实验室整体解决方案是什么?

    服务三部分。创盟是中国首家提出实验室整体解决方案这一概念的公司。如需了解更多实验室相关信息请联系苏州创盟实验室
    发表于 08-11 10:34

    [封装失效分析系列之一] 封装级别失效分析实验室

    以往经验,一个较完善的自有实验室完全可以解决掉大约95%的案子。那么什么样的失效分析实验室才是合格的呢?光有好设备是不够的,还要有像样的技术和配套的管理,也就是失效
    发表于 07-18 22:29

    Kilby实验室大揭秘

    达拉斯、硅谷和印度分别设立了Kilby实验室,以延续这种创新。Kilby实验室的创新者对他们的项目会进行严格检查分析,当Kilby实验室
    发表于 07-16 04:45

    嵌入式C语言程序软件缺陷怎么查找?

    基于模式的静态代码分析、运行时内存监测、单元测试以及数据流分析等软件验证技术是查找嵌入式C语言程序/软件
    发表于 11-04 07:06

    锂电材料截面制样-氩离子抛光CP离子研磨 金实验室分享(下)

    锂电池正极片氩离子抛光(CP离子研磨)制样后效果图(正极片氩离子抛光制样后效果图-如上图所示-金实验室罗工提供)锂电池负极片氩离子抛光(CP离子研磨)制样后效果图(负极片氩离子抛光制样后效果图-如上图所示-金
    发表于 12-16 15:47

    lims实验室管理系统是什么?实验室信息管理系统介绍!

    和相关信息。此外,您可以更快地产生可靠的结果,并且可以跟踪来自测序运行随时间和跨实验数据以提高效率。现代基因组学产生了前所未有的数据量。面对不断增加的数据量和样本吞吐量以及
    发表于 11-03 11:17

    实验室lims系统解决方案

    在当今时代,大多数企业需要存储大量数据才能有效运行,而在辛勤工作的实验室,这一点最为真实。随着技术的进步,我们在实验室中保存的
    发表于 11-04 11:18

    基于数据流的Java字节码分析

    本文基于数据流框架理论,提出了如何将数据流分析方法应用于JAVA 字节码,通过建立数据流与半格、数据流
    发表于 12-25 13:22 9次下载

    实验室设计指南

    实验室设计指南LBSALE[1000]LBSALE第一章 基础知识主要内容:实验室基础知识及日常管理实验室基本操作技术分析
    发表于 11-09 15:43 1871次阅读

    高校实验室综合管理系统:建立一个安全、智慧、规范的实验室

    日,教育部办公厅发布《关于进一步加强高校教学实验室安全检查工作的通知》等相关文件要求,要求学校建立学校、二级单位和实验室组成的三级联动实验室管理体系;
    发表于 04-09 09:46 1676次阅读

    广东金实验室科技有限公司介绍

    实验室是一家专注于第三代半导体氮化镓和碳化硅芯片和器件失效分析的新业态的科研检测机构,具备国家认可及授权的CMA/CNAS资质,并且是工信部认定的“国家中小企业公共服务示范平台”,广东省工信厅
    发表于 11-25 17:19 2162次阅读
    广东金<b class='flag-5'>鉴</b><b class='flag-5'>实验室</b>科技有限公司介绍

    高精度电流在电子实验室的应用

    高精度电流是一种能够提供恒定、稳定电流输出的设备,被广泛应用于电子实验室。电子实验室是电子工程师进行实验、测试和研发的场所,而高精度电流
    的头像 发表于 06-12 09:13 1108次阅读
    高精度电流<b class='flag-5'>源</b>在电子<b class='flag-5'>实验室</b><b class='flag-5'>中</b>的应用

    实验室协助鸿利智汇产品顺利通过AEC-Q102认证

    实验室
    的头像 发表于 08-18 09:43 1412次阅读
    金<b class='flag-5'>鉴</b><b class='flag-5'>实验室</b>协助鸿利智汇产品顺利通过AEC-Q102认证

    实验室·ISO 26262测试用例的得出方法-等价类的生成和分析

    作者 | 李伟 上海控安安全测评部总监 来源 |  实验室 社群 | 添加微信号“ TICPShanghai ”加入“上海控安51fusa安全社区”   在ISO 26262-6-2018
    的头像 发表于 07-30 15:37 1337次阅读
    <b class='flag-5'>鉴</b><b class='flag-5'>源</b><b class='flag-5'>实验室</b>·ISO 26262<b class='flag-5'>中</b>测试用例的得出方法-等价类的生成和<b class='flag-5'>分析</b>