CN116467220B - 一种面向软件静态分析的循环代码处理方法和装置 - Google Patents
一种面向软件静态分析的循环代码处理方法和装置 Download PDFInfo
- Publication number
- CN116467220B CN116467220B CN202310691699.XA CN202310691699A CN116467220B CN 116467220 B CN116467220 B CN 116467220B CN 202310691699 A CN202310691699 A CN 202310691699A CN 116467220 B CN116467220 B CN 116467220B
- Authority
- CN
- China
- Prior art keywords
- circulation
- cyclic
- code
- variable
- loop
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 125000004122 cyclic group Chemical group 0.000 title claims abstract description 260
- 230000003068 static effect Effects 0.000 title claims abstract description 30
- 238000003672 processing method Methods 0.000 title claims description 13
- 238000004458 analytical method Methods 0.000 claims abstract description 49
- 238000000034 method Methods 0.000 claims abstract description 40
- 238000012545 processing Methods 0.000 claims abstract description 32
- 238000010276 construction Methods 0.000 claims abstract description 12
- 230000006870 function Effects 0.000 claims description 102
- 230000014509 gene expression Effects 0.000 claims description 68
- 230000008569 process Effects 0.000 claims description 20
- 238000003860 storage Methods 0.000 claims description 12
- 230000008859 change Effects 0.000 claims description 6
- 230000009191 jumping Effects 0.000 claims description 5
- 238000007670 refining Methods 0.000 claims description 5
- 230000006698 induction Effects 0.000 claims description 4
- 238000004364 calculation method Methods 0.000 claims description 3
- 238000013507 mapping Methods 0.000 claims description 2
- 238000009960 carding Methods 0.000 claims 1
- 230000002194 synthesizing effect Effects 0.000 claims 1
- 238000001514 detection method Methods 0.000 abstract description 2
- 238000004088 simulation Methods 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 8
- 230000009467 reduction Effects 0.000 description 7
- 230000001419 dependent effect Effects 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 4
- 238000004519 manufacturing process Methods 0.000 description 3
- 238000013138 pruning Methods 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 230000002411 adverse Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000003339 best practice Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000018109 developmental process Effects 0.000 description 1
- 238000009826 distribution Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000004880 explosion Methods 0.000 description 1
- 230000001939 inductive effect Effects 0.000 description 1
- 238000012067 mathematical method Methods 0.000 description 1
- 239000011159 matrix material Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 230000011218 segmentation Effects 0.000 description 1
- 238000000638 solvent extraction Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明属于软件代码检测与分析技术领域,公开了一种面向软件静态分析的循环代码处理方法和装置。通过开展相关数学知识库构建、可精确处理循环代码类型库建立完成处理前的准备工作,为后续处理实施环节奠定基础。针对被分析循环代码,首先构建循环代码模型,为精确处理提供代码信息支持;然后针对循环变量,构建其对应的函数关系;其次基于循环代码模型信息,判断被分析循环代码是否可精确求解类型;之后依据建立的循环出口方程和循环变量初值求解最大循环次数和循环变量值;最后针对被分析循环代码建立等价仿真节点,为循环代码的静态分析提供支持。本发明能够提高循环代码静态分析的正确性,为可工程化循环代码精确处理提供工具手段。
Description
技术领域
本发明属于软件代码检测与分析技术领域,具体涉及一种面向软件静态分析的循环代码处理方法和装置。
背景技术
从世界上第一台能够占据整个房间的巨型计算机的诞生到今天各种微型机器的产生,计算机技术已经应用到人们生活的方方面面。计算机以不同的展现形式出现在人们的面前,改变着生活和生产的方方面面。小到儿童的游戏机、平板,大到汽车、飞机、卫星等领域无不离不开计算机的发展。目前在很多领域的基础设施,比如机器制造、电力能源、通信行业、运输以及金融行业,都高度依赖计算机。越来越多的行业领域依靠计算机软件来辅助实现安全控制、业务执行和生产管理等重要环节。随之而来,对计算机软件的安全性提出了十分严峻的考验:重要领域中运行的软件一旦出现错误,就会给社会经济和人类生命财产造成巨大损失。目前,静态分析成为解决软件代码安全性问题的最好实践之一。
循环代码是最为复杂的一种软件代码结构,也是静态分析技术最难处理的一种代码结构。循环代码静态分析时最大的困难在于很难做到完全路径遍历,主要原因:一是循环次数一般不是确定数,很难直接获取;二是循环路径数目大,容易存在路径爆炸问题,所以在有限时间有限资源内分析所有路径是很难完成的。目前常用的解决方案一般是采用路径剪枝的方法。这种方法最大的问题是循环代码分析结果的失真,无法做到对循环代码精确处理,从而影响循环后代码的静态分析结果,导致代码静态分析结果的漏报和误报,因此在代码静态分析领域,对于相关路径遍历研究的重要内容之一就是尽量扩大完全路径遍历的适用范围,从能够准确处理的特殊代码结构中,挖掘出那些能够精确处理以至于不对完全路径遍历也不会造成任何不良影响的代码结构类型,进而增强代码静态分析能力,提高静态分析的正确性。
发明内容
本发明针对循环代码完全路径遍历困难的问题,面向C语言软件代码,提出了一种软件静态分析中的循环代码处理方法和装置,旨在准确处理循环代码能力的基础上,提高循环代码静态分析的正确性,为可工程化循环代码精确处理提供了一种新的思路,也为循环代码精确处理提供了工具手段。
本发明采用如下技术方案:
本发明提供一种面向软件静态分析的循环代码处理方法,包括以下步骤:
步骤1,分析人工可求解循环代码的结构,并复原人工求解循环的思路,提炼循环代码求解过程中所应用的数学知识,构建求解循环代码的数学知识库;
步骤2,从循环出口数量、循环变量函数特征以及循环变量特征三方面组合建立可精确求解循环代码类型库;
步骤3,构建被分析循环代码模型,包括循环定义、循环变量集合以及循环体控制流程图三部分;
步骤4:基于被分析循环代码的循环变量值的变化规律,构建被分析循环代码的循环变量函数;
步骤5,基于步骤3的被分析循环代码模型、步骤4的被分析循环代码的循环变量函数,分析循环出口数量、循环变量函数特征和循环变量特征,与步骤2的可精确求解循环代码类型库中的可精确求解代码类型进行对比,判断被分析循环代码是否为可精确求解代码类型;如果是,则进入步骤6,否则给出无法精确求解的结论;
步骤6,根据步骤1的数学知识库、步骤3的循环定义和步骤4的循环变量函数,建立循环出口方程,结合循环出口变量初值,求解最大循环次数;将最大循环次数代入被分析循环代码的循环变量函数,得到跳出循环后全部循环变量对应的循环变量值集合;
步骤7,将被分析循环代码的循环变量值集合更新到对应的变量存储空间中,继而建立循环等价节点,以更新后的变量存储空间作为循环等价节点的即时数据,用循环等价节点替换路径中的所有当前循环节点,构建等价路径,完成对被分析循环代码的处理。
进一步,所述步骤2,所述可精确求解循环代码类型库包括六种可精确求解循环代码类型:
I型循环:循环出口数量为1,循环变量函数特征均为等差或等比数列,循环变量特征为全齐次;
II型循环:循环出口数量为1,循环变量函数特征除末次循环变量外,均为等差或等比数列,循环变量特征为齐次和末次;
III型循环:循环出口数量为2,循环变量函数特征均为等差或等比数列,循环变量特征为全齐次;
IV型循环:循环出口数量为2,循环变量函数特征除末次循环变量外,均为等差或等比数列,循环变量特征为齐次和末次;
V型循环:循环出口数量大于2,循环变量函数特征均为等差或等比数列,循环变量特征为全齐次;
VI型循环:循环出口数量大于2,循环变量函数特征除末次循环变量外,均为等差或等比数列,循环变量特征为齐次和末次。
进一步,所述步骤3包括以下子步骤:
(1)解析循环代码:基于循环代码的词法和语法分析,构建循环代码的抽象语法树,生成循环代码元数据;
(2)获取循环定义信息:循环定义信息包括循环描述信息和循环出口信息两部分,其中循环描述信息从循环代码元数据中获取,循环出口信息通过分析出口描述信息、出口条件表达式、出口变量集合获取;
(3)获取循环变量信息:循环代码中所有已进行定值操作的变量构成循环变量集合;
(4)构建循环体控制流图:以循环代码元数据为基础,对循环代码进行块划分;基于块划分结果,以循环代码开始行为起点,各块的起始行为节点,循环代码终止行为终点,并依据块类型及块间关系将各节点连接在一起,构建循环控制流图。
本发明还提供一种面向软件静态分析的循环代码处理装置,包括:
循环代码数学知识库模块:分析人工可求解循环代码的结构,并复原人工求解循环的思路,提炼循环代码求解过程中所应用的数学知识,构建求解循环代码的数学知识库;
可精确求解循环代码类型库模块:从循环出口数量、循环变量函数特征以及循环变量特征三方面组合建立可精确求解循环代码类型库;
循环代码模型构建模块:构建被分析循环代码模型,包括循环定义、循环变量集合以及循环体控制流程图三部分;
循环变量函数构建模块:基于被分析循环代码的循环变量值的变化规律,构建被分析循环代码的循环变量函数;
判定模块:基于被分析循环代码模型与循环变量函数,分析循环出口数量、循环变量函数特征和循环变量特征,与可精确求解循环代码类型库中的可精确求解代码类型进行对比,判断被分析循环代码是否为可精确求解代码类型;
循环代码求解模块:根据数学知识库、循环定义和循环变量函数,建立循环出口方程,结合循环出口变量初值,求解最大循环次数;将最大循环次数代入被分析循环代码的循环变量函数,得到跳出循环后全部循环变量对应的循环变量值集合;
循环等价节点构建模块:将被分析循环代码的循环变量值集合更新到对应的变量存储空间中,继而建立循环等价节点,以更新后的变量存储空间作为循环等价节点的即时数据,用循环等价节点替换路径中的所有当前循环节点,构建等价路径。
采用本发明所提供的一种面向软件静态分析的循环代码处理方法和装置,具有以下有益效果:
(1)提出的一种面向软件静态分析的循环代码处理方法,可以对某些循环代码进行精确处理,相比传统剪枝的处理方式,可以更正确地分析循环代码,进而增强代码静态分析能力,提高分析的正确性。
(2)提出的一种面向软件静态分析的循环代码处理方法,为可工程化循环代码精确处理提供了一种新的思路。
(3)研制的循环代码处理装置,能对被导入的C语言代码开展自动精确处理,以图形用户界面显示处理结果,为循环代码精确处理提供了工具手段。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是面向软件静态分析的循环代码处理方法的流程示意图;
图2是循环出口信息获取流程示意图;
图3是循环变量函数建模思路示意图;
图4是可精确处理循环代码类型判定示意图;
图5是循环代码表达式化简技术示意图;
图6是循环变量函数求解过程示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供了一种面向软件静态分析的循环代码处理方法和装置,如图1所示,包括以下步骤:
步骤1:循环代码相关数学知识库构建。通过分析人工可求解循环代码的结构、复原人工求解循环的思路,提炼出循环代码求解过程中所应用的数学知识,进而构建循环代码相关的数学知识库。
具体的,所述步骤1中的循环代码相关的数学知识库的构建流程:
(1)通过对已知人工可求解循环代码结构进行归纳分析,梳理人工求解的具体方法,从中提取出所应用的数学知识。
(2)从表达式处理、函数求解、数学归纳等抽象过程提取循环变量特征和循环函数特征;并对获取的可求解循环代码集合中各循环代码结构的特征进行分析,主要包括循环出口特征分析以及循环变量特征分析。
(3)在获取循环出口特征集合以及循环变量特征集合的基础上,综合循环模型以及循环相关数学知识等以及人工处理方法集合,建立起循环特征同处理方法之间的映射,即可对可求解循环进行分类并构建可求解类型集合,并最终建立了表1所示的部分数学知识库。
表1 部分循环代码相关的数学知识库
步骤2:可精确求解循环代码类型库建立。从循环出口数量、循环变量函数特征以及循环变量特征三方面组合建立可精确求解循环代码类型库。
具体的,所述步骤2中的从循环出口数量、循环变量函数特征以及循环变量特征三方面组合划分的六种可精确求解循环代码类型详见表2所示。
表2 六种可精确求解循环代码类型
步骤3:被分析循环代码模型自动构建。循环代码模型抽象为循环定义、循环变量集合以及循环体控制流图三部分。基于词法语法分析的循环代码元数据,分析获取循环起始行、终止行、入口条件、出口数量、出口条件、出口变量等循环定义信息;进一步获取变量定值表达式、变量初值、行号及定值顺序号等循环变量信息;对循环体进行有效的块划分,以块的起始行为节点,并依据块类型及块间关系进行连接,以循环体终止行为终点,构建循环体控制流图。
具体的,所述步骤3中循环代码模型的自动构建流程如下:
(1)解析循环代码。基于循环代码的词法和语法分析,构建循环代码的抽象语法树,生成循环代码元数据。
(2)获取循环定义信息。循环定义信息包括循环描述信息和循环出口信息两部分,循环描述信息包含循环起始行、终止行、入口条件、while-for-do循环类型等,可直接从循环代码元数据中获取;循环出口信息包含出口位置、出口数量、出口条件、出口变量等,通过分析出口描述信息、出口条件表达式、出口变量集合等流程获取循环出口信息。
进一步,循环出口信息包括出口描述信息、直接出口条件表达式、间接出口条件表达式集合以及所应用的循环出口变量集合。出口描述信息包括出口位置、类型、关键词等信息。出口条件表达式是指当该条件表达式取值为真时,循环必然从该出口跳出时的条件表达式。如图2所示,循环出口信息获取流程如下:
首先,获取出口描述信息。在高级语言中,按照循环出口的位置,可将循环出口分为头部出口和内部出口。头部出口同循环入口相重合,通过分析特定循环代码元数据,可以获取头部出口描述信息。内部出口产生于break或return语句,通过分析break和return关键词所对应的元数据,可获取相应的出口描述信息。
其次,获取出口条件表达式。出口条件表达式分为直接出口条件表达式和间接出口条件表达式。直接出口条件表达式存在于头部出口,是指入口条件的取否操作;间接出口条件表达式存在于内部出口,是指出口所在分支代码块的分支条件。
例如上面代码中,第14行是头部出口,直接出口条件表达式是“!(i<5)”;第19行出口是内部出口,间接出口条件表达式是“n_param==qn_var”。
最后,获取出口变量集合。在获取循环变量集合的情况下,通过分析出口条件表达式中对循环变量的应用情况,提取出每个出口条件表达式中所应用的循环变量集合,为后续的循环类型判定和方程求解提供支持。
例如上面代码中,直接出口条件表达式“!(i<5)”应用的循环变量为i,间接出口条件表达式“n_param==qn_var”应用的循环变量为n_param和qn_var,出口变量集合为{i, n_param, qn_var}。
(3)获取循环变量信息。循环代码中所有进行了定值操作的变量构成了循环变量集合。基于循环代码元数据进一步获取变量定值表达式、变量初值、行号及定值顺序号等。
(4)构建循环体控制流图。以循环代码元数据为基础,对循环代码进行有效的块划分。基于块划分结果,以循环代码开始行为起点,各块的起始行为节点,循环代码终止行为终点,并依据块类型及块间关系将各节点连接在一起,即可构建循环控制流图。
步骤4:被分析循环变量函数建模。循环变量函数建模是考虑用数学方法来表示循环变量,执行每一次循环会发生变化的是循环变量,循环变量值的变化是不同循环次数对应循环程序状态的本质特征,因此采用数学领域中的函数概念对循环变量进行建模可以更好地理解循环代码。
具体的,循环代码由初始化、循环条件、循环体三部分语句相互联系,共同完成某个逻辑功能。在循环条件成立时,循环体反复执行,直到循环条件不成立为止。在循环入口处,程序处于一种状态;循环出口处,程序又处于另一种状态/>。每一次循环i,都对应一个程序状态/>,从入口到出口,程序状态在不断地发生如下的变化:/>,/>,…/>,…/>。通过分析可以发现,不同的循环次数i会对应一个程序状态/>,同时循环代码程序状态的不同在于每个/>对应的循环变量值集合不同。这个特征与函数特性很相似,故引入函数概念对循环代码进行建模。
循环代码中不同程序状态之间的区别在于不同循环次数i对应的循环变量的取值不一样。循环代码的精确处理需要关注每个循环变量(含循环控制变量和出口变量),所以基于函数对循环代码数学建模涉及的因变量为循环变量;自变量有循环次数和循环变量索引号;对应负法则为循环变量定值表达式。如图3所示,具体为:
(1)循环代码的函数表示。循环代码整体是一个以循环次数为自变量,以循环变量集合为因变量的函数。以V为循环变量集合、c代表循环迭代次数、p代表某个循环代码的标识,用其能够区分不同的循环,则循环代码用函数可记作:V=loop(p,c)。
循环次数是一整数,最小值是0:min(c)=0。当循环运行至某出口时,循环终止,此时的c值是循环针对于特定出口的循环次数,记作out(j),j的含义是出口序号。循环次数的最大值m是循环跳出前的最后一次循环次数的值,可记作:m=max(c)=out(j)-1(m是最大循环次数)。
(2)某个循环变量的函数建模。循环变量集合V中包含0个或者多个(n个)循环变量,即:(k是循环变量的索引,n是循环变量总数)。任意一次循环过程执行完毕后,某个循环变量/>过程终值可以由自身过程初值以及其它循环变量的过程初值表示,将它们之间的关系称作某个循环变量/>函数,记作:(k是循环变量的索引,c为循环次数,v代表具体某个循环变量)。
(3)循环变量值集合表示。每个循环变量的值是循环变量函数为循环次数的一个维度,所有循环变量的值集合记为VData,VData对应的值是一个多维向量,是由m×n个数排成的m行n列的矩阵:
。
步骤5:被分析循体可精确处理代码类型判定。基于步骤3和步骤4的循环代码模型和函数变量信息,分析循环出口数量、循环变量函数特征和循环变量特征,对比步骤2的可精确求解代码类型,判断被分析循环代码是否可精确求解类型。如果被分析循环代码是可精确求解代码类型,则转入步骤6,否则给出无法精确求解的结论。
具体的,所述步骤5中可精确求解循环代码类型判定流程:
(1)获取循环出口数量。可直接通过循环代码模型获取循环出口数量。
(2)分析循环变量函数特征。分析循环变量函数特征的本质是确认循环变量函数是否是可精确求解的等差/等比函数。循环变量函数无法直接从循环代码模型中获取,需要基于对循环代码模型分析、判断、计算得到。
(3)分析循环变量特征。首先分析循环变量的定值语句层级,如果语句层次都是1,则有全齐次特征;然后判断不同层次循环变量函数是否相同,如果相同,则有末次特征,否则不具有齐次或末次特征。
(4)将前三步的结果对比可精确求解循环代码类型库,如果存在,是可精确求解循环代码;否则不是可精确求解循环代码。
图4是可精确处理循环代码类型判定示意图。结合下面示例代码说明可精确处理循环代码类型判定流程。
第一步:获取循环出口数量
从循环代码模型可知:循环起始行为19行、终止行为22行、入口条件表达式i<100000000、出口数量为1、直接出口条件表达式i>=100000000、循环变量为i和j、i和j的初始值为0等信息,故循环出口数量可直接通过循环代码模型获取。
第二步:分析循环变量函数特征
在路径遍历过程中,当步进到第19行时,可知当前节点是一循环入口节点,如果循环次数是1,为首次循环,取出入口条件和循环变量i和j的初值vdata(1,0)和vdata(2,0),通过对入口条件表达式约束求解,可知循环不能跳出,只能进入。执行完一次循环后,从当前数据切片中取i和j的值vdata(1,1)和vdata(2,1),计算循环变量的差得到:
vdata(1,1)-vdata(1,0)=1
vdata(2,1)-vdata(2,0)=1
由此,初步判断vdata(1,c)和vdata(2,c)的值序列可能是等差数列,再应用数学归纳法证明这个假设。以循环入口行第19行为起点,假设当前循环为第N次循环,循环变量i和j的取值分别为vdata(1,N)和vdata(2,N),循环入口条件表达式取值为真,进入循环,按路径步进,当重新步进到第19行时,此时为第N+1次循环,i和j的取值分别为vdata(1,N+1)和vdata(2,N+1)。那么第N+1次时,不同循环变量同上次循环的循环变量之间的差记作vgap(key,c),可分别得到i和j的差的表达式:
vdata(1,N+1)-vdata(1,N)=vgap(1,N+1)
vdata(2,N+1)-vdata(2,N)=vgap(2,N+1)
然后应用循环相关数学知识应用中的表达式化简技术,可以得出:
vgap(1,N+1)=1
vgap(2,N+1)=1
由此可以得出vdata(1,c)和vdata(2,c)的值序列分别是等差数列,并且差是1。结合初始解和等差数列求和公式,可以得到i和j的循环变量函数:
vdata(1,c)=0+c*1
vdata(2,c)=0+c*1
再应用表达式化简技术后得到i和j的循环变量函数:
vdata(1,c)=c
vdata(2,c)=c
图5描述了循环代码表达式化简技术。循环代码的入口、出口条件以及循环变量函数的处理均涉及到表达式化简技术,是循环代码精确处理很重要的环节,其化简流程如下:
(1)获取原始表达式二叉树
对原始表达式进行解析,按照操作符的优先级创建表达式的二叉树。
(2)去括号
遍历原始二叉树表达式,应用数学分配律等数学知识删除所有不必须的括号。
(3)操作数分割
遍历去括号后的二叉树表达式,对于父操作符优先级同子操作符相同的操作符,将操作数分别存放到抽象操作数和数字/常量操作数两个表达式队列中。
(4)提取公因式
遍历抽象操作数表达式队列,分析各操作数对应的子表达式,将子表达式中的操作数及对应的操作符存储到一个子队列中。再次遍历抽象操作数表达式队列,提取当前操作数对应的子队列,遍历子队列中的子操作数,按顺序选取一个子操作数作为当前子操作数,遍历操作数队列中的后续操作数,在其对应的子操作数队列中搜索同当前子操作数相同的子操作数,如果搜索到当前子操作数,将当前子操作数队列以及被搜索子表达式队列分别分为两个部分:基础子操作数和系数表达式,基础操作数即公因式。记录当前表达式以及被比较的表达式的基础操作数,将系数表达式存储到系数对列中,如此反复遍历,直到全部遍历完毕。如果存在基础子操作数,则对具有相同基础子操作数的系数表达式继续提取公因式,直到不存在新的基础子操作数为止,相同的基础子操作数存储到基础子操作数对列中。
(5)合并同类项
首先将数字/常量操作数用其对应的操作符连接,形成一个操作数全部为数字/常量的表达式,计算该表达式的值作为数字部分操作数。
然后遍历提取公因式的结果对列,将具有相同基础子操作数队列的操作数的系数按照对应的操作符构成一个新的表达式,对该表达式进行表达式化简,得到简化后表达式,以其作为表达式的系数。由基础子操作数对列构建公因式表达式,公因式表达式和系数表达式以及对应的操作符一同构成新的简化后的表达式。
(6)整体计算
由于某些系数可能是0或者1,而这两个数字在表达式运算过程中具有特殊性,因此需要遍历简化后的表达式所对应的二叉树,按照数学运算规则对0操作数以及1操作数进行处理,处理完毕将得到最终化简后的表达式。
第三步:分析循环变量特征
分析循环变量i和j,发现i和j的所有定值语句层级都是1,不在任何分支中,vdata(1,c)和vdata(2,c)都相同,循环变量i和j为齐次循环变量,该循环为全齐次循环。
第四步:将前三步的结果对比可精确处理循环代码类型库,得出该循环为I型循环,至此,可以得出结论,该循环是可精确处理循环代码。
步骤6:被分析循环变量函数求解。根据步骤1的数学知识库、步骤3的出口条件和步骤4的循环出口变量函数,建立循环出口方程,然后结合步骤3的循环出口变量初值,求出最大循环次数;将最大循环次数代入步骤4的各循环变量函数,得到跳出循环后全部循环变量对应的循环变量值集合。
具体的,所述步骤6中循环变量函数求解流程:
(1)构建循环出口方程。基于出口条件表达式和循环出口变量函数,利用表达式化简技术,构建循环出口方程。
(2)求解最大循环次数。根据循环出口方程以及循环出口变量初始值计算出循环出口方程的解,如果有解,此解为最大循环次数;如果无解,则可判断该循环为死循环,循环代码处理流程终止并给出提示。
(3)计算循环变量值。将最大循环次数代入各循环变量函数,得到跳出循环后全部循环变量对应的循环变量值集合。
图6是循环变量函数求解过程示例图。结合下面示例代码说明求解过程。
第一步:构建循环出口方程
循环函数求解的第一步是基于出口条件表达式和循环变量函数构建出口方程。当前循环没有间接循环出口条件表达式,只有一个直接出口条件表达式,为入口条件的取否操作:
!(i<100000000)
出口条件中仅应用了循环变量i,将i的循环变量函数带入到出口条件表达式,应用数学知识库中逻辑表达式等价变换以及公式整理,得到一个简单不等式方程即循环出口方程:
c>=100000000
第二步:求解最大循环次数
循环出口方程是一个以循环次数为未知数的不等式方程,结合循环次数自身特性,可以求出该不等式的最小值就是最大循环次数,为100000000,含义是在第100000000次循环后达到循环出口,循环出口条件表达式取值为真,跳出循环。
第三步:计算循环变量值
最大循环次数为10000000时的对应的循环变量函数值就是跳出循环时循环变量的终止值。将循环次数100000000分别带入到i的循环函数以及j的循环函数,即i=100000000、j=100000000,从而得到循环变量终止值集合为{100000000,100000000}。
步骤7:被分析循环代码等价建立。将循环变量值集合更新到对应的变量存储空间中,继而建立循环等价节点,以更新后的变量存储空间作为循环等价节点的即时数据,用循环等价节点替换路径中的所有当前循环节点,构建等价路径,完成对当前循环代码的精确处理。
具体的,所述步骤7中循环代码等价建立流程:
(1)数据更新。获取跳出循环后全部循环变量值后,遍历该循环变量值集合,将其更新到变量的当前数据空间中,根据变量类型选择更新数据切片或者仿真地址空间。
(2)创建循环等价节点。以循环起始行为行号,以当前的变量值为数据切片,以循环终止节点为目标结点,创建一个虚拟循环等价节点。
(3)路径回溯。删除路径中的当前循环相关节点,将路径回溯到首次进入循环之前的节点。
(4)添加循环等价节点。添加虚拟循环等价节点到回溯后的路径中,以虚拟循环等价节点作为当前节点,继续进行后续的路径步进。如果用到相关循环变量,从数据切片中取到的变量值是精确的数据,提高了代码静态分析结果的正确性。
本发明还提供了一种面向软件静态分析的循环代码处理装置,用于实现上述的方法,包括:
循环代码数学知识库模块:分析人工可求解循环代码的结构,并复原人工求解循环的思路,提炼循环代码求解过程中所应用的数学知识,构建求解循环代码的数学知识库;
可精确求解循环代码类型库模块:从循环出口数量、循环变量函数特征以及循环变量特征三方面组合建立可精确求解循环代码类型库;
循环代码模型构建模块:构建被分析循环代码模型,包括循环定义、循环变量集合以及循环体控制流程图三部分;
循环变量函数构建模块:基于被分析循环代码的循环变量值的变化规律,构建被分析循环代码的循环变量函数;
判定模块:基于被分析循环代码模型与循环变量函数,分析循环出口数量、循环变量函数特征和循环变量特征,与可精确求解循环代码类型库中的可精确求解代码类型进行对比,判断被分析循环代码是否为可精确求解代码类型;
循环代码求解模块:根据数学知识库、循环定义和循环变量函数,建立循环出口方程,结合循环出口变量初值,求解最大循环次数;将最大循环次数代入被分析循环代码的循环变量函数,得到跳出循环后全部循环变量对应的循环变量值集合;
循环等价节点构建模块:将被分析循环代码的循环变量值集合更新到对应的变量存储空间中,继而建立循环等价节点,以更新后的变量存储空间作为循环等价节点的即时数据,用循环等价节点替换路径中的所有当前循环节点,构建等价路径。
以上所述仅为本发明的具体实施方式,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (4)
1.一种面向软件静态分析的循环代码处理方法,其特征在于,包括以下步骤:
步骤1,分析人工可求解循环代码的结构,并复原人工求解循环的思路,提炼循环代码求解过程中所应用的数学知识,构建求解循环代码的数学知识库;
步骤2,从循环出口数量、循环变量函数特征以及循环变量特征三方面组合建立可精确求解循环代码类型库;
步骤3,构建被分析循环代码模型,包括循环定义、循环变量集合以及循环体控制流程图三部分;
步骤4:基于被分析循环代码的循环变量值的变化规律,构建被分析循环代码的循环变量函数;
步骤5,基于步骤3的被分析循环代码模型、步骤4的被分析循环代码的循环变量函数,分析循环出口数量、循环变量函数特征和循环变量特征,与步骤2的可精确求解循环代码类型库中的可精确求解代码类型进行对比,判断被分析循环代码是否为可精确求解代码类型;如果是,则进入步骤6,否则给出无法精确求解的结论;
步骤6,根据步骤1的数学知识库、步骤3的循环定义和步骤4的循环变量函数,建立循环出口方程,结合循环出口变量初值,求解最大循环次数;将最大循环次数代入被分析循环代码的循环变量函数,得到跳出循环后全部循环变量对应的循环变量值集合;
步骤7,将被分析循环代码的循环变量值集合更新到对应的变量存储空间中,继而建立循环等价节点,以更新后的变量存储空间作为循环等价节点的即时数据,用循环等价节点替换路径中的所有当前循环节点,构建等价路径,完成对被分析循环代码的处理;
所述步骤 1 中的循环代码的数学知识库的构建流程:
(1)通过对已知人工可求解循环代码结构进行归纳分析,梳理人工求解的具体方法,从中提取出所应用的数学知识;
(2)从表达式处理、函数求解或数学归纳提取循环变量特征和循环函数特征;并对获取的可求解循环代码集合中各循环代码结构的特征进行分析,包括循环出口特征分析以及循环变量特征分析;
(3)在获取循环出口特征集合以及循环变量特征集合的基础上,综合循环模型、循环相关数学知识以及人工处理方法集合,建立起循环特征同处理方法之间的映射,对可求解循环进行分类并构建可求解类型集合,并最终建立数学知识库;
所述步骤 5 中可精确求解循环代码类型判定流程:
(1)获取循环出口数量,直接通过循环代码模型获取循环出口数量;
(2)分析循环变量函数特征,分析循环变量函数特征的本质是确认循环变量函数是否是可精确求解的等差或等比函数,循环变量函数无法直接从循环代码模型中获取,需要基于对循环代码模型分析、判断和计算得到;
(3)分析循环变量特征,首先分析循环变量的定值语句层级,如果语句层次都是1,则有全齐次特征;然后判断不同层次循环变量函数是否相同,如果相同,则有末次特征,否则不具有齐次或末次特征;
(4)将前三步的结果对比可精确求解循环代码类型库,如果存在,是可精确求解循环代码;否则不是可精确求解循环代码。
2.根据权利要求1所述的面向软件静态分析的循环代码处理方法,其特征在于,所述步骤2,所述可精确求解循环代码类型库包括六种可精确求解循环代码类型:
I型循环:循环出口数量为1,循环变量函数特征均为等差或等比数列,循环变量特征为全齐次;
II型循环:循环出口数量为1,循环变量函数特征除末次循环变量外,均为等差或等比数列,循环变量特征为齐次和末次;
III型循环:循环出口数量为2,循环变量函数特征均为等差或等比数列,循环变量特征为全齐次;
IV型循环:循环出口数量为2,循环变量函数特征除末次循环变量外,均为等差或等比数列,循环变量特征为齐次和末次;
V型循环:循环出口数量大于2,循环变量函数特征均为等差或等比数列,循环变量特征为全齐次;
VI型循环:循环出口数量大于2,循环变量函数特征除末次循环变量外,均为等差或等比数列,循环变量特征为齐次和末次。
3.根据权利要求2所述的面向软件静态分析的循环代码处理方法,其特征在于,所述步骤3包括以下子步骤:
(1)解析循环代码:基于循环代码的词法和语法分析,构建循环代码的抽象语法树,生成循环代码元数据;
(2)获取循环定义信息:循环定义信息包括循环描述信息和循环出口信息两部分,其中循环描述信息从循环代码元数据中获取,循环出口信息通过分析出口描述信息、出口条件表达式、出口变量集合获取;
(3)获取循环变量信息:循环代码中所有已进行定值操作的变量构成循环变量集合;
(4)构建循环体控制流图:以循环代码元数据为基础,对循环代码进行块划分;基于块划分结果,以循环代码开始行为起点,各块的起始行为节点,循环代码终止行为终点,并依据块类型及块间关系将各节点连接在一起,构建循环控制流图。
4.一种面向软件静态分析的循环代码处理装置,用于执行如权利要求1-3任一项所述的循环代码处理方法,其特征在于,包括:
循环代码数学知识库模块:分析人工可求解循环代码的结构,并复原人工求解循环的思路,提炼循环代码求解过程中所应用的数学知识,构建求解循环代码的数学知识库;
可精确求解循环代码类型库模块:从循环出口数量、循环变量函数特征以及循环变量特征三方面组合建立可精确求解循环代码类型库;
循环代码模型构建模块:构建被分析循环代码模型,包括循环定义、循环变量集合以及循环体控制流程图三部分;
循环变量函数构建模块:基于被分析循环代码的循环变量值的变化规律,构建被分析循环代码的循环变量函数;
判定模块:基于被分析循环代码模型与循环变量函数,分析循环出口数量、循环变量函数特征和循环变量特征,与可精确求解循环代码类型库中的可精确求解代码类型进行对比,判断被分析循环代码是否为可精确求解代码类型;
循环代码求解模块:根据数学知识库、循环定义和循环变量函数,建立循环出口方程,结合循环出口变量初值,求解最大循环次数;将最大循环次数代入被分析循环代码的循环变量函数,得到跳出循环后全部循环变量对应的循环变量值集合;
循环等价节点构建模块:将被分析循环代码的循环变量值集合更新到对应的变量存储空间中,继而建立循环等价节点,以更新后的变量存储空间作为循环等价节点的即时数据,用循环等价节点替换路径中的所有当前循环节点,构建等价路径。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310691699.XA CN116467220B (zh) | 2023-06-13 | 2023-06-13 | 一种面向软件静态分析的循环代码处理方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310691699.XA CN116467220B (zh) | 2023-06-13 | 2023-06-13 | 一种面向软件静态分析的循环代码处理方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116467220A CN116467220A (zh) | 2023-07-21 |
CN116467220B true CN116467220B (zh) | 2023-09-08 |
Family
ID=87182855
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310691699.XA Active CN116467220B (zh) | 2023-06-13 | 2023-06-13 | 一种面向软件静态分析的循环代码处理方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116467220B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2005071534A2 (en) * | 2003-12-11 | 2005-08-04 | Erkki Laitila | A process for simulating and analysing an object-oriented code and the corresponding software product |
CN102054149A (zh) * | 2009-11-06 | 2011-05-11 | 中国科学院研究生院 | 一种恶意代码行为特征提取方法 |
CN104317572A (zh) * | 2014-09-30 | 2015-01-28 | 南京大学 | 一种实时系统的循环边界内向分析方法 |
CN113760700A (zh) * | 2020-08-06 | 2021-12-07 | 北京京东振世信息技术有限公司 | 程序死循环检测方法、装置、电子设备及存储介质 |
CN115438341A (zh) * | 2022-09-06 | 2022-12-06 | 北京航空航天大学 | 提取代码循环计数器的方法、装置、存储介质和电子设备 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8522226B2 (en) * | 2009-02-09 | 2013-08-27 | Nec Laboratories America, Inc. | Control structure refinement of loops using static analysis |
US20110271265A1 (en) * | 2010-04-28 | 2011-11-03 | Drozdov Alexander Y | Method of automatic generation of executable code for multi-core parallel processing |
US9158506B2 (en) * | 2014-02-27 | 2015-10-13 | Tata Consultancy Services Limited | Loop abstraction for model checking |
US9619375B2 (en) * | 2014-05-23 | 2017-04-11 | Carnegie Mellon University | Methods and systems for automatically testing software |
-
2023
- 2023-06-13 CN CN202310691699.XA patent/CN116467220B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2005071534A2 (en) * | 2003-12-11 | 2005-08-04 | Erkki Laitila | A process for simulating and analysing an object-oriented code and the corresponding software product |
CN102054149A (zh) * | 2009-11-06 | 2011-05-11 | 中国科学院研究生院 | 一种恶意代码行为特征提取方法 |
CN104317572A (zh) * | 2014-09-30 | 2015-01-28 | 南京大学 | 一种实时系统的循环边界内向分析方法 |
CN113760700A (zh) * | 2020-08-06 | 2021-12-07 | 北京京东振世信息技术有限公司 | 程序死循环检测方法、装置、电子设备及存储介质 |
CN115438341A (zh) * | 2022-09-06 | 2022-12-06 | 北京航空航天大学 | 提取代码循环计数器的方法、装置、存储介质和电子设备 |
Non-Patent Citations (1)
Title |
---|
基本路径覆盖测试探针插桩技术研究;施冬梅;;计算机工程与设计(第13期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN116467220A (zh) | 2023-07-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Brameier et al. | Basic concepts of linear genetic programming | |
Chockler et al. | Incremental formal verification of hardware | |
CN101697121A (zh) | 一种基于程序源代码语义分析的代码相似度检测方法 | |
CN113064586B (zh) | 一种基于抽象语法树增广图模型的代码补全方法 | |
CN112765031B (zh) | 一种群智化漏洞挖掘任务的分解方法 | |
CN108647146B (zh) | 基于修正条件判定组合覆盖的测试用例生成方法 | |
CN106682343A (zh) | 一种基于图的邻接矩阵的形式化验证方法 | |
CN108491228A (zh) | 一种二进制漏洞代码克隆检测方法及系统 | |
CN108563561B (zh) | 一种程序隐性约束提取方法及系统 | |
Mateescu et al. | CTRL: Extension of CTL with regular expressions and fairness operators to verify genetic regulatory networks | |
Rubin | Parameterised verification of autonomous mobile-agents in static but unknown environments | |
CN116702157B (zh) | 一种基于神经网络的智能合约漏洞检测方法 | |
CN116467220B (zh) | 一种面向软件静态分析的循环代码处理方法和装置 | |
CN116776981A (zh) | 基于大型预训练语言模型的api关系推理方法及系统 | |
Turlea et al. | A test suite generation approach based on EFSMs using a multi-objective genetic algorithm | |
Nagashima | Smart induction for Isabelle/HOL (tool paper) | |
Xu et al. | Extracting trigger-sharing events via an event matrix | |
CN112905232B (zh) | 一种基于语法分析树的程序代码平行语料挖掘方法及系统 | |
CN115438341A (zh) | 提取代码循环计数器的方法、装置、存储介质和电子设备 | |
Ma et al. | Parallel exact inference on multicore using mapreduce | |
CN109710538A (zh) | 一种用于大规模系统中状态相关缺陷的静态检测方法 | |
CN115879868B (zh) | 一种专家系统与深度学习相融合的智能合约安全审计方法 | |
Romanov et al. | Approaches for Representing Software as Graphs for Machine Learning Applications | |
CN113721977B (zh) | 编程数据的处理方法与装置 | |
US20220207416A1 (en) | System and method of providing correction assistance on machine learning workflow predictions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |