CN117897694A - 静态分析方法、装置和设备及计算机可读存储介质 - Google Patents

静态分析方法、装置和设备及计算机可读存储介质 Download PDF

Info

Publication number
CN117897694A
CN117897694A CN202280057286.XA CN202280057286A CN117897694A CN 117897694 A CN117897694 A CN 117897694A CN 202280057286 A CN202280057286 A CN 202280057286A CN 117897694 A CN117897694 A CN 117897694A
Authority
CN
China
Prior art keywords
function
queue
analysis
tus
functions
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.)
Pending
Application number
CN202280057286.XA
Other languages
English (en)
Inventor
派佛·马朱耶夫
黄理骏
亚历山大·格拉西莫夫
尚景亮
张振华
维奥妮卡·布可维奇
赵斗生
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
XFusion Digital Technologies Co Ltd
Original Assignee
XFusion Digital Technologies Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Priority claimed from RU2021124956A external-priority patent/RU2021124956A/ru
Application filed by XFusion Digital Technologies Co Ltd filed Critical XFusion Digital Technologies Co Ltd
Publication of CN117897694A publication Critical patent/CN117897694A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding

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

本申请提供了一种静态分析方法,所述静态分析方法包括:接收第一请求,其中,所述第一请求用于对第一对象执行问题分析;对与所述第一对象相关联的编译单元(translation unit,TU)执行问题分析,以在完成所述分析后生成所述第一对象的问题分析结果;发送所述问题分析结果。所述第一对象包括至少一个源文件。因此,实现了一种以TU为粒度对所述第一对象执行问题分析的方法,以提高静态分析效率。

Description

静态分析方法、装置和设备及计算机可读存储介质
本申请要求于2021年8月24日递交的申请号为RU2021124956的俄罗斯专利申请案的优先权,其全部内容通过引用结合在本申请中。
技术领域
本申请涉及计算机技术领域,更具体地,涉及一种软件检测技术中的静态分析方法、装置和设备及计算机可读存储介质。
背景技术
静态分析技术是一种在不执行程序的情况下对软件程序代码进行分析的技术。静态分析技术的关键功能是检查软件的表示和描述是否一致,是否存在冲突或歧义。作为白盒测试的一种,静态分析技术在软件程序代码的质量测试中起着重要作用。
然而,随着企业级软件(例如,存储软件)和云软件的快速发展,如今的软件产品呈现出规模更大、结构更复杂的趋势。然而,现有静态分析技术的局限性逐渐显露出来。以存储场景为例,一个存储系统可以包括多个子系统,其中,单个子系统的源代码规模可高达500万行。在现有静态分析技术中,通常以逐行扫描代码的方式执行分析。因此,在整个分析过程中,分析处理效率较低。因此,如何提供一种高效的静态分析方法成为亟待解决的技术问题。
发明内容
本申请提供了一种静态分析方法、装置和设备及计算机可读存储介质,以提高静态分析效率。
根据第一方面,提供了一种静态分析方法。所述方法可以通过静态分析工具(例如,静态分析软件)来执行,也可以通过安装有所述静态分析工具的设备来执行。本申请对此不作限制。所述方法包括:接收第一请求,其中,所述第一请求用于对第一对象执行问题分析;对与所述第一对象相关联的编译单元(translation unit,TU)执行问题分析,以在完成所述分析后生成所述第一对象的问题分析结果;发送所述问题分析结果。所述第一对象包括至少一个源文件。
基于上述方案,在本申请提供的静态分析方法中,在对所述第一对象进行问题分析期间,所述第一对象的所述源文件与所述TU相关联,所述TU可以包括所述至少一个源文件。在具体问题分析期间,以所述TU为粒度,不需要生成所述第一对象中包括的所有函数的调用关系图,可以同时选择多个TU进行并行处理,以提高静态分析效率。
在一种可能的实现方式中,扫描所述第一对象的所述源文件,生成TU队列。所述TU队列包括N个TU,N是大于或等于1的整数,所述TU队列中的每个TU与至少一个源文件中的至少一个函数相关联。具体地,基于所述TU队列对与所述TU队列中的所述N个TU相关联的函数执行问题分析,以生成所述第一对象的所述问题分析结果。
基于上述方案,所述TU队列中的所述TU可以与一个源文件中的函数相关联,也可以与多个源文件中的函数相关联。如果所述TU与多个源文件中的函数相关联,则在本申请中以TU为粒度执行问题分析的方案可以应用于更复杂的跨文件问题分析场景。
参考所述第一方面,在所述第一方面的一些实现方式中,在对所述第一对象进行分析期间,选择所述TU队列中的第一TU,并确定与所述第一TU相关联的第一函数集。所述第一函数集包括与所述第一TU相关联的源文件中的函数。对所述第一函数集中的任意一个函数(例如,第一函数)进行分析,并确定所述第一函数的分析结果。所述第一函数的所述分析结果包括所述第一函数的调用关系或所述第一函数的质量问题中的至少一者。当存在与所述第一函数有调用关系的函数时(例如,所述第一函数调用另一函数),对第二函数集进行分析,并确定所述第二函数集中的函数的分析结果。所述第二函数集包括与所述第一函数有所述调用关系的至少一个函数(换句话说,所述第二函数集中包括的所述函数由所述第一函数调用)。当完成对所述TU队列中的全部所述TU的分析时,生成所述第一对象的所述问题分析结果。
在另一种可能的实现方式中,在对所述第一对象进行分析期间,可以从所述TU队列中选择至少两个TU,并对与所述两个TU相关联的函数执行同步分析。
基于上述方案,通过对所述多个TU执行并行处理来执行问题分析,以提高静态分析效率。
在另一种可能的实现方式中,在完成对与所述TU队列中的所述第一TU相关联的所有函数的分析后,从所述TU队列中删除所述第一TU。
基于上述方案,所述TU队列保存在系统的存储器中。因此,当完成对所述TU队列中的所述第一TU的分析时,或者当完成对所述TU队列中的所述第一TU的分析并且与所述第一TU相关联的所述函数未被与另一TU相关联的函数调用时,从所述TU队列中删除所述第一TU,以减少所述系统的内存消耗。
在另一种可能的实现方式中,如果在所述分析完成前所述第一TU所在的队列称为第一TU队列,则在所述第一TU的分析完成时,所述第一TU队列会更新为第二TU队列。如果在静态分析过程中在可视界面中呈现所述TU队列的变化,则可以得知所述第一TU队列中的TU的数量大于所述第二TU队列中的TU的数量,因为在对所述TU队列中的所述TU进行分析的过程中,会从所述TU队列中删除分析完成的TU。
在另一种可能的实现方式中,所述TU队列中的每个TU包括热度,所述热度用于标识所述TU关联的的函数被调用的次数,使得当从所述TU队列中选择TU进行分析时,可以基于所述TU队列中的所述TU的所述热度来选择所述第一TU,并且所述第一TU的热度标识符高于第一阈值。
基于上述方案,可以基于与所述TU队列中的每个TU相关联的函数被调用的次数来确定所述TU队列中的每个TU的处理优先级,从而优先分析与所述TU相关联并且被调用次数较多的函数。
在另一种可能的实现方式中,在对所述第一TU进行分析期间,如果发现与所述第一TU相关联的所述函数调用另一函数,例如,与所述第一TU相关联的所述函数是第三函数,所述第三函数调用第四函数,与所述第四函数相关联的TU是第二TU。在这种情况下,所述TU队列中的所述第二TU的热度增加。假设在开始分析所述第一TU前所述第一TU所在的TU队列称为第三TU队列。在确定与所述第一TU相关联的函数调用另一函数时,所述第三TU队列会更新为第四TU队列。应当理解的是,在该过程中,对所述第一TU的所述分析未完成。如果在所述静态分析过程中在所述可视界面中呈现所述TU队列的变化,则可以得知所述第三TU队列中的所述第二TU的热度低于所述第四TU队列中的所述第二TU的热度。
应当理解的是,上述描述中涉及的所述第一TU队列、所述第二TU队列、所述第三TU队列和所述第四TU队列在所述系统的所述存储器中作为一个TU队列呈现。所述第一TU队列、所述第二TU队列、所述第三TU队列和所述第四TU队列仅用于区分在所述静态分析过程中所述TU队列的变化。
在另一种可能的实现方式中,基于与所述TU队列中的所述TU相关联的函数的热度来更新所述TU队列中的所述TU的所述热度。换句话说,与所述TU相关联的所述函数被调用的次数越多,所述TU队列中的所述TU的热度越高。基于所述更新的热度(即,随着所述TU被调用的次数增加而更新的热度)对所述TU队列中的所述TU的优先级进行排序。
在另一种可能的实现方式中,具体地,在对所述第一TU进行分析期间,如果与所述第一TU相关联的所述函数包括第二函数,则在完成对所述第二函数的分析后,确定是否完成了对调用所述第二函数的函数的分析。如果完成了对调用所述第二函数的每个函数的分析,则从所述存储器中清除所述第二函数以及在对所述第二函数进行分析的过程中生成的数据。
基于上述方案,从所述存储器中删除后续分析不需要的一些数据,以避免进一步静态分析带来的内存扩展问题,换句话说,减少所述系统的内存消耗。
在另一种可能的实现方式中,具体地,在对所述第一TU进行分析期间,如果与所述第一TU相关联的所述函数包括第二函数,则在完成对所述第二函数的分析后,生成所述第二函数的概要信息(例如,返回值、所述函数的函数、内部逻辑或环境变量),对所述第二函数的所述概要信息进行压缩,并将所述压缩的概要信息存储在查找表中。
基于上述方案,对所述函数的所述概要信息进行压缩,以进一步减少所述系统的内存消耗。
根据第二方面,本申请提供了一种静态分析装置。所述装置包括用于执行所述第一方面或所述第一方面的可能的实现方式中的任一项所述的方法的每个模块。
根据第三方面,本申请提供了一种静态分析设备。所述设备包括处理器,所述处理器耦接到存储器,所述存储器用于存储计算机程序或指令,所述处理器用于执行所述存储器中的所述计算机程序或所述指令,使得所述设备执行所述第一方面或所述第一方面的可能的实现方式中的任一项所述的方法。
根据第四方面,本申请提供了一种静态分析设备。所述设备包括处理器,所述处理器用于:从存储器中调用计算机程序,并运行所述计算机程序,使得所述设备执行所述第一方面或所述第一方面的可能的实现方式中的任一项所述的方法。
根据第五方面,本申请提供了一种计算机可读存储介质。所述计算机可读介质中存储有要由计算设备执行的程序代码,所述程序代码包括指令,所述指令用于执行所述第一方面或所述第一方面的实现方式中的任一项所述的方法。
基于上述方面提供的实现方式,本申请可以通过进一步的组合提供更多的实现方式。
附图说明
图1是使用本申请提供的静态分析方法的场景图;
图2是本申请提供的静态分析方法的流程图;
图3是本申请提供的TU队列中的TU的排序变化的示意图;
图4是本申请提供的以TU为粒度执行分析的原理流程图;
图5是本申请提供的静态分析工具的结构示意图;
图6是本申请提供的另一种静态分析方法的交互流程图;
图7是本申请提供的静态分析装置的示意框图;
图8是本申请提供的另一种静态分析装置的结构示意图。
具体实施方式
下面参考附图对本申请的技术方案进行描述。
图1是使用本申请提供的静态分析方法的场景图。用户10、第一设备20和静态分析工具30如图所示,静态分析工具30安装在第一设备20中。当用户10需要对对象(项目或软件)执行静态分析时,用户10需要操作第一设备20,并向安装在第一设备20中的静态分析工具30发起问题分析请求(例如,问题分析请求可以用于请求对对象的安全漏洞、代码错误、空指针等问题进行分析),以运行静态分析工具30,使得静态分析工具30对对象执行问题分析,并且在静态分析工具30完成分析后,静态分析工具30向第一设备20输出问题分析结果(例如,问题分析报告)。待分析的对象可以存储在第一设备20中或连接到第一设备20的另一设备中,本申请对此不作限制。
本申请中的静态分析工具30可以是静态分析软件,可以是用于静态分析的数据包,也可以是可执行文件,本申请对此不作限制。
应当理解的是,图1的示例中的第一设备20是笔记本电脑,但该示例并不构成对本申请的保护范围的限制。本申请中的第一设备20可以是服务器,包括基于网络规模、架构、用途、外观等分类的各种服务器。或者,第一设备20可以是智能终端,例如移动电话、平板电脑(pad)、具有无线收发器功能的计算机、虚拟现实(virtual reality,VR)终端、增强现实(augmented reality,AR)终端、工业控制无线终端、自动驾驶无线终端、远程医疗无线终端、智能电网无线终端、交通安全无线终端、智慧城市无线终端、智能家居无线终端、蜂窝电话、无绳电话机、会话发起协议(session initiation protocol,SIP)电话、无线本地环路(wireless local loop,WLL)站、个人数字助理(personal digital assistant,PDA)、具有无线通信功能的手持设备、连接到无线调制解调器的计算设备或另一处理设备、车载设备、可穿戴设备、5G网络中的终端或未来演进网络中的终端。本申请对此不作限制。
图2是本申请提供的静态分析方法的流程图。图2所示的方法200可以由静态分析工具执行,方法200包括以下步骤。
步骤S210:接收第一请求,其中,所述第一请求用于对第一对象执行问题分析。
例如,所述第一对象可以是项目、软件或一组源代码。本申请对此不作限制。
步骤S220:对与所述第一对象相关联的编译单元(translation unit,TU)执行问题分析,以生成所述第一对象的问题分析结果。
具体地,扫描所述第一对象中包括的源文件,以生成TU队列。所述TU队列包括N个TU,N是大于或等于1的整数,所述TU队列中的每个TU与至少一个源文件中的至少一个函数相关联。
基于所述TU队列,对与所述TU队列中的所述N个TU相关联的函数执行问题分析,以生成所述第一对象的问题分析结果。
可选地,所述TU队列中的一个TU包括一个或多个源文件,一个源文件包括一个或多个函数。
例如,所述第一对象包括100个源文件,在扫描过程中生成TU队列。应当理解的是,所述TU队列保存在存储器中。例如,所述TU队列可以是所述存储器中的数组,或者所述TU队列可以是一种数据组织方式。所述TU队列可以包括100个TU,也可以包括10个TU。假设所述TU队列包括100个TU,基于平均分配原则,所述TU队列中的每个TU与一个源文件中包括的函数相关联。假设所述TU队列包括10个TU,基于平均分配原则,所述TU队列中的每个TU与10个源文件中包括的函数相关联。当然,也可以不采用所述平均分配原则。具体而言,所述TU队列中的每个TU与不同数量的源文件相关联,但所述TU队列中的全部所述TU总共与100个源文件相关联。本申请对此不作限制。
应当理解的是,在上述示例中,在生成所述TU队列的过程中,TU是基于源文件的数量建立的,或者TU可以以另一种方式建立。本申请对此不作限制。
例如,对所述项目的所有源文件进行一次扫描,以生成所述TU队列以及所述TU队列中的TU(每个TU与一个源文件相关联)与函数之间的对应关系。
具体地,在所述扫描过程中,每个源文件具有标识符,所述标识符用于唯一地标识每个源文件。假设所述TU队列中的TU 1与一个源文件相关联。例如,TU 1与源文件#1相关联,源文件#1包括三个函数(例如,函数1、函数2和函数3)。因此,在所述扫描过程中生成三种对应关系,具体而言,源文件#1与函数1之间的对应关系、源文件#1与函数2之间的对应关系以及源文件#1与函数3之间的对应关系。换句话说,在所述扫描过程中生成TU 1与函数1之间的对应关系、TU 1与函数2之间的对应关系以及TU 1与函数3之间的对应关系。应当理解的是,所述TU队列中的另一TU与函数之间的对应关系可以通过类推生成。最终生成的TU队列包括N个TU以及所述N个TU中的每一个TU与每一个函数之间的对应关系。应当理解的是,一个TU与一个函数之间之间存在对应关系也可以如下所述:所述TU与所述函数相关联,所述函数可以描述为与所述TU相关联的函数。TU与源文件相关联意味着TU与源文件之间存在对应关系,所述源文件可以描述为与所述TU相关联的源文件。本申请对此不作限制。
应当理解的是,当基于所述TU队列对与所述TU队列中的所述N个TU相关联的所述函数执行问题分析时,从所述TU队列中选择一个TU,并对与所述TU相关联的函数进行分析。直到完成对所述TU队列中的全部所述TU的分析,才认为所述第一对象的所述问题分析完成。
具体地,在对所述第一对象进行分析期间,从所述TU队列中选择任何TU(为了便于描述,也可以称为第一TU),并确定与所述第一TU相关联的第一函数集。所述第一函数集包括与所述第一TU相关联的源文件中的函数。对所述第一函数集中的任意函数(例如,第一函数)进行分析,并确定所述第一函数的分析结果。所述第一函数的所述分析结果包括所述第一函数的调用关系和所述第一函数的质量问题中的至少一者。当存在与所述第一函数有调用关系的函数时(例如,所述第一函数调用另一函数),对第二函数集进行分析,并确定所述第二函数集中的函数的分析结果。所述第二函数集包括与所述第一函数有所述调用关系的至少一个函数(换句话说,所述第二函数集中包括的所述函数由所述第一函数调用)。当完成对所述TU队列中的全部所述TU的所述分析时,生成所述第一对象的所述问题分析结果。
例如,在对所述第一对象进行分析期间,选择所述TU队列中的TU 1,确定所述第一函数集。具体而言,确定函数1、函数2和函数3。然后,对函数1、函数2和函数3进行分析。在分析过程中,如果函数1、函数2和函数3不调用另一函数,则确定上述函数的分析结果。所述分析结果包括所述函数的调用关系和所述函数的质量问题中的至少一者。如果假设函数2在分析过程中调用了函数4和函数5,则需要在完成对所述第二函数集(函数4和函数5)的分析后对函数2进行分析。应当理解的是,函数4和函数5可以与相同的TU相关联,也可以与不同的TU相关联。在根据上述分析规则完成对所述TU队列中的全部所述TU的所述分析时,生成所述第一对象的所述问题分析结果。
应当理解的是,分析TU 1就是分析与TU 1相关联的所有函数。如果在所述分析过程中发现与TU 1相关联的函数调用另一函数,则将调用所述另一函数的这个函数放入等待池中。如果与TU 1相关联的函数不调用另一函数,则直接完成对所述函数的分析。在完成对与TU 1相关联的所述函数的处理后,可以对下一个TU进行分析。所述等待池在所述存储器中有特定的存储空间,并且可以是所述存储器中的数组。将所述函数放入所述等待池中的一种实现方式可以是通过使用队列或数据库或者通过指定所述存储空间来存储所述函数。在完成对所述调用的函数的分析后,可以对放入所述等待池中的所述函数进行分析。
例如,与TU 1相关联的所述函数包括函数1、函数2和函数3。函数1和函数3不调用另一函数,函数2调用函数4。因此,完成对函数1和函数3的分析,并将函数2放入所述等待池中。换句话说,完成对TU 1的处理。下一步,可以基于热度从所述TU队列中选择另一TU进行分析。在完成对函数4的分析后,可以对函数2进行分析。
可选地,当从所述TU队列中选择TU进行分析时,可以执行顺序选择,每次可以选择一个TU进行分析,也可以同时选择多个TU进行分析。当同时选择多个TU进行分析时,可以进一步提高静态分析效率。
应当理解的是,当同时选择多个TU进行分析时,与所述多个TU相关联的函数可以调用相同的另一函数。在这种情况下,当对所述多个TU中的每一个进行分析时,可以对所述调用的相同的另一函数进行一次分析,以减少冗余分析。或者,可以通过使用标识信息来标识对所述函数进行了分析。
可选地,所述TU队列中的每个TU包括热度,所述热度用于标识TU关联的函数被调用的次数。当从所述TU队列中选择所述第一TU时,可以基于所述TU队列中的每个TU的所述热度来选择所述第一TU。所述第一TU的热度标识符(可以理解为热度值)高于第一阈值。
应当理解的是,所述热度是权重的一种表现形式,所述热度的值通过使用热度值来表示,所述热度值是权重值的一种表现形式。所述热度值可以通过使用颜色或另一种方式进行标识。本申请对此不作限制。
例如,当从所述TU队列中选择TU时,优先选择其热度值高于所述第一阈值的TU进行分析。
可选地,所述TU队列中的每个TU的所述热度可以基于与所述TU相关联的函数被调用的次数或频率来确定。
可选地,所述TU队列中的每个TU的所述热度也可以基于与所述TU相关联的函数在执行时所述TU的空间占用率来确定。
例如,假设对于所述TU队列中的所述第一TU,每当与另一TU相关联的函数调用与所述第一TU相关联的函数时,所述第一TU的所述热度值会更新一次。因此,与所述第一TU相关联的函数被调用的次数越多,表明所述第一TU的热度值越高。或者,可以理解的是,与所述第一TU相关联的函数被调用的次数越多,表明所述TU队列中的所述第一TU的优先级越高。当随后从所述TU队列中选择TU时,基于优先选择具有高热度值的TU进行分析。
可选地,在对与所述TU相关联的函数进行分析期间,每次完成对函数的分析时,都会生成与所述函数相对应的控制流图(control flow graph,CFG)和抽象语法树(abstractsyntax tree,AST),并将所述函数的概要信息存储在查找表中。所述函数的概要信息可以理解为对所述函数的行为的描述。如果在后续分析中存在调用所述函数的TU,则可以基于所述函数的所述概要信息来获知所述函数在特定条件下执行特定操作以输出特定结果,从而对所述TU进行进一步分析。
可选地,所述函数的所述概要信息可以包括以下各项中的一项或多项:所述函数的调用参数、所述函数的返回值、所述函数的功能、所述函数的内部逻辑以及所述函数的环境变量。
可选地,对所述函数的概要信息进行压缩,并将其存储在所述查找表中。
例如,在对所述函数的所述概要信息进行压缩后,所述函数的所述概要信息占用的内存空间减少,静态分析过程中的内存开销进一步减少。
具体地,可以选择现有压缩工具来对所述函数的概要信息进行压缩。
可选地,当完成对与所述第一TU相关联的所述第一函数的分析,并且完成对调用所述第一函数的所有其他函数的分析时,可以从所述存储器中清除所述第一函数以及与所述第一函数相对应的CFG和AST。
应当理解的是,当完成对与所述第一TU相关联的所述第一函数的分析,并且完成对调用所述第一函数的所有其他函数的所述分析时,表明所述第一函数不再被任意函数调用。在这种情况下,从所述存储器中清除所述第一函数以及与所述第一函数相对应的CFG和AST,只保留所述第一函数的所述概要信息。
可选地,当完成对与所述第一TU相关联的全部函数的分析时,从所述TU队列中清除所述第一TU。或者,当完成对与所述第一TU相关联的全部函数的分析,并且完成对调用与所述第一TU相关联的所述函数的所有其他函数的所述分析时,从所述TU队列中清除所述第一TU。
应当理解的是,当对与所述第一TU相关联的全部所述函数进行分析,并且完成对调用与所述第一TU相关联的所述函数的所有其他函数的分析时,表明与所述第一TU相关联的全部所述函数不再被任意函数调用。在这种情况下,从所述TU队列中清除所述第一TU,以减少系统的内存开销。
步骤S230:发送所述第一对象的问题分析结果。
在步骤S220中,在从所述TU队列中选择TU进行分析的过程中,所述TU队列中的TU的优先级排序变化如图3所示。
在本申请提供的静态分析方法200中,在对所述第一对象进行问题分析期间,所述第一对象的所述源文件与所述TU相关联,所述TU可以包括所述至少一个源文件。在具体问题分析期间,以TU为粒度,不需要生成所述第一对象中包括的全部函数的调用关系图,可以同时选择多个TU进行并行处理,以提高静态分析效率。此外,在具体分析过程中,可以从所述存储器中清除分析已完成且未被调用的TU或函数,以减少系统的内存开销。图3是本申请提供的TU队列中的TU的排序变化的示意图。
图3所示的TU队列10包括四个TU,每个TU与一个源文件(以图3中的文件为例,图4也是如此)相关联。可以理解的是,每个TU包括一个源文件,每个源文件与两个函数相关联。可以理解的是,每个源文件包括两个函数。TU队列10中的TU的数量、每个TU中包括的源文件的数量以及每个源文件中包括的函数的数量仅仅是示例。本申请对此不作限制。如图所示,在执行分析前,初始TU队列10中的TU的排序是随机排序,从上到下分别为TU 1、TU 2、TU 3和TU 4。TU 1与源文件1相关联,源文件1包括函数(function,func)1和函数2;TU 2与源文件2相关联,源文件2包括函数3和函数4;TU 3与源文件3相关联,源文件3包括函数5和函数6;TU 4包括源文件4,源文件4包括函数7和函数8。
在第一次分析期间,从TU队列10中随机选择TU 1进行分析。如图所示,TU 1中的函数2调用TU 3中的函数5。因此,TU 3的热度值增加。例如,在第一次分析前,TU 1、TU 2、TU 3和TU 4的热度值均为0。在对TU 1进行分析后,发现TU 1中的函数2调用TU 3中的函数5,增加了TU 3的所述热度值,使得TU 3的所述热度值更新为1。如图所示,经过重新排序后,TU 3在TU队列10中的热度值最高。
在具体分析期间,对与TU 3相对应的函数5和函数6进行分析。在完成所述分析后,对函数2和函数1进行分析。在对函数2进行分析期间,需要使用函数5的分析结果。应当理解的是,在完成对与TU 3和TU 1相对应的函数的分析后,如果确定没有另一函数调用函数1、函数2、函数5和函数6,则从TU队列10中清除TU 3和TU 1。如图所示,经过重新排序后,TU队列10中只有TU 2和TU 4。与初始分析期相比,TU队列10中的TU的数量减少,以减少系统的内存开销。
应当理解的是,根据本申请提供的静态分析方法,如果在TU队列10中呈现静态分析过程中的处理进度,则可以得知随着所述处理进度的推进,队列10中的TU的数量逐渐减少。
图4是本申请提供的以TU为粒度执行分析的原理流程图。
当需要对第一对象执行问题分析时,执行以下步骤。
步骤S410:扫描所述第一对象中包括的源文件,以生成TU队列10以及TU队列10中的每个TU与函数之间的对应关系。
图4所示的TU队列包括n个TU,所述n个TU依次为TU 1、TU 2、TU 3、......、TU n。每个TU与一个源文件相关联,每个源文件包括两个函数。所述TU队列中的TU的数量与图3类似。每个TU中包括的源文件的数量以及每个源文件中包括的函数的数量仅仅是示例。本申请对此不作限制。此外,图4仅示出了TU 1、TU 2和TU 3中的每一个与源文件和函数中的每一者之间的对应关系。具体而言,TU 1与源文件1相关联,源文件1包括函数1和函数2;TU 2与源文件2相关联,源文件2包括函数3和函数4;TU 3与源文件3相关联,源文件3包括函数5和函数6。该图中未示出其他TU与源文件和函数中的每一者之间的对应关系。
步骤S420:从TU队列10中选择TU。
在该步骤中,如果第一次执行选择,则可以从TU队列10中随机选择TU,并且可以同时选择一个或多个TU。如果不是第一次执行选择,则可以基于优先选择具有高热度值的TU的策略(例如,如果TU的热度值高于第一阈值,则选择所述TU)从TU队列10中选择TU,并且也可以同时选择一个或多个TU。
步骤S430:对与所述选择的TU相关联的函数进行分析。
为了清楚地描述,以所述选择的TU是TU 1为例。在该步骤中,对与TU 1相关联的函数1和函数2等所有函数进行分析。在分析过程中,生成与函数1和函数2中的每一个相对应的CFG和AST。
步骤S440:进一步分析函数1和函数2是否调用另一函数,其中,所述另一函数可以是已分析的函数,也可以是未分析的函数。
步骤S4410:假设与TU 1相关联的所述函数调用另一函数。例如,函数2调用TU 3中的函数5。
步骤S4411:在TU队列10中搜索与函数5相对应的TU,其中,假设与函数5相对应的所述TU是TU 3。
步骤S4412:增加TU 3的热度值,使得TU 3在TU队列10中排在第一位。
在一种可能的实现方式中,在步骤S4413中,将与所述TU相关联的函数2放入等待池20中进行分析。等待池20在存储器中有特定的存储空间,并且可以是所述存储器中的数组。将函数2放入等待池20中的一种实现方式可以是通过使用队列或数据库或者通过指定一段存储空间来存储函数2。
在TU 3的后续分析期间,在完成对与TU 3相关联的函数5的分析后,等待池20中的函数2会收到对函数5的所述分析已完成的通知,并且函数2可以进行进一步分析。
在另一种可能的实现方式中,在函数2调用TU 3中的函数5时,在步骤S4413中,可以将函数2和函数5都放入等待池20中进行分析,或者将所有函数(即,与对应于函数2和函数5的所述TU相关联的函数2、函数5和函数6)放入等待池20中进行分析。本申请对此不作限制。
步骤S4420:假设与TU 1相关联的所述函数不调用另一函数。例如,函数1不调用另一函数。
步骤S4421:创建函数1的概要信息。应当理解的是,所述创建的概要信息并不是具体概要信息的值,所述具体概要信息的所述值需要在完成对所述函数的分析后填写。
步骤S4422:对函数1进行分析,在完成对函数1的所述分析后,在所述创建的概要信息中填入具体概要信息的值,并将函数1的概要信息存储在查找表中。
例如,函数1的所述概要信息可以包括以下各项中的一项或多项:函数1的调用参数、函数1的返回值、函数1的函数、函数1的内部逻辑以及函数1的环境变量。
步骤S4423:分析函数1是否被调用,如果没有函数调用函数1,则清除函数1以及在对函数1进行分析的过程中生成的CFG和AST。
步骤S4424:如果有函数调用函数1,则所述等待池中调用函数1的函数会收到对函数1的所述分析已完成的通知,并且可以执行下一步,换句话说,对调用函数1的函数进行分析。
当随后从所述TU队列中选择TU时,基于优先选择具有高热度值的TU的策略来选择一个或多个TU。如果在对所述函数进行分析期间不再调用与所述TU相关联的函数,或者完成了对调用所述函数的每个函数的分析,则在完成对所述函数的分析后,从存储器中清除所述函数以及在对所述函数进行分析的过程中生成的CFG和AST,只保留所述函数的所述概要信息。
如果完成了对与所述TU相关联的所述函数的所述分析,并且不再调用与所述TU相关联的所述函数,则从所述TU队列中清除所述TU。
因此,通过进一步分析,所述TU队列中的TU的数量逐渐减少。直到完成对所述TU队列中的所有TU的分析,对所述第一对象的问题分析才完成。
本申请提供的静态分析方法用于分析软件中的系统项目或一类问题(例如,空指针问题)。方法200由软件中的静态分析工具执行。所述静态分析工具可以是静态分析软件、用于静态分析的数据包或可执行文件。如图5所示,静态分析工具300可以基于功能模块进行划分,并且可以包括代码编译模块、数据转换模块、软件处理模块以及问题分析模块。
所述代码编译模块用于编译问题分析对象的代码,以生成所需的AST和CFG。所述代码编译模块还包括AST编码模块和CFG编译模块。所述问题分析对象是静态分析对象,并且可以是系统项目或软件。本申请对此不作限制。
例如,所述代码编译模块可以是Clang或Z3求解器。其中,Clang和Z3是公用库。换句话说,所述代码编译模块可以使用现有分析工具的平台的代码。Clang用于编译、分析和生成所需的AST和CFG。Clang是现有可执行文件。Clang的输入是C/C++的源文件,输出是通过使用Clang解析生成的AST和CFG。Z3是微软公司开发的开源约束求解器,能够解决很多情况下的约束求解问题。Z3的输入是一系列命题方程,输出是满足方程的解。
应当理解的是,所述静态分析工具中的所述代码编译模块也可以是其他公用库。要替换Clang,只需要修改底层适配层即可。类似地,Z3求解器也是符号执行过程中的可选求解器之一,可以替换为另一求解器。下面将以Clang和Z3为例进行说明。本申请对此不作限制。
所述数据转换模块用于将所述代码编译模块的输出转换为自定义数据结构,并且包括AST转换模块和CFG转换模块。
例如,将Clang生成的AST和CFG转换为独立数据格式的AST和CFG,使得静态分析引擎不需要过度依赖所述代码编译模块的库函数。
所述软件处理模块是本申请提供的静态分析方法的核心算法模块,也可以称为静态分析引擎,并且可以是可调用的代码段。所述软件处理模块包括AST处理模块和DFA处理模块。在具体静态分析期间,所述软件处理模块通过使用所述数据转换模块来调用所述代码编译模块,以便对所述问题分析对象的文件进行分析。
例如,在对所述源文件进行分析时,所述软件处理模块通过使用所述数据转换模块来调用底层Clang以对所述文件进行分析,并将所述源文件转换为Clang输出的所述AST和所述CFG。然后,所述数据转换模块对数据进行解析,以生成所述软件处理模块定义的数据结构。
所述问题分析模块基于所述软件处理模块提供的所述数据结构来执行分析和检查,例如空指针检查和变量初始化检查。所述问题分析模块包括AST分析模块和DFA分析模块。
例如,所述AST分析模块遍历所述AST的所有节点,以检查是否存在潜在的质量问题;或者,所述DFA分析模块遍历所述CFG的所有分支,以确定在符号执行方法中分支的逻辑是否有效。换句话说,所述符号执行方法用于确定分支是否可达。本文所述的符号执行方法具体是通过对分支(所述分支可以理解为路径)上表示条件的所有逻辑表达式进行合取得到方程,并将所述方程作为Z3的输入,从而得到解。所述合取是通过使用逻辑“和”来连接多个逻辑表达式。只有当每个表达式都有效时,最终的合取方程才有效。
图6是本申请提供的另一种静态分析方法的交互流程图。由图5可以得知,静态分析工具包括代码编译模块、数据转换模块、软件处理模块以及问题分析模块。所述代码编译模块和所述数据转换模块的功能是对分析对象的源文件执行数据转换,使得所述软件处理模块基于对所述源文件执行转换后得到的数据来执行具体分析,所述问题分析模块基于所述软件处理模块执行的分析来对问题执行问题检查,从而输出问题分析结果。由于所述代码编译模块和所述数据转换模块不执行具体分析过程,因此图6仅示出了所述问题分析模块与所述软件处理模块之间的交互图。
应当理解的是,在图6所示的方法300中,从方法200中的执行主体(静态分析工具300)中包括的功能模块的角度来描述方法200。图6所示的方法300包括以下步骤。
步骤S310:所述问题分析模块向所述软件处理模块发送第一请求,其中,所述第一请求用于对第一对象执行问题分析。相应地,所述软件处理模块接收所述第一请求。例如,所述第一对象可以是项目或软件。本申请对此不作限制。
应当理解的是,当需要对所述第一对象执行问题分析时,在步骤S310之前,所述问题分析模块接收来自应用程序或服务器的第一请求。所述第一请求可以与步骤S210中的所述第一请求相对应。在图1所示的场景中,所述第一请求可以是用户在第一设备上执行的操作。在接收所述第一请求后,所述问题分析模块将所述第一请求转发给所述软件处理模块,使得所述软件处理模块启动任务。
步骤S320:所述软件处理模块对与所述第一对象相关联的TU执行问题分析,以生成所述第一对象的问题分析结果。
具体地,所述软件处理模块对所述第一对象中包括的源文件进行扫描,以生成TU队列。所述TU队列包括N个TU,N是大于或等于1的整数,所述TU队列中的每个TU与至少一个源文件中的至少一个函数相关联。
所述软件处理模块基于所述TU队列对与所述TU队列中的所述N个TU相关联的函数执行问题分析,以生成所述第一对象的所述问题分析结果。
可选地,所述TU队列中的一个TU与一个或多个源文件相关联,一个源文件包括一个或多个函数。
例如,所述第一对象包括100个源文件。所述软件处理模块在扫描过程中生成所述TU队列。应当理解的是,所述TU队列保存在存储器中(所述TU队列可以是所述存储器中的数组,或者所述TU队列可以是一种数据组织方式)。所述TU队列可以包括100个TU,也可以包括10个TU。假设所述TU队列包括100个TU,基于平均分配原则,所述TU队列中的每个TU与一个源文件中包括的函数相关联。假设所述TU队列包括10个TU,基于平均分配原则,所述TU队列中的每个TU与10个源文件中包括的函数相关联。当然,也可以不采用所述平均分配原则。具体而言,所述TU队列中的每个TU与不同数量的源文件相关联,但所述TU队列中的所述TU总共与100个源文件相关联。本申请对此不作限制。
应当理解的是,在上述示例中,在生成所述TU队列的过程中,所述软件处理模块基于源文件的数量来建立TU。此外,所述软件处理模块也可以以另一种方式建立所述TU。本申请对此不作限制。
例如,所述软件处理模块对所述项目的所有源文件进行一次扫描,以生成所述TU队列以及所述TU队列中的TU(所述TU与一个源文件相关联)与函数之间的对应关系。
具体地,在所述扫描过程中,所述软件处理模块生成每个源文件的标识符,并且用于唯一地标识每个源文件。假设所述TU队列中的TU 1与一个源文件相关联。例如,TU 1与文件#1相关联,文件#1包括三个函数(例如,函数1、函数2和函数3)。因此,在所述扫描过程中生成文件#1与所述三个函数之间的对应关系,具体而言,文件#1与函数1之间的对应关系、文件#1与函数2之间的对应关系以及文件#1与函数3之间的对应关系。换句话说,在所述扫描过程中生成TU 1与函数1之间的对应关系、TU 1与函数2之间的对应关系以及TU 1与函数3之间的对应关系。应当理解的是,所述TU队列中的另一TU与函数之间的对应关系可以通过类推生成。最终生成的TU队列包括N个TU以及所述N个TU中的每一个与函数之间的对应关系。
应当理解的是,当所述软件处理模块基于所述TU队列对与所述TU队列中的所述N个TU相关联的所述函数执行问题分析时,所述软件处理模块从所述TU队列中选择TU,并对与所述TU相关联的函数进行分析。直到完成对所述TU队列中的全部所述TU的分析,才可以认为所述软件处理模块完成了对所述第一对象的分析。
具体地,在对所述第一对象进行分析期间,所述软件处理模块从所述TU队列中选择任意TU(为了便于描述,也可以称为第一TU),并确定与所述第一TU相关联的第一函数集,其中,所述第一函数集包括与所述第一TU相关联的源文件中的函数;对所述第一函数集中的任意函数(例如,第一函数)进行分析,并确定所述第一函数的分析结果,其中,所述第一函数的所述分析结果包括所述第一函数的调用关系和所述第一函数的质量问题中的至少一者;当存在与所述第一函数有调用关系的函数时(例如,所述第一函数调用另一函数),对第二函数集进行分析,并确定所述第二函数集中的函数的分析结果,其中,所述第二函数集包括与所述第一函数有所述调用关系的至少一个函数(换句话说,所述第二函数集中包括的所述函数由所述第一函数调用);当完成对所述TU队列中的全部所述TU的所述分析时,生成所述第一对象的所述问题分析结果。例如,在对所述第一对象进行分析期间,所述软件处理模块选择所述TU队列中的TU 1,确定所述第一函数集,具体而言,确定函数1、函数2和函数3,然后对函数1、函数2和函数3进行分析。在所述分析过程中,如果函数1、函数2和函数3不调用另一函数,则确定上述函数的分析结果。所述分析结果包括所述函数的调用关系和所述函数的质量问题中的至少一者。如果假设函数2在所述分析过程中调用了函数4和函数5,则需要在完成对函数4和函数5的分析后对函数2进行分析。应当理解的是,函数4和函数5可以与相同的TU相关联,也可以与不同的TU相关联。在根据上述分析规则完成对所述TU队列中的全部所述TU的所述分析时,生成所述第一对象的所述问题分析结果。
应当理解的是,分析TU 1就是分析与TU 1相关联的所有函数。如果在所述分析过程中发现与TU 1相关联的函数调用另一函数,则将调用所述另一函数的所述函数放入等待池中。如果与TU 1相关联的函数不调用另一函数,则直接完成对所述函数的分析。在完成对与TU 1相关联的函数的处理后,可以对下一个TU进行分析。在完成对所述调用的函数的分析后,可以对放入所述等待池中的所述函数进行分析。
例如,与TU 1相关联的所述函数包括函数1、函数2和函数3。函数1和函数3不调用另一函数,函数2调用函数4。因此,完成对函数1和函数3的分析,并将函数2放入所述等待池中。换句话说,已经完成对TU 1的处理。下一步,可以基于热度从所述TU队列中选择另一TU进行分析。在完成对函数4的所述分析后,可以对函数2进行分析。
可选地,当从所述TU队列中选择TU进行分析时,所述软件处理模块可以执行顺序选择,每次选择一个TU进行分析,也可以同时选择多个TU进行分析。当所述软件处理模块同时选择多个TU进行分析时,可以进一步提高静态分析效率。
应当理解的是,当所述软件处理模块同时选择多个TU进行分析时,与所述多个TU相关联的函数可以调用相同的另一函数。在这种情况下,当对所述多个TU中的每一个进行分析时,可以对所述调用的相同的另一函数进行一次分析,以减少冗余分析。或者,可以通过使用标识信息来标识对所述函数进行了分析。
可选地,所述TU队列中的每个TU包括热度,所述热度用于标识TU关联的函数被调用的次数。当所述软件处理模块从所述TU队列中选择所述第一TU时,所述软件处理模块可以基于所述TU队列中的每个TU的所述热度来选择所述第一TU。所述第一TU的热度标识符(可以理解为热度值)高于第一阈值。
例如,当从所述TU队列中选择TU时,所述软件处理模块优先选择具有高热度值的TU进行分析。
可选地,所述TU队列中的每个TU的所述热度可以基于调用与每个TU相关联的函数的次数或频率来确定,所述TU队列中的每个TU的所述热度也可以基于在处理与所述TU相关联的所述函数时所述TU的空间占用率来确定。
例如,假设对于所述TU队列中的所述第一TU,每当与另一TU相关联的函数调用与所述第一TU相关联的所述函数时,所述第一TU的所述热度值会更新一次。因此,与所述第一TU相关联的所述函数被调用的次数越多,表明所述第一TU的热度值越高。或者,可以理解的是,与所述第一TU相关联的所述函数被调用的次数越多,表明所述TU队列中的所述第一TU的优先级越高。当随后从所述TU队列中选择TU时,基于优先选择具有高热度值的TU的策略来选择所述TU进行分析。
可选地,在对与所述TU相关联的所述函数进行分析期间,每次完成对函数的分析时,所述软件处理模块会相应地生成与所述函数相对应的控制流图(control flow graph,CFG)和抽象语法树(abstract syntax tree,AST),并将所述函数的概要信息存储在查找表中。所述函数的所述概要信息也可以理解为对所述函数的行为的描述。如果在后续分析中存在调用所述函数的TU,则可以基于所述函数的所述概要信息来获知所述函数在特定条件下执行特定操作以输出特定结果,从而对所述TU进行进一步分析。
可选地,所述函数的所述概要信息可以包括以下各项中的一项或多项:所述函数的调用参数、所述函数的返回值、所述函数的函数、所述函数的内部逻辑以及所述函数的环境变量。
可选地,所述软件处理模块对所述函数的所述概要信息进行压缩,并将所述函数的所述概要信息存储在所述查找表中。
例如,在所述软件处理模块对所述函数的所述概要信息进行压缩后,所述函数的所述概要信息占用的内存空间减少,所述静态分析过程中的内存开销进一步减少。
具体地,所述软件处理模块包括用于对函数的概要信息进行压缩的压缩模块。
可选地,当完成对与所述第一TU相关联的所述第一函数的分析,并且完成对调用所述第一函数的所有其他函数的分析时,所述软件处理模块可以从所述存储器中清除所述第一函数以及与所述第一函数相对应的CFG和AST。
应当理解的是,当完成对与所述第一TU相关联的所述第一函数的所述分析,并且完成对调用所述第一函数的所有其他函数的所述分析时,表明所述第一函数不再被任意函数调用。在这种情况下,所述软件处理模块从所述存储器中清除所述第一函数以及与所述第一函数相对应的所述CFG和所述AST,只保留所述第一函数的所述概要信息。
可选地,当完成对与所述第一TU相关联的全部所述函数的分析时,所述软件处理模块从所述TU队列中清除所述第一TU。或者,当完成对与所述第一TU相关联的全部函数的分析,并且完成对调用与所述第一TU相关联的所述函数的所有其他函数的分析时,所述软件处理模块从所述TU队列中清除所述第一TU。
应当理解的是,当对与所述第一TU相关联的全部所述函数进行分析,并且完成对调用与所述第一TU相关联的所述函数的所有其他函数的分析时,表明与所述第一TU相关联的全部所述函数不再被任意函数调用。在这种情况下,从所述TU队列中清除所述第一TU,以减少系统的内存开销。
步骤S330:所述软件处理模块向所述问题分析模块发送所述第一对象的处理结果,相应地,所述问题分析模块接收所述处理结果。
例如,在完成对所述TU队列中的所述TU的分析后,即在清除所述TU队列中的所述TU后,所述软件处理模块向所述问题分析模块输出处理结果。所述处理结果可以包括在AST处理模块和DFA处理模块执行处理后获得的数据。
步骤S340:所述问题分析模块基于所述处理结果对所述第一对象执行问题分析。
例如,基于所述软件处理模块输出的所述处理结果来执行分析。例如,遍历所述AST的所有节点,以检查是否存在潜在的问题(例如,空指针问题或变量初始化问题),或遍历所述CFG的所有分支,以确定在符号执行方法中分支的逻辑是否有效。
在基于所述处理结果完成对所述第一对象的问题分析后,所述问题分析模块需要输出问题分析结果(与方法200中步骤S230的所述问题分析结果相对应),所述分析结果可以是问题分析报告。假设对于所述空指针问题,所述问题分析报告的内容可以是通过分析具体得知在所述对象的特定源文件中的特定代码行的特定位置存在空指针问题。本申请对此不作限制。
在本申请提供的静态分析方法300中,在对所述第一对象进行问题分析期间,所述第一对象的所述源文件与所述TU相关联,所述TU可以包括所述至少一个源文件。在具体问题分析期间,以所述TU为粒度,不需要生成所述第一对象中包括的全部所述函数的调用关系图,可以同时选择多个TU进行并行处理,以提高静态分析效率。此外,在具体分析过程中,可以从所述存储器中清除分析已完成且未被调用的TU或函数,以减少系统的内存开销。上面参考附图描述了本申请的方法实施例,下面将描述本申请的装置实施例。可以理解的是,对方法实施例的描述和对装置实施例的描述可以相互对应。因此,对于未描述的部分,请参考上述方法实施例。
为了实现上述方法实施例中的功能,下面描述的静态分析装置包括用于执行各功能的对应硬件结构和/或软件模块。本领域技术人员应当知道,在本申请中,参考本说明书公开的实施例描述的示例中的单元和算法步骤可以通过硬件或硬件和计算机软件的组合来实现。这些功能是由硬件执行还是由计算机软件驱动的硬件执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以针对每种特定应用使用不同的方法来实现所述功能,但不应认为该实现方式超出了本申请的范围。
在本申请中,所述静态分析装置可以基于上述方法示例划分为功能模块。例如,每个功能模块可以通过划分获得对应的功能,或者两个或多个功能可以集成到一个处理模块中。所述集成模块可以以硬件的形式实现,也可以以软件功能模块的形式实现。应当注意的是,在本申请中,对模块的划分只是示例,并且仅仅是逻辑功能划分,在实际实现方式中可以是其他划分。下面以通过基于对应功能的划分获得各功能模块为例进行说明。
图7是本申请提供的静态分析装置的示意框图。静态分析装置400包括接收模块410、处理模块420和发送模块430。接收模块410可以用于接收从外部发送的信息,接收模块410可以是问题分析模块310中的接收模块;处理模块420用于处理静态分析装置内部的数据,处理模块420执行的操作可以与静态分析工具300中的问题分析模块310和软件处理模块320执行的操作相对应;发送模块430可以用于向外部发送信息,发送模块430可以是问题分析模块310中的发送模块。
应当理解的是,本申请中的静态分析装置400可以通过使用中央处理单元(central processing unit,CPU)来实现,可以通过使用专用集成电路(application-specific integrated circuit,ASIC)来实现,也可以通过使用可编程逻辑设备(programmable logic device,PLD)来实现。所述PLD可以是复杂可编程逻辑设备(complexprogrammable logic device,CPLD)、现场可编程阵列门(field-programmable arraygate,FPGA)、通用阵列逻辑(general array logic,GAL)或其任意组合。或者,当图2至图6所示的静态分析方法可以通过使用软件来实现时,静态分析装置400及其每个模块也可以是软件模块。
可选地,静态分析装置400还可以包括存储模块440。存储模块440可以用于存储在处理过程中生成的指令和/或数据,处理模块420可以读取存储模块440中的指令和/或数据。
可选地,接收模块410用于接收第一请求。所述第一请求用于对第一对象执行问题分析,所述第一对象包括至少一个源文件。处理模块420用于对与所述第一对象相关联的编译单元(translation unit,TU)执行问题分析,以生成所述第一对象的问题分析结果。发送模块430用于发送所述问题分析结果。
可选地,处理模块420具体用于:扫描所述第一对象中包括的所述源文件,以生成TU队列,其中,所述TU队列包括N个TU,所述TU队列中的每个TU与一个源文件中的至少一个函数相关联,N是大于或等于1的整数;基于所述TU队列对与所述TU队列中的所述N个TU相关联的函数执行问题分析,以生成所述第一对象的所述问题分析结果。
可选地,处理模块420具体用于:选择所述TU队列中的第一TU,并确定与所述第一TU相关联的第一函数集,其中,所述第一函数集包括与所述第一TU相关联的源文件中的至少一个函数;对第一函数进行分析,并确定所述第一函数的分析结果,其中,所述第一函数是所述第一函数集中的任意函数,所述第一函数的所述分析结果包括所述第一函数的调用关系和所述第一函数的质量问题中的至少一者;
当存在与所述第一函数有调用关系的函数时,对第二函数集进行分析,并确定所述第二函数集中的函数的分析结果,其中,所述第二函数集包括与所述第一函数有所述调用关系的至少一个函数;当完成对所述TU队列中的全部所述TU的分析时,生成所述第一对象的所述问题分析结果。
可选地,处理模块420具体用于:在完成对与所述TU队列中的所述第一TU相关联的所有函数的分析后,从所述TU队列中删除所述第一TU。
可选地,所述TU队列中的每个TU包括热度,所述热度用于标识TU关联的函数被调用的次数,处理模块420具体用于基于所述TU队列中的所述TU的所述热度来选择所述第一TU,其中,所述第一TU的热度是满足所述TU队列中的第一条件的TU,所述第一条件包括所述第一TU的热度标识符高于第一阈值。
可选地,处理模块420具体用于:基于与所述TU队列中的所述TU相关联的函数的热度来更新所述TU队列中的所述TU的所述热度;基于所述更新的热度对所述TU队列中的所述TU进行排序。
静态分析装置400可以部署在服务器中,使得当所述服务器运行时,可以实现上述方法实施例中的所述静态分析工具执行的所述方法。
在一种可能的实现方式中,静态分析装置400也可以部署在云环境中。所述云环境是在云计算模式下通过使用基础资源为用户提供云服务的实体。所述云环境包括云数据中心和云服务平台。所述云数据中心包括云服务提供商拥有的大量基础资源(包括计算资源、存储资源和网络资源)。所述云数据中心中包括的所述计算资源可以是大量计算设备(例如,服务器)。静态分析装置400可以是所述云数据中心中用于静态分析的服务器。静态分析装置400也可以是在所述云数据中心创建的用于静态分析的虚拟机。静态分析装置400也可以是部署在所述云数据中心中的所述服务器或所述虚拟机上的软件装置。所述软件装置用于执行静态分析。所述软件装置可以以分布式的方式部署在多个服务器上,以分布式的方式部署在多个虚拟机上,或以分布式的方式部署在所述虚拟机和所述服务器上。例如,静态分析装置400中的模块410、模块420和模块430可以以分布式的方式部署在多个服务器上,以分布式的方式部署在多个虚拟机上,或以分布式的的方式部署在所述虚拟机和所述服务器上。又如,当模块420包括多个子模块时,所述多个子模块可以部署在多个服务器上,以分布式方式部署在多个虚拟机上,或以分布式的方式部署在所述虚拟机和所述服务器上。
所述云服务提供商可以将静态分析装置400抽象为所述云服务平台上的静态分析云服务,以向用户提供所述云服务。用户在所述云服务平台购买所述云服务后,所述云环境通过使用云服务为所述用户提供所述静态分析云服务。所述用户可以通过使用应用程序编程接口(application programming interface,API)或通过使用所述云服务平台提供的网页接口来上传分析对象,装置400执行静态分析并输出分析结果。
当静态分析装置400是软件装置时,静态分析装置400可以独立地部署在任何环境中的计算设备上。当静态分析装置400是硬件时,静态分析装置400可以是计算设备或芯片。
如图8所示,本申请还提供了一种静态分析设备500。静态分析设备500包括一个或多个处理器501。处理器501用于执行数据和/或存储在存储器504中的计算机程序或指令,从而执行上述方法实施例中的方法。
可选地,处理器501耦接到存储器504,或者存储器504和处理器501可以分开设置。
存储器504也可以称为存储单元,存储可执行代码,例如存储所述计算机程序或所述指令和/或所述数据。存储器504为处理器501提供所述指令和所述数据。存储器504还可以包括操作系统等另一运行进程所需的软件模块。例如,存储器504包括内核、程序、文件生成模块、文件传输模块、文件获取模块以及解码模块。
应当理解的是,在本申请中,处理器501可以是一个或多个CPU,或处理器501可以是另一通用处理器、数字信号处理器(digital signal processor,DSP)、专用集成电路(application-specific integrated circuit,ASIC)、现场可编程门阵列(fieldprogrammable gate array,FPGA)或另一可编程逻辑设备、离散门或晶体管逻辑设备、离散硬件部件等。所述通用处理器可以是微处理器、任何常规处理器等。
存储器504可以是易失性存储器或非易失性存储器,或者可以包括易失性存储器和非易失性存储器。所述非易失性存储器可以是只读存储器(read-only memory,ROM)、可编程只读存储器(programmable read-only memory,PROM)、可擦除可编程只读存储器(erasable programmable read-only memory,EPROM)、电可擦除可编程只读存储器(electrically erasable programmable read-only memory,EEPROM)或闪存。所述易失性存储器可以是用作外部高速缓存的随机存取存储器(randomaccess memory,RAM)。作为示例而非限制性描述,可以使用多种形式的RAM,例如,静态随机存取存储器(static randomaccess memory,SRAM)、动态随机存取存储器(dynamic randomaccess memory,DRAM)、同步动态随机存取存储器(synchronous dynamic randomaccess memory,SDRAM)、双倍数据速率同步动态随机存取存储器(doubledata rate synchronous dynamic random accessmemory,DDR SDRAM)、增强型同步动态随机存取存储器(enhanced synchronous dynamicrandom access memory,ESDRAM)、同步链接动态随机存取存储器(synchlink dynamicrandom access memory,SLDRAM)以及直接总线式随机存取存储器(direct rambus randomaccess memory,DR RAM)。
可选地,如图8所示,静态分析设备500还可以包括存储介质505。存储介质505可以用于存储在执行上述方法实施例的过程中生成的数据。存储介质505可以是磁带、硬盘(例如,固态驱动器(solid state drive,SSD))、软盘等。
可选地,如图8所示,静态分析设备500还可以包括通信接口506。通信接口506用于接收和/或发送信号和/或数据。处理器501可以用于控制通信接口506以接收和/或发送信号和/或数据。
可选地,如图8所示,静态分析设备500还可以包括输出设备502和输入设备503。输入设备503可以向静态分析设备500输入需要对其执行问题分析的对象。在完成对所述对象的分析后,静态分析设备500可以向输出设备502输出问题分析结果。
可选地,静态分析设备500还可以包括总线507。所述总线是用于在计算机的各种功能部件之间传输信息的公共通信干线,并且是用于在CPU、存储器、输入设备与输出设备之间传输信息的公用通道。主机的部件通过使用所述总线连接。外部设备通过对应的接口电路连接到所述总线,以形成计算机硬件系统。根据所述计算机传输的信息的类型,所述计算机的总线可以分为数据总线、地址总线和控制总线,所述数据总线、所述地址总线和所述控制总线分别用于传输数据、数据地址和控制信号。然而,为了清楚地描述,将图8中的各种总线标记为总线507。
在设计中,静态分析设备500用于实现上述方法实施例中的所述静态分析工具执行的操作。
应当理解的是,图7所示的静态分析装置400中的处理模块420可以是图8中的处理器501,接收模块410和发送模块430可以是图8中的通信接口506,存储模块440可以是图8中的存储器504。对于处理器501执行的操作,请具体参考上文对处理模块420的描述。对于通信接口506执行的操作,请参考对接收模块410和发送模块430的描述。对于存储器504执行的操作,请参考对存储模块440的描述。这里不再赘述。
本申请还提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,所述指令用于实现上述方法实施例中的所述静态分析工具执行的所述方法。
例如,所述计算机可读存储介质中存储有计算机程序或指令,当所述计算机程序或指令由计算机执行时,可以使所述计算机能够实现上述方法实施例中的所述静态分析工具执行的所述方法。
本申请还提供了一种静态分析设备。所述静态分析设备可以是服务器,所述静态分析设备上安装有静态分析工具,使得当所述静态分析设备运行时,可以实现上述方法实施例中的所述静态分析工具执行的所述方法。
上述实施例中的全部或部分可以通过软件、硬件、固件或其任意组合来实现。当使用所述软件来实现实施例时,上述实施例中的全部或部分可以以计算机程序产品的形式来实现。所述计算机程序产品包括一个或多个计算机指令。当所述计算机程序指令在计算机上加载或执行时,根据本申请的程序或函数会全部或部分生成。所述计算机可以是通用计算机、专用计算机、计算机网络或另一可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者可以从计算机可读存储介质传输到另一计算机可读存储介质。例如,所述计算机指令可以以有线(例如,同轴电缆、光纤或数字用户线路(digital subscriberline,DSL))或无线(例如,红外、无线电或微波)方式从网站、计算机、服务器或数据中心传输到另一网站、计算机、服务器或数据中心。所述计算机可读存储介质可以是所述计算机可访问的任何可用介质,也可以是集成了一个或多个可用介质的数据存储设备(例如,服务器或数据中心)。所述可用介质可以是磁介质(例如,软盘、硬盘或磁带)、光学介质(例如,DVD)或半导体介质。所述半导体介质可以是固态驱动器(solid-state drive,SSD)。
本领域普通技术人员可能知道,参考本说明书公开的实施例描述的示例中的单元和算法步骤可以通过电子硬件或计算机软件和电子硬件的组合来实现。这些功能是由硬件执行还是由软件执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以针对每种特定应用使用不同的方法来实现所述功能,但不应认为该实现方式超出了本申请的范围。
上述描述仅是本申请的具体实现方式,并非旨在限制本申请的保护范围。本领域技术人员在本申请公开的技术范围内容易想到的任何变化或替换都应属于本申请的保护范围。因此,本申请的保护范围应以权利要求的保护范围为准。

