精确的程序静态分析
掌握如何进行代码静态分析和优化

掌握如何进行代码静态分析和优化代码静态分析和优化是软件开发中非常重要的一环,它可以帮助开发人员发现代码中的潜在问题,提高代码的质量和性能。
在这篇文章中,我将详细介绍代码静态分析和优化的相关概念、方法和工具,并分享一些实用的技巧和经验。
一、什么是代码静态分析和优化1.1代码静态分析代码静态分析是指在不执行程序的情况下对代码进行分析,以检测代码中的潜在问题和错误。
静态分析可以帮助开发人员发现潜在的安全漏洞、性能问题、不良的编程习惯等。
静态分析通常包括代码风格检查、代码规范检查、代码复杂度分析、数据流分析等。
1.2代码优化代码优化是指对代码进行改进,以提高代码的性能、可维护性和可读性。
优化可以包括优化算法、重构代码、优化数据结构、性能分析等。
优化的目标是使代码更加高效、可靠和易于维护。
二、代码静态分析的方法和工具2.1静态分析方法静态分析方法包括语法分析、语义分析、控制流分析、数据流分析等。
语法分析用于检测代码中的语法错误和语法规范是否符合要求;语义分析用于检测代码中的语义错误和逻辑错误;控制流分析用于分析代码中的控制流程是否符合预期;数据流分析用于分析代码中的数据流程是否正确。
2.2静态分析工具静态分析工具是用于实施静态分析的软件工具,包括代码检查器、静态分析器、静态代码分析工具等。
常见的静态分析工具有PMD、Checkstyle、FindBugs、Coverity、Lint等。
这些工具可以自动化地进行代码静态分析,并提供详细的分析报告和建议。
三、代码静态分析的实际应用3.1代码质量管理代码静态分析可以用于代码质量管理,帮助开发人员发现代码中的潜在问题,提高代码的质量和稳定性。
通过静态分析可以及时发现代码中的问题,避免在后期导致更严重的bug。
3.2安全漏洞检测静态分析可以用于检测代码中的安全漏洞,包括内存泄漏、空指针引用、缓冲区溢出等。
通过静态分析可以在代码提交前发现安全问题,保障软件的安全性。
3.3代码性能优化静态分析可以用于代码性能优化,通过分析代码的复杂度和执行路径,发现性能瓶颈并进行优化。
C语言中的静态分析与动态分析技巧

C语言中的静态分析与动态分析技巧在C语言编程中,静态分析和动态分析是两种常用的技巧,用于检测程序中潜在的问题和优化程序性能。
静态分析是在编译时进行分析的过程,主要用来检测代码中的潜在错误和漏洞,而动态分析则是在程序运行时进行分析的过程,用来检测程序的性能和调试错误。
以下将分别介绍C语言中的静态分析和动态分析技巧。
静态分析技巧主要包括代码审查、静态代码分析工具和静态代码检查。
代码审查是由程序员或团队成员对代码进行逐行检查,以发现潜在的错误和改进代码质量。
这种方法虽然效果显著,但耗时耗力。
静态代码分析工具则是利用专门的软件工具对代码进行全面的分析,识别潜在的问题,并提供改进建议。
常用的静态代码分析工具包括Lint、Pylint、Coverity等。
静态代码检查是一种自动化工具,可以在编译代码时发现潜在的问题,并生成相应的报告。
开发人员可以根据报告进行适当的调整和改进代码。
动态分析技巧主要包括性能分析和调试。
性能分析是通过对程序运行时的各个方面进行监测和测量,以确定程序的性能瓶颈并优化程序性能。
常用的性能分析工具包括Valgrind、Gprof、Perf等。
调试是通过跟踪程序的执行过程,诊断程序中的错误和异常行为。
常用的调试工具包括GDB、LLDB等。
通过这些工具,开发人员可以更容易地找到程序中的bug,调试程序,并提高程序性能。
总的来说,静态分析和动态分析技巧在C语言编程中都是非常重要的。
静态分析可以提前发现潜在的问题,保证代码质量,而动态分析则可以帮助调试程序,优化程序性能。
开发人员可以根据具体的需求选择不同的分析技巧,以提高代码质量和程序性能。
希望以上介绍对您有所帮助,欢迎您进一步深入学习和探讨C语言中的静态分析和动态分析技巧。
软件工程中的静态代码分析技术

