一种路径敏感的静态缺陷检测方法
缺陷检测方法以及缺陷检测系统与流程
缺陷检测方法以及缺陷检测系统与流程随着技术的不断发展,各种复杂的软硬件系统越来越多地应用于各个领域。
然而,由于软硬件系统存在着各种缺陷,这些缺陷可能导致系统的不稳定、性能低下、资源浪费甚至安全问题。
因此,针对软硬件系统进行缺陷检测和修复显得尤为重要。
缺陷检测方法缺陷检测方法是指通过一系列技术手段对软、硬件系统进行检测,发现并定位其中存在的缺陷或漏洞,从而提高系统的质量和可靠性。
典型的缺陷检测方法包括以下几种。
静态分析静态分析是指在不执行程序的情况下对代码进行分析,从而发现其中的缺陷。
静态分析通常利用一些工具,如PMD、FindBugs、Checkstyle等,来进行实现。
静态分析的技术可分为控制流分析和数据流分析两大类。
控制流分析主要考察代码的执行流程,在此基础上检测出一些不符合逻辑的程序路径和潜在问题。
数据流分析则是检查代码中涉及到的数据流,尤其是数据流的定义和使用,以此发现存在的缺陷。
动态测试动态测试是指在运行程序的情况下对其进行测试,用于发现系统中潜在的缺陷。
动态测试的典型实现方法包括黑盒测试、白盒测试、灰盒测试等。
其中,黑盒测试主要强调系统是否能够正确地支持各种用户输入和请求,白盒测试则主要强调程序内部的执行流程以及数据状态等,灰盒测试是两者的结合体,综合考虑了两者各自的优势。
模型检验模型检验是指使用数学模型和形式化方法来检验软硬件系统的正确性和健壮性。
常见的模型检验方法包括模型检测、形式化验证和语义分析等。
模型检测是一种基于有限状态自动机(FiniteState Automaton, FSA)或有向图(Directed Acyclic Graph, DAG)的技术,其主要思想是对系统的状态空间进行穷举,以判断系统是否满足某些性质。
形式化验证则是通过构建系统的形式化规范,根据这些规范对系统行为进行检查,从而发现其中的问题。
语义分析则是通过对程序代码进行解析,构建抽象语法树(Abstract Syntax Tree, AST)来发现代码中存在的语义错误。
基于静态分析技术的代码缺陷检测研究
基于静态分析技术的代码缺陷检测研究随着计算机技术的不断发展,各种软件系统的应用让我们的生活和工作愈发依赖于代码的正确性和可靠性。
而计算机程序中的缺陷往往会导致系统的崩溃、数据错误等问题,给用户造成诸多不便。
因此,代码缺陷检测技术的研究和发展显得尤为重要。
在过去的几十年中,代码缺陷检测技术得到了飞速的发展,其中一种较为成熟的方法是基于静态分析技术的代码缺陷检测。
静态分析是指在不执行程序的情况下,对其源代码进行分析的过程,通常包括语法分析、数据流分析、控制流分析等多个步骤。
通过静态分析技术可以捕获代码中的潜在缺陷,如未初始化变量、内存泄漏、空指针引用等问题,提高代码的质量和可靠性。
静态分析技术的基本思想是对源代码进行分析,找出其中可能存在的问题。
与传统的动态分析技术相比,静态分析技术不需要实际运行程序,因此可以检测到一些动态分析方法无法发现的问题。
静态分析技术的主要方法包括程序切片、符号执行、模型检验等。
程序切片是指将程序的某个片段(如函数或语句)从整个程序中切分出来,将分离出来的代码和与它相关的代码、数据和控制流信息一起构成一棵树,通过对该树进行分析,可以发现代码中存在的潜在缺陷。
程序切片技术通常用于定位程序的错误,如死循环和空指针引用等。
符号执行是一种模拟程序执行过程的方法,通过给程序中变量赋予不同的符号值,对程序进行模拟执行,并通过对执行过程中产生的约束条件进行求解,寻找程序中存在的缺陷。
符号执行技术能够发现程序中的逻辑漏洞、数组越界等问题。
模型检验是一种通过建立程序的形式模型,对模型进行验证,以发现程序中的错误的方法。
模型检验技术能够检测到的问题包括程序的死锁、数据竞争、内存泄漏等问题。
尽管基于静态分析技术的代码缺陷检测已经取得了很大的进展,但这种技术还存在一些局限性。
其中一个主要问题是误报率高,即可能产生大量的假阳性警报。
误报率高使得代码分析的结果难以得到开发人员的认可,也增加了开发人员排查代码缺陷的难度。
提高静态缺陷检测精度方法
提高静态缺陷检测精度方法I. 引言- 问题背景- 目标和意义II. 相关技术综述- 静态缺陷检测方法- 存在的问题和挑战- 已有的精度提高方法III. 方法一:数据增强- 数据增强的原理和步骤- 实验设计和结果分析IV. 方法二:深度学习模型- 深度学习模型的优势和应用范围- 常用深度学习模型在静态缺陷检测中的应用- 实验设计和结果分析V. 方法三:组合检测器- 组合检测器的原理和设计- 常用的组合检测器方法- 实验设计和结果分析VI. 实验结果和分析- 对比三种方法的精度和效率- 分析各种方法的优缺点VII. 结论和展望- 结论总结- 未来发展方向和研究价值参考文献I. 引言随着软件规模的不断增大,软件的复杂度也不断增加,同时软件缺陷也越来越难以避免和处理。
其中静态缺陷是一种常见的缺陷类型,其包括死代码、空指针引用、资源泄露等,通常可以通过静态分析工具进行检测。
静态分析是一种通过分析源代码本身来查找代码错误和潜在漏洞的技术,它不需要执行代码,也不需要进行动态测试,因此通常能够更早地发现缺陷问题。
静态分析工具的检测结果对软件质量的保证有着至关重要的作用。
不过,尽管静态分析技术已经不断发展并且在工业界已广泛应用,但是静态缺陷检测依然存在精度不高的问题。
一方面,静态缺陷检测的误报率普遍偏高,误报率高不仅导致开发人员需要花费大量时间处理无意义的报告,而且会因为过多无意义的报告降低开发人员对静态检测工具的信任度。
另一方面,静态缺陷检测的漏报率也不容忽视,因为只要有一个漏洞没有被检测出来,整个软件的质量也将难以保证,甚至可能导致严重的问题。
为解决静态缺陷检测的精度问题,近些年来,学者们提出了众多的方法和思路,例如引入数据增强、采用深度学习模型以及使用组合检测器等等,这些方法都取得了一定的成效,同时也存在着各自的限制和问题。
因此,本文将针对静态缺陷检测的精度问题,提出一种综合考虑多种因素的精度提高方法,包括数据增强、深度学习模型和组合检测器。
软件测试中基于静态分析的错误检测方法
软件测试中基于静态分析的错误检测方法在软件开发过程中,错误的检测和修复是至关重要的。
有时,错误可能会导致系统崩溃、数据泄露或安全漏洞。
因此,软件测试起着至关重要的作用,帮助开发人员及时发现和修复潜在的错误。
软件测试有很多方法,其中基于静态分析的错误检测方法是一种常用且有效的方法。
静态分析是通过分析程序源代码或二进制代码的结构和语义来发现错误的方法。
与动态测试相比,静态分析的优势在于不需要运行程序,可以提前发现潜在的错误,并且能够覆盖到程序的所有执行路径。
下面将介绍几种常见的基于静态分析的错误检测方法。
第一种基于静态分析的错误检测方法是语法检查。
语法检查是指检查程序的语法结构是否符合语言规范的方法。
它可以帮助开发人员在编译前发现潜在的语法错误,并提供相关的错误提示。
常见的语法检查工具有编译器和集成开发环境(IDE)中的语法检查功能。
通过在开发过程中使用语法检查工具,开发人员可以在源代码级别避免一些常见的语法错误,从而减少后续测试中的错误数量。
第二种基于静态分析的错误检测方法是代码规范检查。
代码规范检查是指检查代码是否符合编码规范和最佳实践的方法。
不符合编码规范和最佳实践的代码可能导致代码难以理解、维护困难以及潜在的错误。
常见的代码规范检查工具有Checkstyle、FindBugs和PMD等。
这些工具可以帮助开发人员在编码阶段发现和修复潜在的问题,提高代码的质量和可靠性。
第三种基于静态分析的错误检测方法是数据流分析。
数据流分析是指分析程序中的数据流,以确定变量的值和使用是否符合预期的方法。
数据流分析可以帮助开发人员发现潜在的数据竞争、内存泄漏和空指针异常等错误。
常见的数据流分析工具有FindBugs、PMD和Coverity等。
这些工具通过静态分析程序的代码路径和变量的使用情况,可以发现一些难以在动态测试中发现的错误。
第四种基于静态分析的错误检测方法是模型检验。
模型检验是一种形式化方法,通过建立系统的模型并对模型进行验证来发现错误。
静态测试方法在大型软件项目中的实践
静态测试方法在大型软件项目中的实践一、静态测试方法概述静态测试方法是一种在软件测试领域中广泛应用的技术,它指的是在不运行软件程序的情况下,通过分析软件的代码、设计文档、需求说明等静态信息来发现潜在的缺陷和问题。
这种方法具有成本低、效率高、易于自动化等优点,尤其适用于大型软件项目,因为大型项目往往涉及复杂的系统架构和庞大的代码库,静态测试可以有效地辅助动态测试,提高软件质量。
1.1 静态测试方法的核心特性静态测试方法的核心特性包括以下几个方面:- 无需执行程序:静态测试不需要运行软件程序,因此可以在软件开发的早期阶段进行。
- 覆盖面广:静态测试可以覆盖软件的各个方面,包括代码质量、设计一致性、需求满足度等。
- 自动化程度高:许多静态测试工具可以自动执行测试,减少人工干预,提高测试效率。
- 成本效益高:与动态测试相比,静态测试通常成本较低,因为它不需要构建测试环境或执行测试用例。
1.2 静态测试方法的应用场景静态测试方法的应用场景非常广泛,包括但不限于以下几个方面:- 代码审查:通过人工或自动化工具检查代码的规范性、一致性和潜在缺陷。
- 设计审查:评估软件设计是否符合需求和设计原则,是否存在设计缺陷。
- 文档审查:检查需求文档、设计文档等是否清晰、一致,是否满足项目要求。
- 配置管理:确保软件配置项的一致性和完整性,避免配置错误。
二、静态测试方法的实施策略静态测试方法的实施是一个系统化和规范化的过程,需要结合大型软件项目的特点进行策略制定。
2.1 静态测试方法的实施步骤静态测试方法的实施步骤主要包括以下几个阶段:- 需求分析:明确软件项目的需求,为静态测试提供目标和依据。
- 测试计划制定:根据项目需求和特点,制定详细的静态测试计划。
- 工具选择与配置:选择合适的静态测试工具,并进行配置以适应项目需求。
- 测试执行:按照测试计划执行静态测试,包括代码审查、设计审查等。
- 结果分析:对静态测试的结果进行分析,识别关键缺陷和风险。
软件学报2010年第2l卷总目次
( 4 8) ( 8 9) (0 ) 17 (1) 19 (3 ) 13 (4 ) 17 (6 ) 13
可信 软件 的构造 与演化 分析专 刊前言 … … … … … … … … … … … … … … 一 怀 民 徐 洁 王 面 向高可信软件 的整数 溢 出错 误 的 自动 化测试 … … … … 卢锡城 李 根 卢 凯 张 荚 种 资源敏感 的 We b应用性 能诊断方 法 … … …王 伟 张文博 魏 峻 钟 华 黄 涛 种路 径敏感 的静态缺 陷检测 方法 … … … … … 肖 庆 宫云战 杨朝 红 金 大海 王雅 文 可扩展 的 多周 期检查 点设置 … ……… ………… ・慈轶 为 张 展 左德 承 吴智 博 杨孝 宗 - 基于 P t 网的服务组 合故 障诊 断与 处理 … … … … … … 范贵生 虞 慧群 陈丽琼 刘冬梅 ei r 基于 动态描述逻 辑 的网构软件 系统故 障诊 断 …… … … …… … … …王 竹晓 杨 鲲 史忠植 基于服 务组合 的可信 软件动态 演化机制 … … … 曾 晋 孙 海龙 刘旭 东 邓 婷 怀进 鹏 种 面 向服 务的可靠 多媒体传 输算法 … … … … … … … … … … … 张 胜 钱柱 中 陆桑璐
(2 ) 47
种 宋词 自动生成 的遗传算法及其机器 实现… … … … … … … … …周 昌乐 游 维 丁 晓君 基于动态概率路径事件模 型的 R I F D数据 填补算法… … _ 谷 峪 于 戈 李晓静 王 义 。 种基 于特 征捆绑计算模型 的物体识 别方法… … … … … - 曦 史忠植 石 志伟 施智平 刘 多线程程序时序分析 的隐 Mak v模 型… … … -孔德 光 谭 小彬 奚宏 生 帅建梅 宫 涛 ro 。 传感器网络中基于蚁群算法 的实时查询 处理… … … … … …… … … … … … ’ 建平 林亚平 余
基于静态代码分析的软件安全缺陷检测技术
基于静态代码分析的软件安全缺陷检测技术软件安全一直是互联网时代的重要课题之一。
随着软件的广泛应用和大规模开发,软件安全问题也变得愈发突出。
为了确保软件的稳定性和安全性,静态代码分析技术被广泛应用于软件安全缺陷的检测与修复。
静态代码分析是一种通过分析源代码的结构和语义规则来检测软件安全缺陷的方法。
与动态测试不同,静态代码分析可以在软件运行之前进行,帮助开发人员及早发现和修复软件中的安全问题,以防止这些问题在实际运行过程中造成严重后果。
静态代码分析技术基于对源代码的语法和语义的分析,通过静态分析器对源代码进行扫描,检测并报告可能存在的软件安全缺陷。
常见的静态代码分析工具包括Coverity、FindBugs、PMD等。
静态代码分析技术可以帮助开发人员发现各种常见的软件安全缺陷,例如缓冲区溢出、空指针引用、逻辑错误、代码注入等。
这些缺陷可能导致程序异常、崩溃、数据泄露、远程代码执行等安全漏洞,并可能被恶意攻击者利用进一步侵入系统或获取敏感信息。
静态代码分析技术的优势在于早期发现和修复软件安全问题,减少软件开发中的安全漏洞。
与传统的人工代码审查相比,静态代码分析可以自动化进行,大大提高了效率和准确性。
静态代码分析可以应用于大型软件项目,无需手动测试所有路径,大大缩减了测试成本和时间。
然而,静态代码分析技术也存在一些局限性。
分析器可能会产生误报和漏报。
由于静态代码分析无法模拟程序的实际运行环境,因此可能会误判一些合法的代码,或者漏掉一些存在的潜在问题。
静态代码分析工具需要准确的编译环境和代码库支持,否则可能无法正确分析代码。
静态代码分析只能发现已知的安全漏洞,无法发现未知的漏洞。
为了提高静态代码分析技术的效果和可靠性,可以考虑以下几点。
开发人员需要了解和熟悉静态代码分析工具的使用方法和规则,以确保正确使用分析工具。
需要建立完善的代码审查机制和流程,将静态代码分析技术与人工审查有机结合,提高代码质量和安全性。
智能合约代码漏洞静态检测方法与工具
智能合约代码漏洞静态检测方法与工具智能合约是一种基于区块链技术的智能化合约,它可以自动执行合同中规定的条件和操作。
然而,由于智能合约的编写过程中往往存在漏洞和错误,这就给区块链网络的安全性带来了威胁。
为了保障智能合约的安全性和可靠性,我们需要进行静态检测,以发现并修复其中的代码漏洞。
一、静态检测方法静态检测是指在代码运行之前对代码进行分析和检查的一种方法,它可以查找和预测代码中可能存在的安全隐患和漏洞。
针对智能合约代码的静态检测方法主要包括以下几种:1. 静态分析:通过对智能合约代码进行语法分析和语义分析,检查代码中的潜在问题和漏洞。
静态分析可以检测出一些常见的漏洞模式,例如重入攻击、溢出漏洞等。
通过构建静态分析规则和模式匹配,可以有效减少代码漏洞。
2. 模型验证:通过对智能合约代码进行建模和验证,验证代码中的行为是否符合安全性要求。
模型验证的方法主要有形式化验证和模型检测。
形式化验证以数学方法为基础,通过定义模型和安全性属性,验证代码的正确性。
模型检测则通过对有限状态机进行自动化遍历,找出状态图中的安全漏洞。
3. 符号执行:通过对智能合约代码进行符号执行,执行所有可能的代码路径,并在执行过程中发现潜在的漏洞。
符号执行能够覆盖全部的代码路径,能够发现未经探测的漏洞。
二、静态检测工具为了方便开发者进行智能合约代码漏洞的静态检测,目前有许多静态检测工具可以使用。
以下是几个常用的静态检测工具:1. Mythril:Mythril 是一个开源的以太坊智能合约漏洞检测工具。
它使用静态分析技术,能够发现并报告智能合约中的漏洞和潜在问题。
Mythril支持多种漏洞检测模式,并提供了命令行和图形界面两种使用方式。
2. Oyente:Oyente 是一个开源的以太坊智能合约静态分析工具。
它能够检测智能合约中的多个常见漏洞,如整数溢出、未经授权的转账等。
Oyente使用了模式匹配和符号执行等技术进行漏洞检测,并提供了命令行和图形界面两种使用方式。
轨道设备静态质量评价方法及现场运用
轨道设备静态质量评价方法及现场运用一、引言轨道设备是铁路运输系统的重要组成部分,它的质量直接关系到铁路运输的安全和顺畅。
而轨道设备的静态质量评价方法及现场运用是确保轨道设备安全可靠的重要手段。
本文将对轨道设备静态质量评价方法及其现场运用进行探讨。
二、轨道设备静态质量评价方法1.超声波检测技术超声波检测技术是一种常用的轨道设备静态质量评价方法,它通过超声波探头对轨道设备进行扫描,检测出其中的缺陷和杂质。
超声波检测技术可以对轨道设备的内部进行评价,发现潜在的质量问题,为后续的维护和修复提供重要的参考依据。
2.磁粉探伤技术磁粉探伤技术是一种利用磁粉检测轨道设备表面裂纹、疲劳等缺陷的方法。
它适用于各种材料的轨道设备,可以快速、准确地发现质量问题,为轨道设备的使用提供重要的安全保障。
3.热图检测技术热图检测技术是一种利用红外相机对轨道设备进行热图监测的方法。
通过热图检测,可以清晰地看到轨道设备表面的温度分布情况,发现可能存在的故障点和质量问题。
热图检测技术具有非接触、高效率的特点,可以对大面积的轨道设备进行评价,为维护和保养提供重要的数据支持。
4.探伤设备检测探伤设备是一种常见的轨道设备静态质量评价工具,它可以使用X 射线、γ射线等方式对轨道设备进行全面的探测。
探伤设备具有高灵敏度、高分辨率的特点,可以发现微小的质量问题,是一种非常有效的静态质量评价方法。
5.振动监测技术振动监测技术是一种通过振动传感器对轨道设备进行振动监测的方法,通过监测轨道设备的振动情况,可以了解其结构的稳定性和可靠性,发现可能存在的质量问题。
振动监测技术可以实时监测轨道设备的工作状态,及时发现并解决潜在的问题。
三、轨道设备静态质量评价现场运用1.数据采集在进行轨道设备静态质量评价现场运用时,首先需要进行数据采集。
通过各种检测设备和传感器对轨道设备进行全面的检测和监测,获得大量的数据和图像。
2.数据处理获得数据后,需要对其进行处理和分析。
软件测试中基于静态分析的缺陷检测研究
软件测试中基于静态分析的缺陷检测研究在软件开发过程中,软件测试是不可或缺的一个环节。
软件测试的目的是尽可能地找出软件中的缺陷,以便在软件发布前修复这些缺陷。
为了提高软件测试的效率和质量,静态分析技术逐渐在软件测试中得到了广泛应用。
本文将介绍基于静态分析的缺陷检测研究,包括静态分析的定义、应用场景、静态分析工具以及未来的发展方向。
一、静态分析的概念和应用场景静态分析是指在不运行程序的情况下,对程序进行分析的一种技术。
这种分析方法通过检查程序的源代码或者中间表示形式来找出其中可能存在的错误。
与之相对的是动态分析,而动态分析需要运行程序。
静态分析可以应用于不同的技术领域,如编译器优化、代码重构、代码检查、安全分析等。
在软件测试中,静态分析的主要应用场景是代码质量分析和缺陷检测。
通过静态分析对代码进行分析,可以发现其中存在的潜在错误和不符合规范的代码风格等问题。
通过发现问题并及早修复,可以提高软件质量和开发效率,减少成本和时间。
二、静态分析工具静态分析工具是实现静态分析的软件工具。
这些工具通常会对程序进行语法和语义分析,并生成相关的报告。
下面介绍几种常见的静态分析工具。
1. LintLint是第一代的静态分析工具之一,最初由贝尔实验室的代码维护小组开发。
它主要用于代码风格分析和错误检测。
它的检测能力很强,可以检测出一些难以发现的代码缺陷。
但是它只支持C语言和C++语言。
2. CoverityCoverity是一款商业化的静态分析工具,主要用于企业级应用的缺陷检测。
它的检测能力很强,可以发现一些难以发现的缺陷,例如内存溢出、空指针解引用等。
Coverity支持多种编程语言,包括C、C++、Java、C#等,并具有良好的跨平台性能。
3. FindBugsFindBugs是一款开源的静态分析工具,主要用于Java程序的缺陷检测。
它可以发现一些潜在的问题,例如空指针异常、未初始化的变量等。
FindBugs使用基于规则的方法进行缺陷检测,可以自定义规则进行检测。
二进制程序安全缺陷静态分析方法的研究综述
Program info. Recovery
.{ldimess砷-e
●
header table
l竺唑k
臣外
compiler
川毋
叫=三P
_{竺!■卜
Relocation Symbol Unk盯 Debug
C—onsU。c。fi叫on l}
P
I…Mod吨el
Symbolic excution
乒
iⅡsPr劬og。ra。m.1
本文受863计划重点项目(2007AA010601),国家自然科学基金(60673022),北京市科委项目
田t匾(1986~),女,硕博研究生。主要研究方向为程序安全性分析等,E-mail:tianshu09@gmaik COITI;粱洪亮(1976一),男,副研究员,硕士生导 师,主要研究方向为系统软件关键核心技术、基础软件高可信技术、移动系统及其安全理论与方法等。 ・8・
into expressive and generic research direction. representation,Disassemble
ming program information
the analysis and Keywords
as a
intermediate
representation was
静态分析方法能够保证程序的所有执行路径得到检测而不局限于特定的执行路径静态分析可以在执行之前验证程序的安全性进而在运行程序前检验程序安全性修补程序安全漏洞不会产生程序运行开销节介绍目前主要的分析方法最后是总结研究现状并展望二进制程序安全分析的研究方向二进制程序的结构和特点可执行程序生成过程如图所示高级语言程序者汇编程序经过编译汇编处理生成的二进制目标文件关目标文件经过连接器linker连接得到可执行程序
软件测试-静态测试
本ppt课件仅供学习使用 本ppt课件仅供学习使用 本ppt课件仅供学习使用
学习完毕请自行删除
LOGO
静态测试编码标准
一个工程或者一个企业,如果要下决心实施软件质量,实施软件工程,第 一步要做的就是软件编码标准。编码标准是程序编写过程中必须遵循的规那么, 一般会详细规定代码的语法规那么、语法格式等。企业实施怎样的编码标准, 取决于很多个因素:l编程采用的语言,例如C、C++、JAVA、ADA等。工程 的标准化程度。目前现成的C/C++编码标准有很多,例如前几年网络上比较 流行的?华为公司编程标准?、?摩托罗拉C+编程标准?等。但工程不能完全照 搬,应该根据自己所处的阶段,定制属于自己的标准,否那么的话,会让程序 员无所适从,严重打击程序员的积极性。
第二章:软件测试概述
软件测试的定义和实质
软件测试的定义:
GrenfordJ.Myers曾对软件测试的目的提出过以下观点: (1)测试是为了发现程序中的错误而执行程序的过程; (2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案; (3)成功的测试是发现了至今为止尚未发现的错误的测试。 然而,这种观点指出测试是以查找错误为中心,而不是为了演示软件的正确功能.但 是只从字面意思理解,可能会产生误导,认为发现错误是软件测试的唯一目的,查找 不出错误的测试就是没有价值的测试,实际上并非如此! (1)测试并不仅仅是为了找出错误.通过分析错误产生的原因和错误的发生趋势,可 以帮助工程管理者发现当前软件开发过程中的缺陷,以便及时改进; (2)这种分析也能帮助测试人员设计出有针对性的测试方法,改善测试的效率和有效 性; (3)没有发现错误的测试也是有价值的,完整的测试是评定软件质量的一种方法
一种有效的静态缺陷函数检测框架
第 6期
指挥 信 息 系统 与 技 术
Co mma d I f r to y t m & Te h o o y n n o ma i n S s e c n lg
Vo1 N o. .1 6
De .2 0 e O1
21 0 0年 1 2月
・
软 件测试 ・
一
( C l g fCo 3 o l eo mma dAu o ain。P e n tm to LAUS Na j g 2 0 0 , ia T, ni 1 0 7 Chn ) n
( Th g s is De a t n fS a d n i t r g o Jn n M i t r g o J n n 2 0 1 C i a 4 e Lo it p r me to h n o g M l a y Re i n, i a l a y Re i n, ia 5 0 3, h n ) c i i
An Ef e tv a e f c i e Fr m wo k o t tc Vul r b e Fu to t c i n r f S a i ne a l nc i n De e to
Hu n o g J e g u Hu h n i Ge Ya a gS n i M n y i a we Z n
Ab ta t sr c :A lh g he e a e m a e ho s a d t o s ofs a i u ne a l un to t c i o t ou h t r r ny m t d n o l t tc v l r b e f c i n de e ton f r us n t e p o e s ofs t r e e o e i h r c s ofwa e d v l pm e t t y h v h i i ia i ns Be ie t e o i e n n , he a e t e r lm t to . sd s, h y pr v d o s p r o h l c b e tng i he l t rs a e o ofw a e d v l pm e . n t i a r, a e u po tf r t e b a k— ox t s i n t a e t g fs t r e e o nt I h s p pe b s d
一种基于CIL静态分析的C#程序缺陷检测方法
Ab s t r a c t F i n d i n g p o t e n t i a l d e f e c t s b y s t a t i c a l l y d e t e c t i n g s o u r c e c o d e c a n h e l p p r o g r a mm e r s f i n d a n d f i x t h e d e f e c t s b e — f o r e t h e s o f t wa r e i s r e l e a s e d , a n d t h u s c a n i mp r o v e t h e s e c u it r y o f t h e s o f t wa r e . Th i s p a p e r p r o v i d e d a CI L s t a t i c a n a l y - s i s me t h o d t o d e t e c t d e f e c t s i n C# p r o g r a ms . We a d o p t e d a n mp i r o v e d d e p t h - f i r s t s e a r c h a l g o it r h m t o t r a v e r s e t h e c o n —
t r o l l f o w g r a p h o f t h e t a r g e t p r o g r m , a a n d c o mb i n i n g wi t h t h e s t r a t e g y o f c a c h i n g h i s t o r y s t a t e s , t h e p e fo r r ma n c e o f t h e
面向软件缺陷检测的静态分析技术
面向软件缺陷检测的静态分析技术3张 华(潍坊学院,山东 潍坊 261061)摘 要:软件开发过程中的一个重要原则就是缺陷发现的时间越早越好,如果能控制软件缺陷,就可以得到高质量的软件。
静态分析工具根据软件的结构、内容或文档来评价软件系统,而不需要执行程序。
因此,可以较早地发现程序代码中的缺陷,使得后面的软件开发阶段可以着重分析复杂功能以及算法的错误。
本文主要对使用静态分析技术检测软件缺陷的方法进行研究,讨论静态分析技术的现状和进展情况以及静态分析的特点。
关键词:软件质量保障;缺陷检测;静态分析中图分类号:TP311 文献标识码:A 文章编号:1671-4288(2008)02-0008-041 引言随着软件应用规模的日益扩大和软件应用环境的日益复杂,因为软件质量导致的事故越来越多,后果也越来越严重,比如I B M360操作系统的失败,阿丽亚娜号航天火箭的爆炸等。
因此软件质量成为人们关注的焦点。
软件质量保障是个系统的活动,贯穿整个软件开发过程,它的一个重要原则就是缺陷发现的时间越早越好,缺陷被遗漏到下一阶段将使得修复缺陷的成本扩大到原来的5-10倍,甚至造成无法修复的局面。
如果能控制软件缺陷,就可以得到高质量的软件。
静态分析工具根据软件的结构、内容或文档来评价软件系统,而不需要执行程序。
因此,可以较早地发现程序代码中的缺陷,这使得后面的软件开发阶段可以着重分析复杂功能以及算法的错误。
静态分析工具可以在软件工程人员审查、测试之前查找软件中的缺陷,也可结合到整个软件开发过程中。
2 静态分析和人工审查、动态测试的比较检测代码缺陷有多种方法,人工审查是其中的一种有效的方法。
但是人工审查很耗时,而且审查人员必须首先了解软件缺陷是什么样然后才能很好地检查软件代码。
相比之下,静态分析工具就更受欢迎了,因为它们的执行速度要快得多。
而且静态检查工具可以自动检查软件缺陷,因此可以大大节省人工劳动,并且工具使用者不需要像审查人员那样具有很多专业知识。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ISSN 1000-9825, CODEN RUXUEW E-mail: jos@Journal of Software, Vol.21, No.2, February 2010, pp.209−217 doi: 10.3724/SP.J.1001.2010.03782 Tel/Fax: +86-10-62562563© by Institute of Software, the Chinese Academy of Sciences. All rights reserved.∗一种路径敏感的静态缺陷检测方法肖庆1+, 宫云战1, 杨朝红1,2, 金大海1, 王雅文11(北京邮电大学网络与交换技术国家重点实验室,北京 100876)2(装甲兵工程学院信息工程系,北京 100072)Path Sensitive Static Defect Detecting MethodXIAO Qing1+, GONG Yun-Zhan1, YANG Zhao-Hong1,2, JIN Da-Hai1, WANG Ya-Wen11(State Key Laboratory of Networking and Switching Technology, Beijing University of Posts and Telecommunications, Beijing 100876,China)2(Department of Information Engineering, Academy of Armored Force Engineering, Beijing 100072, China)+ Corresponding author: E-mail: 2722976@Xiao Q, Gong YZ, Yang ZH, Jin DH, Wang YW. Path sensitive static defect detecting method. Journal ofSoftware, 2010,21(2):209−217. /1000-9825/3782.htmAbstract: This paper presents a new path sensitive algorithm for static defect detecting running in polynomialtime. In this method, property state conditions are represented by abstract domain of variables, and infeasible pathscan be identified when some variables’ abstract value range is empty. This method avoids the combination explosionof full path analysis by merging the conditions of identical property state at join points in the CFG (control flowgraph). This algorithm has been implemented as part of a defect testing tool called DTS (defect testing system).Practical test results show that this method can reduce false positive.Key words: defect detecting; static analysis; path sensitive; dataflow analysis; program analysis摘要: 提出一种多项式复杂度的路径敏感静态缺陷检测算法.该方法采用变量的抽象取值范围来表示属性状态条件,通过属性状态条件中的变量抽象取值范围为空来判断不可达路径.在控制流图(control flow graph,简称CFG)中的汇合节点上合并相同属性状态的状态条件,从而避免完整路径上下文分析的组合爆炸问题.该算法已应用于缺陷检测系统DTS(defect testing system).实际测试结果表明,该方法能够减少误报.关键词: 缺陷检测;静态分析;路径敏感;数据流分析;程序分析中图法分类号: TP311文献标识码: A软件代码中的缺陷是导致软件故障和漏洞问题的重要原因.基于缺陷的软件测试技术可以分为动态检测技术和静态检测技术.静态检测技术不运行被测程序,主要通过各种静态分析方法来发现程序中的缺陷.从可计算性理论的角度来看,静态分析是一个不可判定问题.Rice定理[1]表明,静态分析不能完美地确定一般程序的任何非平凡属性.静态分析的不可判定性实际上意味着任何自动化的静态分析系统,针对一个程序的非平凡属性∗Supported by the National High-Tech Research and Development Plan of China under Grant Nos.2007AA010302, 2009AA012404(国家高技术研究发展计划(863))Received 2009-06-11; Revised 2009-09-11; Accepted 2009-12-07210 Journal of Software软件学报 V ol.21, No.2, February 2010(例如是否存在运行时错误),不可能做到既是可靠的又是完备的.可靠的(sound)静态分析意味着,如果分析结果没有报告某类运行时错误,则程序中肯定不存在某类运行时错误,也就是说没有漏报(false negative).完备的(complete)静态分析意味着,如果分析结果报告了某类运行时错误,则程序中肯定存在某类运行时错误,也就是说没有误报(false positive).大量的误报会使人对分析工具失去信心.静态分析的方法有很多,从路径抽象和近似的角度可以划分为路径敏感(path-sensitive)方法和路径不敏感方法(path-insensitive).路径敏感方法考虑分支间的组合关系,能够区分控制流图上的不同路径信息.与路径敏感方法相比,路径不敏感方法由于分析更加粗糙将会引入更多的误报.最直接和详细的路径敏感分析方法是完整路径分析.完整路径分析准确记录每条不同路径上的“程序执行状态”,将导致指数复杂度甚至无限的状态空间.本文提出了一种多项式复杂度的路径敏感算法,并将其应用于缺陷检测系统DTS(defect testing system).实际测试结果表明,该方法能够减少误报的产生.本文首先给出一个简单的例子说明路径不敏感分析将导致误报.然后,详细讨论数据流分析的3种典型解:IDEAL,MOP(meet over all paths)和MFP(maximal fixed point),指出不可达路径判断不准确和数据流信息“过早”聚合是导致路径分析精确性损失的原因.本文采用变量的抽象取值范围来表示属性状态条件,通过属性状态条件中的变量抽象取值范围为空来判断不可达路径,并基于相同属性状态的属性状态条件合并提出了一种多项式复杂度的路径敏感算法.最后,给出了10个大型开源程序的测试数据和结论.1 一个误报的例子程序的“时序安全属性(temporal safety properties)”是描述“某些坏的事情不会发生”的一类属性.通常,时序安全属性规定了一系列有序的事件,要求在程序中不能发生这些事件.如果静态分析工具在程序中发现了违反该安全属性的情况,则报告一个反例(counter example)[2].例如,资源申请后必须释放,否则将造成一个资源泄漏缺陷.该属性可用有限状态机来描述,如图1所示.对于路径不敏感分析,由于无法获取精确的路径上下文信息,静态分析工具在实际检测过程可能会产生误报.图2为一个可能会产生误报的例子.Other Anyvoid foo(boolean dump){FileOutputStream f=null;If (dump)f=new FileOutputStream(“test.txt”); /* open */ if (p)x=0;elsex=1;L1:if (dump)f.close(); /* close */L2:}Fig.1 Finite state machine of resource leak property 图1 资源泄漏属性有限状态机Fig.2 An example of false positive 图2 一个产生误报的例子上例中,路径不敏感分析不考虑不同的路径信息,属性状态机在L1位置上可能的状态集合为{start,opened},最终在L2位置处的可能状态集合为{start,opened,error},报告一个“反例”,这是一个误报.从函数入口到达程序L1位置共有4条可达路径,路径敏感分析将分别跟踪这4条路径的路径信息.路径信息可由变量取值表示,则在L1位置,属性状态机沿不同路径的可能到达的状态集合为{{start:dump=false,p=true,x=0,f=null},{start:dump=false,p=false,x=1,f=null},{opened:dump=true,p=true,x=0,f=notnull},{opened:dump=true,p=false,x=1,f=notnull}}.从L1到L2的条件判断为dump,由于状态集合中到达start状态的两条路径都要求dump=false,因此start 状态将无法传递到L1处判断条件的真分支中.同理,opened状态将无法传递到假分支中.变量取值矛盾表明,该状态在一条不可达路径上传递,该状态应该从可能状态集合中删除.则在L2位置,属性状态机可能到达的状态肖庆 等:一种路径敏感的静态缺陷检测方法211集合为{{start:dump =false,p =true,x =0, f =null},{start:dump =false,p =false,x =1, f =null},{closed:dump =true,p =true,x =0, f =notnull},{closed:dump =true,p =false,x =1, f =notnull}}.上例表明,路径敏感方法由于可以消除不可达路径,从而减少了误报的产生. 2 路径不敏感分析传统的基于迭代求解的数据流分析方法是路径不敏感的.数据流问题是一个元组〈L ,∧,F ,G ,FM 〉[3]:1. L 为需要传播和计算的值集合.2. ∧为L 上定义的聚合操作,〈L ,∧〉形成一个半格,包含⊥和F ,∧操作用于控制流汇合节点上将不同分支的值进行聚合.3. F 为L 到L 上的单调转换函数集合,代表程序语句对值的影响.4. G =(V ,E ,entry ,exit )为控制流图,V 为节点集合,E 为边的集合,entry 和exit 分别为控制流图中的唯一入口和唯一出口.5. FM :E →F 将E 中的边映射到F 中的转换函数.映射FM 也能被扩展到路径上,对于G 中路径p =[e 0,e 1,…,e n ],则f p :L →L : f p =FM (p )=FM (e n )°FM (e n −1)°…°FM (e 0),FM (e 0),FM (e 1),…,FM (e n )∈F ,因此,f p 仍为单调函数.数据流问题存在不同的解,其中典型的解包括:1. IDEAL:理想解,也称真实解.对程序入口到某程序点的所有实际可执行路径的尾端值取聚合(meet)操作,则得到理想解.求理想解是一个不可判定问题.2. MOP(meet over all paths):称为全路径聚合解.对程序入口到某程序点的所有路径的尾端值取聚合操作,则得到MOP 解.3. MFP(maximal fixed point):最大不动点解.所谓的最大不动点解是对控制流图上节点的数据流方程进行不断迭代最终收敛而得到的解.例如,前向(forward)可能(may)数据流计算方程有如下形式:()()(),()()(()()).s pred s In s Out s Out s Gen s In s Kill s ′∈′==∪−∪传统的基于迭代方法求得的即为MFP 解.求MFP 解有较低的复杂度,通常在实际中先对控制流节点排序再进行计算,可以认为其复杂度在O ((N +E )H )~O ((N +E )NH )之间[3].其中,N 为节点数,E 为边数,H 为〈L ,∧〉的高度.数据流分析的MFP 解可以认为是完整路径分析的一个不精确的保守近似,虽然避免了路径组合爆炸问题,但却牺牲了路径敏感性.MFP,MOP,IDEAL 三者之间的关系为MFP ≤MOP ≤IDEAL,其中,≤关系代表后者更加精确(前者更加保守).当F 中的转换函数满足分配性时,MFP=MOP.对上述3个解之间关系的直观理解如图3所示.Fig.3 Comparison of three kinds of solution of data flow problem图3 数据流问题的3个解的对比MFP 和MOP 的差异在于,MFP 在控制流汇合节点将不同分支的数据流信息“过早”地进行聚合;而MOP 将不同路径进行分别考虑,在最后才将不同路径的数据流信息进行聚合.因为L 为半格,有(x ∧y )≤x ,(x ∧y )≤y ;又f 为单212 Journal of Software 软件学报 V ol.21, No.2, February 2010调函数,则f (x ∧y )=f (x ∧y )∧f (x ∧y )≤f (x )∧f (y ),即MFP ≤MOP.当f 满足分配率时,f (x ∧y )=f (x )∧f (y ),即MFP=MOP.MOP 和IDEAL 的差异在于,MOP 考虑了控制流图上的所有路径;而IDEAL 只针对那些实际执行路径,将不可达路径排除在外.如图3所示,MOP 解为f (x )∧f (y ),IDEAL 解为f (y ).因为L 为半格,所以有f (x )∧f (y )≤f (y ),即MOP ≤IDEAL.3 DTS 采用的路径敏感分析方法下面讨论的属性都属于时序安全属性,并采用有限状态机描述.DTS 缺陷检测将属性状态机应用于程序分析过程中,计算每个程序位置上状态机的可能属性状态集合,如果可能属性状态集合中包含error 状态,则报告一个可能缺陷.如果把可能属性状态集合看作数据流要分析的值,可能属性状态集合上的并运算为数据流的聚合运算,则图1所示的属性检查问题即为一个数据流问题,其目标为得到该问题的IDEAL 解.而经过前述数据流问题的讨论可知,精确求IDEAL 解不现实,只能考虑近似保守解.基于迭代的数据流分析得到的MFP 解与IDEAL 解相比,其精确性的损失有两个来源:1) 不可达路径判断不准确;2) 对于不满足分配率的转换函数来说,在控制流汇合节点将不同分支的数据流信息“过早”地进行聚合.因此,提高数据流分析的精确性,可以从这两个角度进行考虑.为了既能减少误报又避免路径组合指数爆炸问题,本文提出一种基于数据流分析的路径敏感分析算法.我们先介绍一些概念:定义1. 在程序P 的执行过程中,程序的执行状态可由二元组〈 ,ρ〉表示,其中, 代表当前的程序执行位置,ρ代表该状态下的环境,程序环境记录了程序中当前每一个变量X 的值.在环境ρ下,变量X 的取值记作ρ(X ).我们采用变量的抽象取值区间来表示变量的可能取值范围[4].定义2. 程序通过路径S 执行到位置 ,则S 上的谓词和赋值操作对 处环境ρ中各变量的可能取值范围进行了限定.我们将S 在 处限定的变量取值范围集合称作S 在 处的路径条件,记作R (S , ).例如,在图4(a)中,对于dump 和flag ==1均取真值的路径S 1,在L 1处的路径条件为{dump [true], flag [1,1], f [notnull]}.Fig.4 Three examples [5]图4 3个例子[5]定义3. 程序通过路径S 执行到位置 ,属性状态机的状态沿S 进行传递和变化.在 处到达状态σ,将R (S , )记录在σ上,称为属性状态条件,包含条件的属性状态表示为{σ:R (S , )}.下面讨论的属性状态都是包含条件的,例如,在图4(a)中,对于dump 和flag ==1均取真值的路径S 1,在L 1处资源泄漏状态机的属性状态为{opened:dump [true],flag [1,1],f [notnull]}.属性状态条件是到达该属性状态的相关变量可能取值集合.它标记了能够到达当前属性状态的程序环境信息.属性状态条件可用于不可达路径判断.对属性状态条件的不同处理方式对应不同的复杂度:1) 如果所有属性状态条件都取空集,该方法就退化为针对可能属性状态集合的传统数据流分析,虽然具有较低的复杂度,但会有较高的误报.f =null; if (dump ) flag =1; else flag =0; L 1: if (dump ) f =open (...); L 2: if (flag ==1) close (f );L 3: f =null; if (dump ) f =open (...);if (dump ) flag =1; else flag =0; if (flag ==1) close (f ); f =null;if (dump ){f =open (...);flag =1;}elseflag =0;L 1: if (flag ==1)close (f ); (a) (c) (b)肖庆等:一种路径敏感的静态缺陷检测方法2132) 如果记录属性状态条件,并在所有控制流汇合节点上都不允许属性状态条件合并,该方法就成为变相的完整路径分析.3) 记录属性状态条件,在所有控制流汇合节点上,将相同属性状态的属性状态条件进行合并是前两种方法的折衷.实际上,程序员在编程时经常通过谓词条件来标记状态信息,选择以属性状态为单位合并路径信息符合程序员的编程习惯[5].因此,该方法具有较低的复杂度,也能降低误报.DTS即采用该方法.下面用该算法来分析图4所示的3个例子的资源泄漏缺陷检测.考虑图4(a),能够到达程序L1位置的可能属性状态集合为{{opened:dump[true],flag[1,1],f [notnull]},{start:dump[false],flag[0,0],f [null]}}.L1位置判断条件的真分支对变量flag限定取值范围为[1,1],假分支对变量flag限定取值范围为[−∞,0]∪[2,+∞].将真假分支对flag变量的限定范围分别与到达L1位置前各状态的状态条件中的flag取值范围进行交运算:=[1,1] (1) [1,1]∩[1,1][1,1]∩[0,0]=∅ (2) ([−∞,0]∪[2,+∞])∩[1,1]=∅ (3) =[0,0] (4)([−∞,0]∪[2,+∞])∩[0,0]其中,公式(2)和公式(3)得到∅,表明对应的属性状态条件与当前判断谓词取值限定相矛盾,即意味着该属性状态已经历的路径和当前分支组合后为不可达路径.图4(b)中的情形与图4(a)类似.属性状态条件信息可以用于排除不可达路径,从而降低误报.但是考虑图4(c)情况,程序L1位置可能属性状态集合为{{start:dump[true,false],flag[0,1],f [null]}}.程序L2位置可能属性状态集合为{{start:dump[false],flag[0,1],f [null]},{opened:dump[true],flag[0,1],f [notnull]}}.L2位置的判断条件为flag==1,将其真假分支对flag的限定范围与上述状态的状态条件中的flag取值范围进行交运算,然后考虑状态转换.最终,在L3处可能属性状态集合为{{start:dump[false],flag[0,1],f [null]},{error:dump[true],flag[0,0],f [notnull]},{closed:dump[true],flag[1,1],f [notnull]}}.这会造成一个误报,其原因是,属性状态条件记录的是所有可能到达该属性状态的相关变量取值范围集合,而程序中可能存在不同的路径到达当前属性状态,属性状态条件合并了这些路径上的路径条件信息.如前所述,在控制流汇合节点将不同分支的数据流信息“过早”地进行聚合会导致不精确.图4(c)中到达L1位置前,真假分支传递来的都为start状态,属性状态条件合并不同分支上的路径条件信息(dump[true,false],flag[0,1],f [null]),该属性状态条件丢失了dump和flag间的组合约束关系,造成后续不可达路径判断不准确形成误报.避免该误报的方法即设法阻止控制流汇合节点上不同分支的数据流信息“过早”地进行聚合,但这需要以提高分析复杂度为前提.在所有控制流汇合节点上允许相同状态的条件进行合并的数据流迭代算法如下:算法1. DTS路径敏感分析算法.in[n]:节点n执行之前的可能属性状态集合.out[n]:节点n执行之后的可能属性状态集合.kill[n]:节点n删除或转换了的可能属性状态集合.gen[n]:节点n由于转换而得到的新可能属性状态集合.entry:控制流入口节点.pred(n):节点n的前驱集合.merge:汇合节点集合.输入:控制流图和采用状态机描述的待测属性.输出:每个控制流节点的可能属性状态集合.∈=∅do []:;for each Nn in n214Journal of Software 软件学报 V ol.21, No.2, February 2010():true;while do begin:false;for each N do beginif then[]{start};else[]:[];if then[]:|,[];:[];[][](i p pred n i i change change change n n entry in n in n out p n merge in n R in n oldout out n out n gen n σσσσσ∈===∈===∈⎧⎫⎪⎪=∈⎨⎬⎪⎪⎩⎭==∪∪∪[][]);if []then :trueendendin n kill n out n oldout change −≠=允许相同状态的条件进行合并的方法的复杂度可进行如下估计:假设控制流图中节点个数为N ,边数为E ,属性状态机状态数为D ,程序中相关变量个数为V ,用于表示变量取值的偏序抽象语义域上基本操作(交、并、补、判相等,判是否矛盾等操作)的最大复杂度为Q .内层for 循环计算复杂度由下述因素共同决定:节点数和边数、每个节点可能出现的最多状态数D 、状态条件中包含的变量数V 、表示变量取值的偏序抽象语义域上基本操作最大复杂度Q .因此,内层for 循环的最大复杂度为O ((N +E )DVQ ).外层while 循环的终止条件为所有节点的out [n ]集合不发生变化,而while 循环的每次迭代只能使in [n ]和out [n ]集合变大或者其状态条件发生变化,假设用于表示状态条件的各抽象语义域的最多增大次数为H ,则while 循环的迭代次数上限为NDVH .综上所述,算法在最坏情况下复杂度为O ((N +E )ND 2VQH ).在实际中采用对节点先进行排序的方法进行计算,实际中的属性状态机状态个数D 为常量且通常不超过10个,因此,在实际中该算法的复杂度可以认为在O ((N +E )VQH )~ O ((N +E )NVQH )之间.4 实验结果为了分析路径敏感算法消除误报的效果,我们针对路径不敏感(传统数据流分析)和本文提出的路径敏感方法进行缺陷检测对比实验1.分析扫描的对象为10个大型Java 开源软件(选取标准为sourceforge 排名靠前且能编译通过),扫描的目标为资源泄漏和空句柄引用这两类缺陷.我们对扫描结果进行了人工确认,实验结果见表1.Table 1 Results of comparison experiment 1表1 对比实验1结果 Path-Insensitive method DTS’ path-sensitive method Program Number of files Number of lines Number of confirmed defects Time (s)Number of reported defects Number of false positives Time (s)Number of reported defects Number of false positivesNumber of reduced false positives areca-7.1.1 426 68 090 43 10667 24 11264 21 3 aTunes-1.8.2 306 52 603 20 5522 2 5222 2 0 Azureus_3.0.5.2 2 720 575 220 129 802363 234 880340 211 23cobra-0.98.1 449 70 062 3 9712 9 9911 8 1 freecol-0.7.3 343 110 822 109 92121 12 99121 12 0freemind-0.8.1 509 102 112 47 35176 29 36969 22 7 jstock-1.0.4 165 38 139 26 16835 9 18033 7 2 megamek-0.32.2 535 212 453 137 256249 112 309227 90 22 robocode-1.6 233 53 408 12 5853 41 6230 18 23 SweetHome3D-1.8 154 59 943 17 11431 14 12229 12 2Total 5 840 1 342 852 543 2 099 1 029 486 2 284946 403 83肖庆等:一种路径敏感的静态缺陷检测方法215采用路径不敏感方法总体分析时间为2 099s,路径敏感方法总体分析时间为2 284s,总体分析时间增加了8.81%.采用路径不敏感方法的误报数为486,采用路径敏感方法的误报数为403.与路径不敏感方法相比,本文描述的路径敏感方法排除了总体误报数的(486−403)/486×100%=17.08%.从上述结果可以看出,与路径不敏感分析算法相比,本文提出的路径敏感分析算法只增加了较少的分析时间,但能够有效地减少误报.Das等人提出了一种在属性状态上增加程序执行符号状态信息,并利用这些执行符号状态信息来排除不可达路径的多项式复杂度路径敏感方法.在他们实现的工具ESP中,采用常量传播格来表示执行符号状态信息[5].常量传播格是一种表示变量取值信息的简单而粗略的方法.而DTS采用抽象取值范围来表示变量取值信息[4],可以认为是常量传播格的精化.我们针对常量传播格表示和抽象取值范围表示进行了缺陷检测对比实验2,分析扫描对象及目标与实验1相同,实验结果见表2.Table 2Results of comparison Experiment 2表2对比实验2结果Constant propagation lattice Abstract value rangeProgram Numberof filesNumberof linesNumber ofconfirmeddefectsTime(s)Number ofreporteddefectsNumber offalsepositivesTime(s)Number ofreporteddefectsNumber offalsepositivesNumber ofreduced falsepositivesareca-7.1.1 426 68090 43 11064 21 11264 21 0 aTunes-1.8.2 306 52603 20 5522 2 5222 2 0 Azureus_3.0.5.2 2 720 575 220 129 862344 215 880340 211 4cobra-0.98.1 449 70062 3 10011 8 9911 8 0 freecol-0.7.3 343 110 822 109 102121 12 99121 12 0freemind-0.8.1 509 102112 47 35971 24 36969 22 2 jstock-1.0.4 165 38139 26 17434 8 18033 7 1 megamek-0.32.2 535 212453 137 278227 90 309227 90 0 robocode-1.6 233 53408 12 6030 18 6230 18 0 SweetHome3D-1.8 154 59943 17 11429 12 12229 12 0 Total 5 840 1 342 852 543 2 214953 410 2 284946 403 7采用常量传播格表示比采用抽象取值范围表示多了7个误报.我们分析了这7个误报以后发现,其主要发生在条件谓词中包含数值型变量情况下.例如下例:文件:Azureus_3.0.5.2_source\org\gudy\azureus2\ui\swt\views\configsections\ConfigSectionFile.java缺陷类型:空句柄引用…194: BooleanParameter zeroNew=null;…198: if ( userMode>0) {199: //zero new files200: zeroNew=new BooleanParameter(gFile, sCurConfigID,201: “bel.zeronewfiles”);…205: }…222: if (userMode>0) {…232: zeroNew.setAdditionalActionPerformer(new ExclusiveSelectionActionPerformer(btnIncremental));…采用常量传播格表示变量取值信息,在第232行将会报告一个空句柄引用缺陷,这是一个误报.userMode>0 对变量取值的限定是一个区间范围,而用常量传播格表示其取值信息为F,丢失了精度.216 Journal of Software软件学报 V ol.21, No.2, February 20105 相关工作静态缺陷检测过程中引起误报的原因有很多,从数据流分析上考虑,其主要原因有两个:1) 不可达路径判断不准确,导致不精确;2) 在控制流汇合节点将不同分支的数据流信息“过早”地进行聚合,导致不精确.其中,前者代表IDEAL和MOP的差距,后者代表MFP和MOP的差距.不同学者提出了许多尝试提高数据流分析精度的方法,其中尝试改进MFP和MOP的差距的包括:Bodik和Anik提出一种值重命名方案,通过在数据流分析过程中综合值名称空间来提高数据流分析的精度,这实际上是针对那些转换函数不满足分配率的数据流分析,试图通过MFP分析得到MOP信息[6];Ammons和Larus提出一种从控制流图中分离出一个有限路径集合进行数据流分析的方法,通过该方法来提高数据流分析的精度,其本质上是通过减少分析路径数求MOP解,以提高精度[7];Thakur和Govindarajan首先分析哪些控制流汇合节点会降低数据流分析精度,然后通过重构这些节点处的控制流图,最后在重构的控制流图上进行分析以提高精度,其本质上也是试图通过MFP分析得到MOP 信息[8].尝试改进IDEAL和MOP差距的包括:Holley和Rosen提出一种通过增加一个有限的谓词集合来提高数据流分析精度的方法,将控制流上的每条边与该谓词集合上的一个关系相关联,如果某条路径的关系合成得到空集,则被认为是不可达的[9];Bodik等人提出一种低代价的基于检测静态边关联的查找不可达路径方法,用于提高定义使用分析的精度[10];Tu和Padua通过在SSA汇合节点上增加控制谓词,提出一种广泛性的SSA方法来提高数据流分析精度[11];Das等人在模型检查的属性状态上增加程序执行符号状态信息,通过跟踪属性状态和程序执行符号状态间的关联关系,并将其用于排除不可达路径来提高数据流分析的精度[5];Fischer等人通过在数据流分析半格中元素上增加谓词信息来提高数据流分析精度.实际上,这些谓词将程序路径集合进行了划分,从另一个角度也可以认为是记录了不同的路径信息,该信息可用于不可达路径判断.谓词的选取基于一种反例导向的抽象精化技术(counterexample guided abstract refinement)[12].在上述方法中,Das[5]方法与我们的方法相似.但是,我们引入了抽象解释思想,采用变量的抽象取值来表示属性状态条件,不可达路径就体现为属性状态条件中某个变量抽象取值范围为空,属性状态条件相关计算更加精确、灵活.6 小结本文分析了路径不敏感造成静态分析不精确的原因,并提出了一种多项式复杂度的路径敏感分析方法.该方法采用变量的抽象取值范围来表示属性状态条件;通过属性状态条件中变量取值为空来判断不可达路径;通过在控制流汇合节点上进行相同属性状态的属性状态条件合并来降低计算复杂度.通过对10个大型Java开源项目的分析,表明该方法能够减少误报.下一步工作包括:研究选择哪些控制流汇合节点和哪些属性状态进行属性状态条件合并,以更好地求得复杂度和精度的平衡;当前属性状态条件中记录了相关变量的取值范围,实际上并不是所有变量都会影响后续的不可达路径判断;研究如何减少属性状态条件中变量数可以使算法的时间和空间开销更小.References:[1] Rice HG. Classes of recursively enumerable sets and their decision problems. Trans. of the American Mathematical Society, 1953,74(2):358−366.[2] Ball T, Rajamani SK. Automatically validating temporal safety properties of interfaces. In: Dwyer M, ed. Proc. of the 8th Int’lSPIN Workshop on Model Checking of Software. Berlin, Heidelberg: Springer-Verlag, 2001. 103−122.[3] Aho AV, Lam MS, Sethi R, Ullman JD. Compilers Principles, Techniques, and Tools. 2nd ed., New York: Addison-Wesley, 2006.626−632.[4] Yang ZH, Gong YZ, Xiao Q, Wang YW. The application of interval computation in software testing based on defect pattern.Journal of Computer-aided Design & Computer Graphic, 2008,20(12):1630−1635 (in Chinese with English abstract).肖庆等:一种路径敏感的静态缺陷检测方法217[5] Das M, Lerner S, Seigle M. ESP: Path-Sensitive program verification in polynomial time. In: Knoop J, Hendren LJ, eds. Proc. ofthe ACM SIGPLAN Conf. on Programming Language Design and Implementation. New York: ACM Press, 2002. 57−68.[6] Bodik R, Anik S. Path-Sensitive value-flow analysis. In: MacQueen DB, Cardelli L, eds. Proc. of the 25th ACM SIGPLAN-SIGACT Symp. on Principles of Programming Languages. San Diego: ACM Press, 1998. 237−251.[7] Ammons G, Larus JR. Improving data-flow analysis with path profiles. In: Berman AM, ed. Proc. of the ACM SIGPLAN ’98Conf. on Programming Language Design and Implementation. New York: ACM Press, 1998. 72−84.[8] Thakur A, Govindarajan R. Comprehensive path-sensitive data-flow analysis. In: Soffa ML, Duesterwald E, eds. Proc. of the 6thAnnual IEEE/ACM Int’l Symp. on Code Generation and Optimization. New York: ACM Press, 2008. 55−63.[9] Holley LH, Rosen BK. Qualified data flow problems. In: Abrahams P, Lipton R, Bourne S, eds. Proc. of the 7th ACM SIGPLAN-SIGACT Symp. on Principles of Programming Languages. New York: ACM Press, 1980. 68−82.[10] Bodik R, Gupta R, Soffa PL. Refining data flow information using infeasible paths. In: Jazayeri P, Schauer H, eds. Proc. of theSoftware Engineering Notes ESEC/FSE’97. New York: ACM Press, 1997. 361−377.[11] Tu P, Padua D. Gated SSA-based demand-driven symbolic analysis for parallelizing compilers. In: Valero M, ed. Proc. of the 1995ACM Int’l Conf. on Supercomputing. New York: ACM Press, 1995. 414−423.[12] Fischer J, Jhala R, Mujumdar R. Joining data flow with predicates. In: Wermelinger M, Gall HC, eds. Proc. of the 13th ACMSIGSOFT Int’l Symp. on Foundations of Software Engineering. Lisbon: ACM Press, 2005. 227−236.附中文参考文献:[4] 杨朝红,宫云战,肖庆,王雅文.基于缺陷模式的软件测试中的区间运算应用.计算机辅助设计与图形学学报,2008,20(12):1630−1635.肖庆(1979-),男,湖南祁东人,博士生,讲师,主要研究领域为软件测试,程序分析.金大海(1974-),男,博士,主要研究领域为软件测试.宫云战(1962-),男,博士,教授,博士生导师,CCF高级会员,主要研究领域为软件测试,软件工程.王雅文(1983-),女,博士生,CCF学生会员,主要研究领域为软件测试,程序分析.杨朝红(1976-),男,博士,副教授,CCF高级会员,主要研究领域为软件测试,软件工程.。