Claims (14)

1.一种静态分析方法,其特征在于,所述静态分析方法包括:
接收第一请求,其中,所述第一请求用于对第一对象执行问题分析,所述第一对象包括至少一个源文件;
对与所述第一对象相关联的编译单元TU执行问题分析,以生成所述第一对象的问题分析结果;
发送所述问题分析结果。
2.根据权利要求1所述的方法,其特征在于,对与所述第一对象相关联的TU执行问题分析以生成所述第一对象的问题分析结果包括:
扫描所述第一对象的所述源文件,生成TU队列,其中,所述TU队列包括N个TU,所述TU队列中的每个TU与一个源文件中的至少一个函数相关联,N是大于或等于1的整数;
基于所述TU队列,对与所述TU队列中的所述N个TU相关联的函数执行问题分析,以生成所述第一对象的所述问题分析结果。
3.根据权利要求2所述的方法,其特征在于,基于所述TU队列,对与所述TU队列中的所述N个TU相关联的函数执行问题分析以生成所述第一对象的所述问题分析结果包括:
选择所述TU队列中的第一TU,并确定与所述第一TU相关联的第一函数集,其中,所述第一函数集包括与所述第一TU相关联的源文件中的至少一个函数;
对第一函数进行分析,并确定所述第一函数的分析结果,其中,所述第一函数是所述第一函数集中的任意一个函数,所述第一函数的所述分析结果包括所述第一函数的调用关系或所述第一函数的质量问题中的至少一者;
当存在与所述第一函数有调用关系的函数时,对第二函数集进行分析,并确定所述第二函数集中的函数的分析结果,其中,所述第二函数集包括与所述第一函数有所述调用关系的至少一个函数;
在完成对所述TU队列中的全部所述TU的分析时,生成所述第一对象的所述问题分析结果。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
在完成对与所述TU队列中的所述第一TU相关联的所有函数的分析后,从所述TU队列中删除所述第一TU。
5.根据权利要求3所述的方法,其特征在于,所述TU队列中的每个TU包括热度,所述热度用于标识TU关联的函数被调用的次数,选择所述TU队列中的第一TU包括:
基于所述TU队列中的所述TU的所述热度来选择所述第一TU,其中,所述第一TU的热度标识符高于第一阈值。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
基于与所述TU队列中的所述TU相关联的函数的热度来更新所述TU队列中的所述TU的所述热度;
基于所述更新的热度对所述TU队列中的所述TU进行排序。
7.一种静态分析装置,其特征在于,所述静态分析装置包括:
接收模块,其中,所述接收模块用于接收第一请求,所述第一请求用于对第一对象执行问题分析,所述第一对象包括至少一个源文件;
处理模块,其中,所述处理模块用于对与所述第一对象相关联的编译单元TU执行问题分析,以生成所述第一对象的问题分析结果;
发送模块,其中,所述发送模块用于发送所述问题分析结果。
8.根据权利要求7所述的装置,其特征在于,所述处理模块具体用于:
扫描所述第一对象中的所述源文件,生成TU队列,其中,所述TU队列包括N个TU,所述TU队列中的每个TU与一个源文件中的至少一个函数相关联,N是大于或等于1的整数;
基于所述TU队列对与所述TU队列中的所述N个TU相关联的函数执行问题分析,以生成所述第一对象的所述问题分析结果。
9.根据权利要求8所述的装置,其特征在于,所述处理模块具体用于:
选择所述TU队列中的第一TU,并确定与所述第一TU相关联的第一函数集,其中,所述第一函数集包括与所述第一TU相关联的源文件中的至少一个函数;
对第一函数进行分析,并确定所述第一函数的分析结果,其中,所述第一函数是所述第一函数集中的任意一个函数,所述第一函数的所述分析结果包括所述第一函数的调用关系或所述第一函数的质量问题中的至少一者;
当存在与所述第一函数有调用关系的函数时,对第二函数集进行分析,并确定所述第二函数集中的函数的分析结果,其中,所述第二函数集包括与所述第一函数有所述调用关系的至少一个函数;
在完成对所述TU队列中的全部所述TU的分析时,生成所述第一对象的所述问题分析结果。
10.根据权利要求9所述的装置,其特征在于,所述处理模块具体用于:
在完成对与所述TU队列中的所述第一TU相关联的所有函数的分析后,从所述TU队列中删除所述第一TU。
11.根据权利要求9所述的装置,其特征在于,所述TU队列中的每个TU包括热度,所述热度用于标识热度所述TU关联的函数被调用的次数,所述处理模块具体用于:
基于所述TU队列中的所述TU的所述热度来选择所述第一TU,其中,所述第一TU的热度标识符高于第一阈值。
12.根据权利要求11所述的装置,其特征在于,所述处理模块具体用于:
基于与所述TU队列中的所述TU相关联的函数的热度来更新所述TU队列中的所述TU的所述热度;
基于所述更新的热度对所述TU队列中的所述TU进行排序。
13.一种静态分析设备,其特征在于,所述静态分析设备包括处理器,其中,所述处理器耦接到存储器,所述存储器用于存储计算机程序或指令,所述处理器用于执行所述存储器中的所述计算机程序或所述指令,使得所述设备执行根据权利要求1至6中任一项所述的方法。
14.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机程序或指令,当所述计算机程序或所述指令被执行时,所述计算机能够执行根据权利要求1至6中任一项所述的方法。
CN202280057286.XA 2021-08-24 2022-07-06 静态分析方法、装置和设备及计算机可读存储介质 Pending CN117897694A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
RU2021124956A RU2021124956A (ru) 2021-08-24 Способ статического анализа, оборудование и устройство и компьютерно-читаемый носитель данных
RU2021124956 2021-08-24
PCT/CN2022/104055 WO2023024714A1 (en) 2021-08-24 2022-07-06 Static analysis method, apparatus, and device, and computer-readable storage medium