软件工程中的静态代码分析技术软件工程是一门涉及广泛的学科,它的复杂性不仅体现在软件本身的复杂性上,还包括软件的开发、维护、测试等各方面。
软件开发是一个高度复杂的过程,由于软件系统的非线性和不确定性,每个开发者都很难保证自己的程序无论何时、何处都是正确的。
这就需要软件开发者使用静态代码分析技术和工具来帮助提高软件质量。
静态代码分析技术是指在程序没有运行的情况下对代码进行分析,以确定代码中存在的错误、漏洞、死代码等,以及可能出现的性能瓶颈或是其他潜在的问题。
它使得开发人员可以在开发过程中更早地发现和解决问题,从而减少了开发成本和时间,提高了软件的可靠性、性能和安全性。
下面将介绍几种常见的静态代码分析技术。
1. 代码文本分析代码文本分析是指根据程序的源代码进行分析,通过语法分析、断句分析、语义分析、上下文分析等技术,找出代码中可能存在的错误和不规范的编程风格。
这种分析技术具有高效、快速和准确的特点,可以用于大规模和复杂系统的代码分析。
几种常见的代码文本分析工具包括PMD、Checkstyle、FindBugs等。
2. 符号执行符号执行是一种逐行分析程序执行过程的技术,通过对程序中用于控制程序执行的各种条件的符号符合(而不是具体的数值)进行分析,来推导出不同的运行路径和可能的漏洞。
符号执行可以检测到数据溢出、分支语句中的逻辑错误、错误的函数调用等问题。
常见的符号执行工具有KLEE、S2E等。
3. 数据流分析数据流分析技术是一种在程序的执行过程中通过对程序数据流的追踪来确定可能的错误和漏洞。
它通过分析程序中变量的取值和变化来确定代码的执行路径和可能存在的漏洞。
常见的数据流分析工具有Coverity和CodeSonar等。
4. 模型检查模型检查是一种基于模型的自动验证技术,它根据系统的模型来产生逻辑或时间上的性质,以确定该系统是否具有这些性质。
模型检查通常用于复杂的系统,如软件、硬件、网络等。
并且,它能够自动化检测出不属于系统设计规范的行为。
静态分析工具在软件开发中的使用方法与效果评估

静态分析工具在软件开发中的使用方法与效果评估概述静态分析工具是一种被广泛应用于软件开发行业的工具,它能够在不运行程序的情况下对代码进行分析,以发现可能存在的错误、漏洞和潜在的性能问题。
本文将介绍静态分析工具在软件开发中的使用方法和评估其效果的一些常见指标。
一、静态分析工具的使用方法1. 选择适合的工具在选择静态分析工具时,我们应该根据项目需求和技术背景选择合适的工具。
常见的静态分析工具包括PMD、FindBugs、Checkstyle等,它们都具有不同的特点和适用范围。
通过对需求的分析和与开发团队的沟通,我们可以确定最适合当前项目的工具。
2. 配置工具参数一旦选择了适合的静态分析工具,我们需要根据项目的具体情况进行工具的配置。
静态分析工具通常具有许多配置参数,可以用来定义规则和检查项,以及设置分析的范围和深度。
通过合理的配置参数,我们可以定制化地运行工具,并根据项目需求进行精确的分析。
3. 运行静态分析在配置工具参数后,我们可以对代码进行静态分析。
通常情况下,静态分析工具可以通过命令行或集成开发环境等方式运行,并生成相应的分析结果报告。
在运行过程中,工具会根据配置的规则和检查项对代码进行检查,并提供相应的错误和警告信息。
4. 解决分析结果通过分析结果报告,我们可以了解到代码中存在的潜在问题和优化点。
开发团队应该根据报告中的信息,对代码进行适当的修改和调整。
解决分析结果中的问题将有助于提高代码的质量和可维护性。
二、静态分析工具效果评估的指标1. 问题发现率一个好的静态分析工具应能够发现代码中大部分的问题。
我们可以通过比较静态分析工具发现的问题和手工代码评审、测试中发现的问题,来评估其问题发现率。
一个问题发现率较高的工具将提高团队对代码质量的信心,并减少后续阶段的错误和漏洞。
2. 误报率静态分析工具有时也可能会产生一些误报,即将无问题的代码标记为有问题。
这样的误报将增加开发团队的工作量,并降低工具的可信度。
国内外主流静态分析类工具

国内外主流静态分析类工具静态分析是一种软件分析技术,主要用于检查和评估软件代码。
它通过分析代码的语法、结构、语义等方面,识别潜在的编程错误、安全漏洞和性能问题。
静态分析工具可以帮助开发人员提高代码质量、减少错误和缺陷,并提高软件的可靠性和可维护性。
以下是一些国内外主流静态分析类工具的介绍:1. SonarQube:SonarQube是一款开源的静态代码质量管理平台,提供了全面的代码分析和测试覆盖率检查等功能。
它支持多种编程语言,如Java、C++、Python等,可以检测代码质量、代码复杂度、缺陷、漏洞等问题,并提供详细的报告和建议。
2. Coverity:Coverity是一款商业化的静态分析工具,它主要用于C、C++、Java 等编程语言。
它能够识别出产品中的代码缺陷、安全漏洞和性能问题,并提供有效的修复建议。
Coverity具有高度的准确性和可扩展性,被广泛应用于许多行业,如金融、汽车和电子等。
3. FindBugs:FindBugs是一款开源的Java静态分析工具,它可以检测出Java程序中的常见编程错误、潜在问题和性能瓶颈。
FindBugs基于一系列预定规则进行分析,通过检查字节码来发现问题,并生成详细的报告。
它还提供了插件机制,方便开发人员自定义规则和扩展功能。
4.PMD:PMD是一款开源的静态代码分析工具,主要用于Java和其他JVM-based语言。
它可以检查代码风格、潜在的bug、未使用的变量、复杂的表达式等问题,并提供详细的报告和建议。
PMD还支持自定义规则和插件,方便开发人员根据具体需求进行定制。
5. ESLint:6. Clang Static Analyzer:Clang Static Analyzer是由LLVM开发的一款开源的静态分析工具,主要用于C、C++和Objective-C语言。
它能够检测出代码中的内存错误、空指针引用、资源泄漏等问题,并提供详细的报告和修复建议。
静态分析工具和动态分析工具在软件测试中的应用比较

静态分析工具和动态分析工具在软件测试中的应用比较随着软件系统的复杂性不断提高,软件测试作为保障软件质量的重要环节也变得越来越重要。
为了提高软件测试的效率和准确性,静态分析工具和动态分析工具应运而生。
本文将详细介绍静态分析工具和动态分析工具的定义、原理、特点及在软件测试中的应用比较。
一、静态分析工具1.定义静态分析工具又称静态源代码分析工具,是一类基于源代码(或二进制代码)的静态分析技术和工具。
它们通过分析源代码的结构、语法、语义和约束条件等信息,进行检查、推理、模拟和验证等操作,从而对软件的缺陷、错误、漏洞和规范性问题等进行自动化诊断、定位和修复,以提高软件的可靠性、安全性和可维护性。
2.原理静态分析工具的主要原理是对源代码进行语法和语义分析,构建程序的内部表示(如语法树、CFG、DAG等),并利用这些表示对程序进行推理和检查。
常见的静态分析技术包括符号执行、数据流分析、模型检查、约束求解、模式匹配和统计分析等。
3.特点静态分析工具的主要特点如下:(1)基于源代码的分析方法,能够发现与代码相关的软件缺陷问题。
(2)具有自动化分析、运行效率高、可扩展性强等优势。
(3)可对代码中的所有路径和情况进行分析,能够发现所有可达的缺陷问题。
(4)局限性在于对环境变量和动态输入的处理不够准确,可能导致误报和漏报的情况。
4.应用静态分析工具在软件测试中的主要应用包括以下方面:(1)发现潜在的代码缺陷和错误,提高软件质量和可维护性。
(2)查找和修复程序中的安全漏洞和攻击风险。
(3)检查代码是否符合规范和编码标准,提高代码质量和可读性。
(4)简化代码审查和软件维护过程,提高效率和准确性。
二、动态分析工具1.定义动态分析工具是一类基于程序的执行过程,对程序运行状态和输入输出数据进行监测、记录和分析的工具。
它们能够在程序执行的不同阶段和环境中获取各种信息和数据,如变量值、执行路径、内存堆栈、I/O操作和异常处理等,从而对软件的行为、性能和可靠性等进行测试和评估。
静态分析与动态分析在代码质量评估中的比较