Publications (1)

Publication Number Publication Date
CN117897694A true CN117897694A (zh) 2024-04-16

Family

ID=85321373

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202280057286.XA Pending CN117897694A (zh) 2021-08-24 2022-07-06 静态分析方法、装置和设备及计算机可读存储介质

Country Status (2)

Country Link
CN (1) CN117897694A (zh)
WO (1) WO2023024714A1 (zh)

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101286132B (zh) * 2008-06-02 2010-09-08 北京邮电大学 一种基于软件缺陷模式的测试方法及系统
KR101051600B1 (ko) * 2010-03-29 2011-07-22 주식회사 소프트 포 소프트 아밥 소스코드의 코드 검사를 수행하는 코드검사 수행시스템
CN104021084A (zh) * 2014-06-19 2014-09-03 国家电网公司 一种Java源代码缺陷检测方法及装置
CN106294156B (zh) * 2016-08-11 2018-12-07 北京邮电大学 一种静态代码缺陷检测分析方法及装置
CN111694570A (zh) * 2019-03-13 2020-09-22 南京大学 一种基于静态程序分析的JavaScript函数参数不匹配检测方法

Also Published As

Publication number Publication date
WO2023024714A1 (en) 2023-03-02

Similar Documents

Publication Publication Date Title
CN106970820B (zh) 代码存储方法及代码存储装置
CN111736913B (zh) 类加载方法和装置
CN111026634A (zh) 一种接口自动化测试系统、方法、装置及存储介质
CN115509534A (zh) 适配ai模型的编译方法、装置、存储介质及电子设备
CN113076153A (zh) 一种接口调用方法和装置
CN115883310A (zh) 服务部署方法、服务部署系统、电子设备及存储介质
AU2016378425B2 (en) Application program running method and apparatus
CN112286594A (zh) 对象序列化和反序列化方法及设备、电子设备和介质
CN117897694A (zh) 静态分析方法、装置和设备及计算机可读存储介质
CN115934093A (zh) 小程序跨端应用方法、相关装置及计算机存储介质
CN111324645A (zh) 区块链的数据处理方法及装置
CN114358936A (zh) 一种基于微服务区块链的智能合约运行方法
CN116263690A (zh) 虚拟机从外部系统读取数据及相关写出数据的方法和装置
CN114039698A (zh) 基于多频率的数据发送和接收方法、装置和设备
CN112486497A (zh) 编译配置文件的生成方法、装置、电子设备及存储介质
US20230110520A1 (en) Ui service package generation and registration method and apparatus, and ui service loading method and apparatus
CN111399842A (zh) 一种代码编译方法及装置
CN113448960A (zh) 一种导入表格文件的方法和装置
CN111158661A (zh) 系统接口对接方法、装置、介质及电子设备
CN112068814A (zh) 可执行文件的生成方法、装置、系统及介质
CN112463214B (zh) 数据处理方法及装置、计算机可读存储介质以及电子设备
US11669314B2 (en) Method and system to enable print functionality in high-level synthesis (HLS) design platforms
CN114928556B (zh) 接口服务的测试方法及相关设备
CN115878282A (zh) 跨平台交互方法、装置及设备
CN116954611A (zh) 一种前端项目编译打包方法、装置和设备

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