静态分析与动态分析在代码质量评估中的比较在软件开发过程中,代码质量一直是一个非常重要的方面。
随着软件规模越来越大、功能越来越复杂,代码的数量也越来越多,因此如何评估代码质量就变得越来越关键。
在代码质量评估中,静态分析和动态分析是两种常用的方法。
本篇文章将对这两种方法进行比较,探讨它们各自的优缺点及适用场景。
一、静态分析静态分析指的是在代码执行前对代码进行分析,通过检查代码中的语法和结构等因素来检测代码中的错误和缺陷。
静态分析可以帮助程序员在编写代码时发现问题,从而减少程序错误的数量。
这种方法是一种自动化的工具,不需要对代码进行实际运行,也不会影响程序的性能。
在静态分析中,通过代码分析工具对代码进行检查,工具会自动检测代码中可能存在的缺陷和错误,例如:内存泄漏、类型不匹配、逻辑错误等。
静态分析工具的使用可以提高代码可读性和可维护性,减少代码的错误率和修复成本。
静态分析有以下几个优点:1. 代码质量高:静态分析可以在代码运行之前发现错误和缺陷,从而提高代码质量。
2. 成本低:静态分析工具可以在代码编写阶段自动进行检查,减少后期维护工作量。
3. 运行快速:静态分析不需要对代码进行实际运行,因此速度很快。
4. 可自动化:利用静态分析工具可以自动化代码质量评估过程,提高效率。
然而,静态分析也有一些缺点:1. 无法处理动态特性:静态分析不能检测程序运行时的动态变化,只能检查代码本身的语法和结构。
2. 误报率高:静态分析工具会对代码进行分析,并给出警告,但警告可能是虚假的,导致程序员浪费时间去处理没有问题的代码。
3. 需要专业知识:静态分析需要对代码结构和语法等有深入的了解,因此需要具备专业的知识。
二、动态分析动态分析是在代码运行时对程序进行检查,采用动态分析技术可以检测代码中的缺陷和错误。
与静态分析不同,动态分析是通过对代码实际运行结果进行分析来评估代码质量。
动态分析需要在实际运行时收集程序的数据,例如:函数调用、内存使用情况、程序执行时间等,并对数据进行分析。
比较静态分析的原理及应用

比较静态分析的原理及应用1. 静态分析的基本概念静态分析是指在不执行程序的情况下对程序进行分析的一种方法。
它通过对程序的源代码、中间代码或二进制代码进行分析,获取程序的结构信息、程序的属性或程序行为的一些特征。
2. 静态分析的原理静态分析的原理基于程序的语法和语义规则,主要包括以下几个方面:2.1 语法分析语法分析是指对程序代码进行解析,将代码分解成各种语法单元,例如标识符、变量、函数等。
语法分析器根据语法规则进行分析,检查代码的正确性和合法性。
2.2 数据流分析数据流分析是指分析程序中变量的使用情况和流动情况。
通过数据流分析,可以推断变量的值在程序执行过程中的变化情况,进而对代码进行分析和优化。
2.3 控制流分析控制流分析是指分析程序的执行路径和控制结构。
通过控制流分析,可以获得程序的控制流图,进而对程序的结构进行分析和理解。
2.4 代码依赖分析代码依赖分析是指分析程序中各个代码块之间的依赖关系。
通过代码依赖分析,可以确定代码块之间的调用关系、参数传递关系等,进而对程序进行细粒度的分析。
3. 静态分析的应用静态分析在软件开发、软件测试、代码审查等方面有着广泛的应用。
3.1 缺陷检测静态分析可以通过对代码进行分析,发现其中的潜在缺陷和问题。
例如,通过对代码的变量使用情况进行分析,可以发现可能存在的空指针异常、内存泄漏等问题。
3.2 代码优化静态分析可以对代码进行结构分析、性能分析等,通过分析代码的运行情况,找出代码中的瓶颈和低效之处,进而对代码进行优化,提高程序的性能和效率。
3.3 安全分析静态分析可以对代码进行安全分析,发现其中的潜在安全隐患。
通过分析代码的数据流和控制流,可以发现可能存在的安全漏洞,例如SQL注入、跨站脚本攻击等。
3.4 规约检查静态分析可以对代码进行规约检查,确保代码符合一定的编码规范和标准。
例如,通过代码的语法分析和命名规范分析,可以发现代码中可能存在的风格不一致、命名不规范等问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Keywords
static analysis;program paths;symbolic execution;data coverage
适当的断言(包括循环不变式),再利用自动化或半 1
引
言
自动化的推理工具(定理证明器或者证明检查器)进 行验证.另一类形式验证方法是模型检测,其自动化
正确性是程序最重要的属性之一.长期以来,如 何保证程序的正确性、尽可能发现程序中各种潜在 的错误,一直是计算机科学界关注的一个重要问 题[1].这一问题也受到国际大型软件公司的高度
第31卷第9期
2008年9月
计
算
机
学
报
v01.31
No.9
CHINESE JOURNAL OF CoMPUTERS
Sept.2008
精确的程序静态分析
张 健
100190)
(中国科学院软件研究所计算机科学国家重点实验室北京
摘要程序的静态分析是程序语言和编译领域的一个重要研究方向,已经被研究了很多年.近年来,它也引起形 式方法和软件工程领域的重视,被用于程序测试和正确性验证.文中从程序的语法特征、所关心的数据类型和程序 性质等方面比较了一些静态分析技术.着重描述基于路径的分析方法,特别是符号执行技术,讨论了程序路径可行 性分析问题及其分类、复杂度.针对程序分析精度的一种量化指标,说明了其计算方法. 关键词静态分析;程序路径;符号执行;数据覆盖
ean
program)的概念.这种程序的所有变量都是布
给定一条路径,判断是否有变量的初始取值,使 得程序沿该路径执行.这就是路径可行性判定问题. 如果能找到合适的变量初始值,使路径被执行,则称 该路径为可行的(feasible);否则就称它为不可行
尔类型的.SLAM自动地将普通的C程序抽象为布 尔程序.这种做法显然会丢掉很多重要信息,但是对 设备驱动程序这类应用来说,取得了不错的效果.
例1.
下面是一条简单的程序路径P。:
int i,J;
@(i>5); J—i+1; @(i<4);
它表示,程序中有两个整型变量i和歹.在路径入口 处,i的值大于5;后来执行了一条赋值语句;在出口 处,又有一个条件表达式(歹的值小于4).
3.1路径可行性判定问题
在SLAM项卧3]中,引入了“布尔程序”(B然程序分析技术已经被研究了很长时间,但因 为要处理大程序,采用了很多近似的粗略的分析方 法.比如,一类被称为流不敏感的(flow—insensitive) 方法是,不考虑语句执行的先后次序.这类方法可得 到一些保守的结果(比如变量z的值可能具有某性 质).即使是如此粗糙的分析方法,对指针作别名分 析也是NP难的[2].相对于流不敏感方法而言,也有 流敏感的分析方法. 类似地,静态分析方法还可区分为路径敏感的 (path—sensitive)和路径不敏感的.另外,有些方法只 注重分析单个过程,被称为过程内分析方法;而针对 多个过程的则是跨过程(inter—procedural)分析方法. 从某种意义上讲,上面的分类方法都是依据控 制流的.我们认为,还可以从另外一个角度来进行划 分,即以能精确处理什么样的数据类型来划分. 虽然很多方法和工具声称能分析比较大的C 程序,但规模(程序行数)只是复杂性的一个方面.多 数工具都不可避免地采用抽象的手段,忽略掉一些 看起来无关的细节.
to
the syntactic features,data types and
on a
correctness
properties targeted by the
are
tech—
niques.The paper focuses
class of analysis techniques that
based
3路径可行性及判定方法
本节讨论如何分析具有丰富数据类型的程序, 主要是面向路径的分析方法. 我们知道,从程序流图可以得到很多条程序路 径.每条路径的起点是程序的入口.如果程序中有循 环,可能会有无穷多条路径. 我们可以将路径表示为一个序列.为简便起见, 假定序列中的每个元素是条件表达式(用@表示)或 者赋值语句.输入语句(scanf)也可看成是一种赋值 语句.当然,在序列之前,我们需要加上变量声明.
虽然很多学者做了很大的努力,但对于我们常 见的绝大多数程序而言,实现完全的正确性验证目 前还是很困难的.一种经典的做法是,程序员先写出
收稿日期:2008—07—16.张■,男,1969年生,研究员,博士生导师,研究领域为自动推理、约束求解、程序分析与软件测试.E-mail:zj@
ios.ac.c11.
Abstract
Static program analysis has been studied for many years.It is
an
important topic in the
research of programming languages and compilers.Recently,it has also attracted researchers from other
数组是程序中常用到的一种语法结构.但它也 给静态分析带来了一定的麻烦:如果下标表达式含 有变量,很难在程序执行前知道它究竟是指哪个元 素.对此,往往需将数组表达式简化.一种做法是,只 看数组名,而不管下标.这样的分析方法把口[i+力
和口[o]当成一个对象;但是把缸o]和b[1]还是看
成不同的对象. Lev—Ami等人[妇描述了如何用静态分析的方法 来“验证”一些能处理链表结构的程序(比如用链表 实现的插入排序算法).但实际上,他们的方法中只 记录了程序中一部分信息(就是链表各元素之间的 关系),而忽略了其它信息(如每个结构中的数值分 量).其出发点应该是,只关心程序的部分性质(如元 素之间的序关系).但如果程序不小心把数值变量的 值改变了,他们的分析方法发现不了这种错误. 还有很多其它方法也只关心程序的一些特性, 如“所有打开的文件要被关闭”,等等.从数据类型的 角度看,很多分析方法都是针对单变量、甚至是布尔
areas
such
as
formal methods
and software engineering,and some ideas have been
used for program verification and testing.This paper compares various static analysis techniques, according
4路径可行性判定与 程序分析、验证、测试
路径可行性判断问题本来是软件测试中的重要 问题.在测试技术研究的早期,人们往往根据程序的 控制流图来构造测试用例(从图中选取一定的路 径),但发现这样得到的很多路径是不可行的.由于 路径可行性判断问题本身固有的难度,在这一问题 上一直没有大的进展.如果能很好地解决该问题,对 软件测试自动化(特别是测试数据自动生成)的重要
中图法分类号TP311
Sharp Static Analysis of Programs
ZHANG Jian
(State Key
Laboratory
of Computer Science,Institute of
SoftMre,Chinese Academy of
Sciences,BeOing
100190)
重视.
程度很高.但是它只能验证可归结为有限状态的程 序.这里所说的“状态”是指程序变量的一种取值. 在工业界,人们通常是利用各种测试手段来发 现软件中的错误,提高软件质量.通过运行软件,观 察或比较其执行结果,判断软件中是否有错.虽然目 前有很多工具能帮助用户统计测试过程中的各种信 息(如语句覆盖率),但是测试用例的设计(特别是测 试数据的自动生成)还是一个难题.
计
算
机
学
报
2008钷
与动态的测试方法不同,我们也可以不运行软 件,而直接分析程序代码,发现其中一些错误.这类 方法称为静态分析.它是程序语言和编译、软件工程 领域的一个重要研究方向.一个比较有名的早期开 发的静态分析工具就是tint,它主要检查C语言程 序中的各种错误(如没有初始化的变量).近几年,静 态分析技术也逐渐受到操作系统、信息安全等领域 学者的高度重视. 本文第2节简要地介绍几种静态分析及验证方 法,指出应以数据类型的处理作为比较不同方法的 重要基础;第3节介绍路径可行性判定问题及解决 此问题的两类方法,特别是符号执行的方法;第4节 接着论述这种高精度的分析方法在程序分析、验证 和测试中所起的作用;在第5节,我们描述程序分析 精度的一种度量,并通过例子说明其计算方法;第6 节是结束语. 本文采用C语言的文法来描述算法和程序例子.
3.3近似的判定方法
虽然符号执行的方法可以准确地判断路径的可 行性,但目前其算法和实现技术还不太成熟,代价比 较高.所以,人们也提出了一些计算代价比较低的近 似方法.比如,软件工程领域早期出现过的一种判断 方法[81是,如果一条路径中有很多不同的谓词(条件 表达式),那么这条路径不可行的概率就比较大.从 约束的观点看,这样的路径所对应的路径条件要满 足很强的约束,很可能达不到要求. 最近,Ngo和Tan[叼观察到常见程序中不可行 路径的一些特征,提出了一些启发式判断方法.在实 际应用中,效果不错.
3.2精确的判定方法
具体的判断算法及复杂度取决于路径中表达式 的形式.(1)如果分析的是布尔程序,路径中只有布 尔变量和布尔逻辑运算符,那么得到的路径条件应 该是布尔逻辑表达式.判断它是否可满足的问题,是 NP-难的.(2)如果我们分析的是数值计算程序,并 且得到的路径条件是一组线性不等式,那么我们可 以用线性规划的方法来判断路径条件是否可满足. (3)自动工具PAT采用了布尔逻辑可满足性算法 和线性规划相结合的方法,来判断路径条件的可满 足性.因为PAT可接受的路径中,既有布尔逻辑运 算,又有线性的数值运算.