CN112733153A - 源代码扫描方法、装置、电子设备和存储介质 - Google Patents
源代码扫描方法、装置、电子设备和存储介质 Download PDFInfo
- Publication number
- CN112733153A CN112733153A CN202110113984.4A CN202110113984A CN112733153A CN 112733153 A CN112733153 A CN 112733153A CN 202110113984 A CN202110113984 A CN 202110113984A CN 112733153 A CN112733153 A CN 112733153A
- Authority
- CN
- China
- Prior art keywords
- function
- source code
- scanning
- value
- determining
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 56
- 230000007547 defect Effects 0.000 claims abstract description 119
- 238000006243 chemical reaction Methods 0.000 claims abstract description 92
- 238000001514 detection method Methods 0.000 claims abstract description 69
- 238000012545 processing Methods 0.000 claims abstract description 30
- 238000006467 substitution reaction Methods 0.000 claims abstract description 25
- 230000006870 function Effects 0.000 claims description 305
- 238000013507 mapping Methods 0.000 claims description 34
- 230000008859 change Effects 0.000 claims description 25
- 238000010276 construction Methods 0.000 claims description 8
- 230000009466 transformation Effects 0.000 claims description 7
- 230000008569 process Effects 0.000 claims description 6
- 238000007689 inspection Methods 0.000 description 11
- 238000004458 analytical method Methods 0.000 description 10
- 238000004891 communication Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 6
- 230000000694 effects Effects 0.000 description 4
- 230000003068 static effect Effects 0.000 description 4
- 241001365977 Mallos Species 0.000 description 3
- 238000012546 transfer Methods 0.000 description 3
- 230000002159 abnormal effect Effects 0.000 description 2
- 238000004590 computer program Methods 0.000 description 2
- 238000007726 management method Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000007847 structural defect Effects 0.000 description 2
- 239000011800 void material Substances 0.000 description 2
- 238000009825 accumulation Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004422 calculation algorithm Methods 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000003247 decreasing effect Effects 0.000 description 1
- 238000007599 discharging Methods 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000006855 networking Effects 0.000 description 1
- 230000003121 nonmonotonic effect Effects 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000008439 repair process Effects 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例公开了一种源代码扫描方法、装置、电子设备和存储介质;本发明实施例可以获取源代码,源代码包括目标函数;对目标函数进行等效转换处理,得到目标函数对应的至少一个转换函数;采用转换函数对源代码中的目标函数进行替代处理,得到替代代码;基于替代代码构造抽象语法树;基于预设的缺陷检测规则,对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。在本发明实施例中,通过对源代码中未知或难处理的目标函数替换为与该目标函数等效的、已知的、便于扫描的转换函数,使得扫描缺陷时,能够检测到与目标函数有关的缺陷。本方案可应用在云服务器中,以提高缺陷检测的效率,由此,本方案可以提升源代码扫描的效率。
Description
技术领域
本发明涉及计算机领域,具体涉及一种源代码扫描方法、装置、电子设备和存储介质。
背景技术
静态源代码扫描(Static Code Analysis)是近年被人提及较多的软件应用安全解决方案之一,它是指在软件工程中,源代码无需经过编译器编译,直接被一些扫描工具扫描出其中的一些缺陷、漏洞等,从而帮助开发人员快速查找、定位、修复和管理源代码中的安全风险。
然而,目前静态源代码扫描方法往往会出现漏报等问题,因此,目前源代码扫描方法的效率低下。
发明内容
本发明实施例提供一种源代码扫描方法、装置、电子设备和存储介质,可以提升源代码扫描的效率。
本发明实施例提供一种源代码扫描方法,包括:
获取源代码,源代码包括目标函数;
对目标函数进行等效转换处理,得到目标函数对应的至少一个转换函数;
采用转换函数对源代码中的目标函数进行替代处理,得到替代代码;
基于替代代码构造抽象语法树;
基于预设的缺陷检测规则,对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
本发明实施例还提供一种源代码扫描装置,包括:
获取单元,用于获取源代码,源代码包括目标函数;
转换单元,用于对目标函数进行等效转换处理,得到目标函数对应的至少一个转换函数;
替代单元,用于采用转换函数对源代码中的目标函数进行替代处理,得到替代代码;
构造单元,用于基于替代代码构造抽象语法树;
扫描单元,用于基于预设的缺陷检测规则,对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
在一些实施例中,构造单元,用于:
确定替代代码中调用转换函数的数组对象,以及转换函数的函数参数;
当转换函数为内存分配函数时,基于函数参数确定转换函数的返回值;
在替代代码中定义转换函数的返回值,以及,将调用转换函数的数组对象修改为数组对象指向目标函数的返回值,得到再次替代代码;
基于再次替代代码构造抽象语法树。
在一些实施例中,源代码包括第一函数,构造单元在用于基于替代代码构造抽象语法树之后,还用于:
确定第一函数的函数体,以及函数体中的外部变量参数;
确定第一函数的函数体在抽象语法树中的位置;
将位置保存在调用关系表中。
在一些实施例中,源代码包括调用了第一函数的第二函数,扫描单元,用于:
当在抽象语法树中扫描到第二函数时,基于调用关系表在抽象语法树中确定下一扫描位置;
基于下一扫描位置确定第一函数的函数体,以及函数体中的外部变量参数;
基于预设的缺陷检测规则,采用函数体和函数体中的外部变量参数对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
在一些实施例中,抽象语法树包括循环结构,扫描单元,包括:
局部子单元,用于在对循环结构中的局部变量进行扫描时,确定局部变量的当前定值;
扫描子单元,用于基于预设的缺陷检测规则和局部变量的当前定值,对抽象语法树中局部变量进行一次缺陷扫描,得到局部变量的缺陷的扫描结果。
在一些实施例中,局部子单元,还用于:
定义局部变量的第一数据结构;
在一些实施例中,局部子单元,用于:
当扫描到循环结构中的局部变量时,从第一数据结构获取局部变量的上一定值;
基于上一定值,计算局部变量的当前定值;
将局部变量的当前定值存入局部变量的第一数据结构;
重新扫描循环结构。
在一些实施例中,局部子单元在用于重新扫描循环结构,还用于:
确定循环结构的循环类型、循环条件阈值;
当循环类型为目标循环类型时,确定局部变量的变化类型;
当局部变量的变化类型为单调变化类型,且局部变量的当前定值大于循环条件阈值,则退出循环结构;或者,
当局部变量的变化类型为单调变化类型,且循环条件阈值大于预设阈值,则退出循环结构。
在一些实施例中,转换单元,用于:
当目标函数为未知库函数时,获取预设的未知库函数映射关系;
基于未知库函数映射关系,确定与未知库函数之间存在映射关系的转换函数。
在一些实施例中,转换单元,用于:
当目标函数为目标库函数时,获取预设的目标库函数映射关系;
基于目标库函数映射关系,确定与目标库函数之间存在映射关系的转换函数集合,转换函数集合中包括至少一个转换函数。
在一些实施例中,扫描单元,包括:
赋值子单元,用于当扫描到抽象语法树中的赋值结构时,确定赋值结构中的赋值对象和赋值运算;
检测值子单元,用于当赋值对象的数值未知时,确定赋值对象的检测值;
结构缺陷子单元,用于基于赋值对象的检测值和赋值运算,确定赋值结构中的缺陷。
在一些实施例中,检测值子单元,用于:
确定赋值对象的数据类型,数据类型包括有符类型和无符类型;
当赋值对象的数据类型为有符类型时,将预设的正边界值、负边界值、正中间值、负中间值和零值确定为赋值对象的检测值;
当赋值对象的数据类型为无符类型时,将预设的边界值、中间值和零值确定为赋值对象的检测值。
在一些实施例中,赋值对象包括第一赋值对象和第二赋值对象,结构缺陷子单元,用于:
确定第一对象的数据类型所对应的取值范围;
当第二对象的检测值不属于第一对象的数据类型所对应的取值范围时,确定赋值结构中存在数值溢出缺陷。
本发明实施例还提供一种电子设备,包括存储器存储有多条指令;所述处理器从所述存储器中加载指令,以执行本发明实施例所提供的任一种源代码扫描方法中的步骤。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有多条指令,所述指令适于处理器进行加载,以执行本发明实施例所提供的任一种源代码扫描方法中的步骤。
本发明实施例可以获取源代码,源代码包括目标函数;对目标函数进行等效转换处理,得到目标函数对应的至少一个转换函数;采用转换函数对源代码中的目标函数进行替代处理,得到替代代码;基于替代代码构造抽象语法树;基于预设的缺陷检测规则,对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
在本发明中,通过对源代码中未知或难处理的目标函数替换为与该目标函数等效的、已知的、便于扫描的转换函数,使得在构造抽象语法树时,将源代码逻辑简化、归并,从而在扫描缺陷时,能够检测到与目标函数有关的缺陷。由此,本方案可以提升源代码扫描的效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1a是本发明实施例提供的源代码扫描方法的云服务场景示意图;
图1b是本发明实施例提供的源代码扫描方法的流程示意图;
图1c是本发明实施例提供的等效转换处理的流程示意图;
图1d是本发明实施例提供的抽象语法树的示意图;
图1e是本发明实施例提供的抽象语法树示例的示意图;
图2是本发明实施例提供的源代码扫描方法的流程示意图;
图3是本发明实施例提供的源代码扫描装置的结构示意图;
图4是本发明实施例提供的电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供一种源代码扫描方法、装置、电子设备和存储介质。
其中,该源代码扫描装置具体可以集成在电子设备中,该电子设备可以为终端、服务器等设备。其中,终端可以为手机、平板电脑、智能蓝牙设备、笔记本电脑、车载终端或者个人电脑(Personal Computer,PC)等设备;服务器可以是单一服务器,也可以是由多个服务器组成的服务器集群。
在一些实施例中,该源代码扫描装置还可以集成在多个电子设备中,比如,源代码扫描装置可以集成在多个服务器中,由多个服务器来实现本发明的源代码扫描方法。
其中,服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等基础云计算服务的云服务器,还可以是提供车联网服务、路网协同、车路协同、智能交通、自动驾驶、工业互联网服务、数据通信(如4G、5G等)等专门或平台服务器。终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表、车载终端等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
其中,云计算(cloud computing)是一种计算模式,它将计算任务分布在大量计算机构成的资源池上,使各种应用系统能够根据需要获取计算力、存储空间和信息服务。提供资源的网络被称为“云”。“云”中的资源在使用者看来是可以无限扩展的,并且可以随时获取,按需使用,随时扩展,按使用付费。
作为云计算的基础能力提供商,会建立云计算资源池(简称云平台,一般称为IaaS(Infrastructure as a Service,基础设施即服务)平台,在资源池中部署多种类型的虚拟资源,供外部客户选择使用。云计算资源池中主要包括:计算设备(为虚拟化机器,包含操作系统)、存储设备、网络设备。
按照逻辑功能划分,在IaaS(Infrastructure as a Service,基础设施即服务)层上可以部署PaaS(Platform as a Service,平台即服务)层,PaaS层之上再部署SaaS(Software as a Service,软件即服务)层,也可以直接将SaaS部署在IaaS上。PaaS为软件运行的平台,如数据库、web容器等。SaaS为各式各样的业务软件,如web门户网站、短信群发器等。一般来说,SaaS和PaaS相对于IaaS是上层。
例如,参考图1a,该电子设备可以是云服务器,用户可以采用个人电脑将含有目标函数的源代码上传至云服务器,该云服务器可以对目标函数进行等效转换处理,得到目标函数对应的至少一个转换函数;采用转换函数对源代码中的目标函数进行替代处理,得到替代代码;基于替代代码构造抽象语法树;基于预设的缺陷检测规则,对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果,然后将扫描结果返回给用户的个人电脑进行显示,等等。
以下分别进行详细说明。需说明的是,以下实施例的序号不作为对实施例优选顺序的限定。
在本实施例中,提供了一种运行在云服务器中的源代码扫描方法,如图1b所示,该源代码扫描方法的具体流程可以如下:
101、获取源代码,源代码包括目标函数。
源代码(Source Coding)是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。
源代码中可包括目标函数,该目标函数是指符合如下任一情况函数:
(1)代码库中一个已知的库函数;
(2)在代码库中没有任何定义,但其函数效果和代码库中已知库函数十分接近的函数;
(3)在代码库中没有任何定义,但被宏定义为代码库中一个或多个库函数结合的形式的函数。
例如,在代码库中没有任何定义,但其语义和代码库中已知库函数十分接近的函数可以是glib库(一种Linux平台下常用的C语言函数库)中的g_malloc()函数(一种用于申请内存的函数)可以是目标函数,该g_malloc()符合条件(2),即g_mallo(size)函数在代码库中没有定义,但其效果与代码库中的库函数calloc(size,1)几乎一样。
例如,在代码库中没有任何定义,但被宏定义为代码库中一个或多个库函数结合的形式的函数可以是realloc()函数(一种用于先释放内存再申请内存的函数),该realloc()函数合条件(3),即realloc(mem,size)函数在代码库中没有任何定义,但可以被宏定义为代码库中free(mem)函数(一种用于释放内存的函数)与malloc(size)库函数结合的形式。
102、对目标函数进行等效转换处理,得到目标函数对应的至少一个转换函数。
在本实施例中,可以从源代码中抽取出Token,并构造出一棵抽象语法树,在构建可以对Token进行一些预处理,以精简最终构造的抽象语法树。
在本方案中,可以确认各Token的属性,如Token的类型、隐含值、关联性等属性。
当正在处理一个函数类型的Token时,若该Token表征的是目标函数时,可以将源文件中,该Token对应的所有目标函数归并为一个或多个已知的库函数,从而实现精简抽象语法树的效果。
在一些实施例中,参考图1c,步骤102可以包括如下步骤:
当目标函数为未知库函数时,获取预设的未知库函数映射关系;
基于未知库函数映射关系,确定与未知库函数之间存在映射关系的转换函数。
其中,预设的未知库函数映射关系中,可以包括目标函数X和该目标函数X的函数效果十分接近的函数Y之间的映射关系。
例如,预设的未知库函数映射关系中,可以包括g_mallo(size)和calloc(size,1)的映射关系。
在一些实施例中,步骤“对目标函数进行等效转换处理,得到至少一个转换函数,”可以包括如下步骤:
当目标函数为目标库函数时,获取预设的目标库函数映射关系;
基于目标库函数映射关系,确定与目标库函数之间存在映射关系的转换函数集合,转换函数集合中可以包括至少一个转换函数。
其中,预设的目标库函数映射关系中,可以包括目标函数X和该目标函数X被宏定义的函数y1+y2之间的映射关系。
例如,预设的目标库函数映射关系中,可以包括realloc(mem,size)与free(mem);malloc(size)之间的映射关系。
103、采用转换函数对源代码中的目标函数进行替代处理,得到替代代码。
例如,基于g_mallo(size)和calloc(size,1)的映射关系,将源代码中的g_mallo(size)替换为calloc(size,1),得到替代代码。
例如,基于realloc(mem,size)和free(mem);malloc(size)的映射关系,将源代码中的realloc(mem,size)替换为free(mem);malloc(size),得到替代代码。
104、基于替代代码构造抽象语法树。
其中,造抽象语法树(Abstract Syntax Tree,AST)是替代代码中抽象语法的树状表示,由标记(Token)构成,树上的每个节点都表示源代码中的一种结构。
例如,下面所示的代码可以以图1d中的抽象语法树表示:
其中,图1d中的抽象语法树包括表征了该代码的根节点statement squence,以及循环结构while和返回结构return,该循环结构while中包括条件结构compare≠和分支结构branch;分支结构branch中又包括条件结构compare>和if结构、else结构,if结构和else结构中都包括减法操作结构-,等等。
在本方案中,可以针对数组的边界进行检查。
在构造抽象语法树前,首先要对源代码进行词法分析。
在一些实施例中,词法分析(lexical analysis)的方法可以是将源代码的字符序列转换为标记序列。在下文中可将用于词法分析的程序或者函数称为词法分析器(Lexicalanalyzer,Lexer)或扫描器(Scanner)。
其中,Token是一种计算机术语,从字符流转化为Token的过程叫作标记化(Tokenization),在一些实施例中,在该过程中词法分析器还可以对标记进行分类。
在一些实施例中,词法分析器可以基于不完整的语义来导出一个抽象语法树,从而大幅增加静态扫描时的兼容度。
比如,可以检测数组下标的访问是否越界,例如,定义一个维度为7的数组A(下标0,下标1,下标2…,下标6),其中,数组的下标表征了数组的维度,数组的下界为最小的下标,即默认为0,数组的上界为最大的下标,在数组A中,其上界为6;当源代码中出现了数组A[下标7]的时候,由于下标7超出了其上界,因此,该数组A[下标7]存在越界的缺陷。
再例如,参考如下代码:
在代码的第五行将会访问到p[3],而p[3]超出了数组上界p[2],因此,p[3]存在越界的缺陷。
在本实施例中,除了基于已知的数值来判断是否出现数组越界的缺陷,还可以在数值未知的情况下判断是否出现数组越界的缺陷。
例如,数组是动态分配的情况下,为了防止由于无法获取已知值的情况下停止对该动态分配数组进行越界缺陷的扫描,在一些实施例中,参考图1e,步骤104可以包括如下步骤:
确定替代代码中调用转换函数的数组对象,以及转换函数的函数参数;
当转换函数为内存分配函数时,基于函数参数确定转换函数的返回值;
在替代代码中定义转换函数的返回值,以及,将调用转换函数的数组对象修改为数组对象指向目标函数的返回值,得到再次替代代码;
基于该再次替代代码构造抽象语法树。
比如,可以将替代代码中的转换函数calloc()的返回值单独定义为一个int(整数)类型、长度为[size]的数组,作为调用该calloc()的数组int a*的值指向的内容,以便在后续的扫描中正确计算数组的上下界、判断数组的越界缺陷。
例如,将替换代码中的:
int*a=calloc(3,sizeof(int));
修改为:
int*_temp=calloc(3,sizeof(int));
int*a=_temp;
从而得到新的替代代码,最后基于该新替代代码构造抽象语法树。
在本实施例中,除了基于已知的数值来判断是否出现数组越界的缺陷,还可以在数值未知的情况下判断是否出现数组越界的缺陷。
比如,在以函数体为单位进行缺陷检测时,可能会导致无法得知函数体中调用的外部变量参数,往往会出现跳过检测该函数体的问题。
例如,参考如下代码:
void foo(int index){
return a[index];
}
其中,花括号内的为函数体,花括号外的为函数说明。即该情况下只会检查{return a[index];},而在该函数体中,index是一个未知的外部变量参数,因此,在该情况下会跳过该未知的index,导致漏检的问题。
为了解决该问题,防止数组的下标是一外部传入的变量的情况下无法进行数组越界缺陷的检测,因此,在一些实施例中,在步骤104之后,还可以包括如下步骤:
确定第一函数的函数体,以及函数体中的外部变量参数;
确定第一函数的函数体在抽象语法树中的位置;
将位置保存在调用关系表中。
其中,源代码可以包括第一函数,该第一函数具有函数说明和函数体,该第一函数是指如上述举例中,其函数体中包括外部变量参数的函数。
在本方案建立抽象语法树阶段,通过生成各个函数的调用关系表(比如,若有3个函数调用了foo(),就记录这3个函数的位置,并存储在调用关系表中)。在后续回溯该抽象语法树时,无需重新进行复杂的抽象语法树遍历、区域检测,而只需要通过调用关系表访问函数体及其中的外部变量参数即可,在降低复杂度的同时,直接访问的外部变量参数可看作已知的参数,从而可以将该外部变量参数视为一个普通局部变量,以便进行后续的推演。
105、基于预设的缺陷检测规则,对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
其中,缺陷是指会对软件造成安全性、稳定性、恢复性相关问题的错误,或是会产生非预期结果的错误。
在一些实施例中,本方案在词法分析阶段中采用内嵌的缺陷检测规则(即检查类)来实现缺陷检测,然后根据Token中变量的值来存储错误缺陷行序号,从而定位出缺陷。
其中,本方案的缺陷检测规则众多,故可以执行严格的逻辑检查,如自动变量检查、数组的边界检查、class类检查、过期的函数,废弃函数调用检查、异常内存使用,释放检查、内存泄漏检查,主要是通过内存引用指针、操作系统资源释放检查,中断,文件描述符等、异常STL函数使用检查、代码格式错误,以及性能因素检查,等等。
例如,在一些实施例中,源代码中可以包括步骤104中介绍的第一函数,还可以包括调用了该第一函数的第二函数,故在将该外部变量参数视为一个普通局部变量后,步骤105时,可以包括如下步骤:
当在抽象语法树中扫描到第二函数时,基于调用关系表在抽象语法树中确定下一扫描位置;
基于下一扫描位置确定第一函数的函数体,以及函数体中的外部变量参数;
基于预设的缺陷检测规则,采用函数体和函数体中的外部变量参数对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
在本实施例中,除了基于已知的数值来判断是否出现数组越界的缺陷,还可以在数值未知的情况下判断是否出现数组越界的缺陷。
比如,如果检测不会对值流的传递进行记录,若数组的下标出现了值流的传递的情况下,往往会跳过对该数组进行越界检测。
例如,如下代码描述了x在不断迭代增加,不能一次性计算完,即出现值流x的传递:
int x=1;
a[x]=2;
x++;
a[x]=3;
x++;
a[x]=4;
因此,为了解决上述情况中数组的下标出现了值流的传递时,出现跳过对该数组进行越界检测的情况,在一些实施例中,可以在扫描前建立一个局部变量的第一数据结构来存储值流的局部变量,并随着扫描行数增多,不断更新这个第一数据结构中的内容。
该第一数据结构可用作为值传递容器,即该数据结构可用于传递数值。
在一些实施例中,抽象语法树可以包括循环结构(即源代码中的循环结构),值流的传递往往会出现在循环结构中,因此,步骤105可以包括如下步骤:
在对循环结构中的局部变量进行扫描时,确定局部变量的当前定值;
基于预设的缺陷检测规则和局部变量的当前定值,对抽象语法树中局部变量进行一次缺陷扫描,得到局部变量的缺陷的扫描结果。
由于循环语句的特殊性,在对循环进行常规求解时,可能会放弃对循环的处理。而在本实施例中,为了减少此种情况下出现的漏查问题,可以抽象地去对循环中的局部变量进行近似求解。
因此,在一些实施例中,在步骤“在对循环结构中的局部变量进行扫描时,确定局部变量的当前定值”之前,还可以包括如下步骤:
定义局部变量的第一数据结构。
例如,定义局部变量N的二元组向量vector<局部变量N,当前值>作为值传递容器。
然后,在步骤“在对循环结构中的局部变量进行扫描时,确定局部变量的当前定值”时执行如下步骤:
当扫描到循环结构中的局部变量时,从第一数据结构获取局部变量的上一定值;
基于上一定值,计算局部变量的当前定值;
将局部变量的当前定值存入局部变量的第一数据结构;
重新扫描循环结构。
例如,当循环是已知的、有限次数退出的情况下,比如for(int x=0;x<16;x++),则需要跟踪局部变量x,即每当计算出局部变量x的当前值,就对二元组向量vector<局部变量x,当前值>进行更新。
在一些实施例中,当循环的循环条件未知,且循环条件和值流的局部变量有关,则需要通过局部变量的变化类型来确定是否停止对该循环结构的扫描,故步骤“重新扫描循环结构”还可以包括如下步骤:
确定循环结构的循环类型、循环条件阈值;
当循环类型为目标循环类型时,确定局部变量的变化类型;
当局部变量的变化类型为单调变化类型,且局部变量的当前定值大于循环条件阈值,则退出循环结构;或者,
当局部变量的变化类型为单调变化类型,且循环条件阈值大于预设阈值,则退出循环结构。
其中,目标循环类型是指循环的退出条件未知的循环;变化类型包括单调变化(如单增变化、单减变化),以及非单调变化。
当循环是已知的、但循环的退出条件未知的情况下,比如while(…){…break;},且循环条件和要跟踪的局部变量有关,例如跟踪x,而循环条件是if(x==20)break;则需要确定局部变量是否是单调变化的,如果是单调的,则跟踪到局部变量大于循环条件阈值,或者,循环条件阈值大于预设阈值。
例如,参考如下代码:
上述代码中包括了while类型的循环,确定局部变量x的变化类型为单增变化,则当局部变量x的当前定值为21大于循环条件阈值20时,则退出循环结构,将对二元组向量更新为vector<局部变量x,21>后不再修改。
再例如,假设预设阈值设为500,参考如下代码:
上述代码中包括了if类型的循环,确定局部变量x的变化类型为单增变化,而由于循环条件阈值9999999999过大,远远超过预设阈值500,则直接退出循环结构,将对二元组向量更新为vector<局部变量x,9999999999>,随后不再修改。
本方案特别针对循环大量应用于源代码中的情况,通过模拟循环的求值,可以大幅增加源代码中缺陷的检出率。
此外,对于赋值结构:
void foo(unsigned int p){
unsigned char o=p;
}
被赋值对象o的取值范围是0~255,而如果赋值对象p的数值大于255,则一定是会导致被赋值对象o出现整数溢出的问题,而整数溢出是导致现代代码出现安全问题的最常见因素之一,由于赋值对象的数值未知,因此可能会出现跳过对数值未知的赋值对象的缺陷检测的情况。
因此,为了解决上述问题,在一些实施例中,在扫描中经常会出现赋值对象的数值未知的情况,在该情况下进行赋值计算往往会发生整数溢出的问题,因此,步骤105可以包括如下步骤:
当扫描到抽象语法树中的赋值结构时,确定赋值结构中的赋值对象和赋值运算;
当赋值对象的数值未知时,确定赋值对象的检测值;
基于赋值对象的检测值和赋值运算,确定赋值结构中的缺陷。
例如,本实施例可以检测出赋值对象的变量宽度发生变化时,取值范围较大的赋值对象的数值(如long类型,占4字节)赋予取值范围较小的赋值对象的数值(如char类型,占1字节)时,可能会发生值的截断缺陷。
例如,本实施例可以检测出赋值对象的符号类型发生变化时,有符类型的赋值对象赋予无符类型的赋值对象,可能会导致无符类型的赋值对象的数值变得过大的缺陷。
例如如下代码:
unsigned long index=0;
signed char x=-1;
index=x;
此时index的值将变为4294967295(0xFFFFFFFF),是开发者预期之外的缺陷。
例如,本实施例可以检测出char类型的值与long类型的值累加,结果导致char类型的值发生整数溢出的缺陷。
取值,在一些实施例中,当赋值对象的数值未知时,可通过采用边缘值的方式进行推测,其中,边缘值可以包括边界值、中间值等,故步骤“当赋值对象的数值未知时,确定赋值对象的检测值,”可以包括如下步骤:
确定赋值对象的数据类型,数据类型可以包括有符类型和无符类型;
当赋值对象的数据类型为有符类型时,将预设的正边界值、负边界值、正中间值、负中间值和零值确定为赋值对象的检测值;
当赋值对象的数据类型为无符类型时,将预设的边界值、中间值和零值确定为赋值对象的检测值。
例如,未知的赋值对象的长度是N,有符类型使用正边界值-2N-1和负边界值2N-1-1,以及正中间值1、0、负中间值-1,无符号数使用0、中间值1、边界值2N-1作为边缘值计算可能的范围。将这些边缘值依次和已知的赋值对象的数值做运算,来判断是否可能导致整数溢出。
比如,在一些实施例中,赋值对象可以包括第一赋值对象和第二赋值对象步骤“基于赋值对象的检测值和赋值运算,确定赋值结构中的缺陷,”可以包括如下步骤:
确定第一对象的数据类型所对应的取值范围;
当第二对象的检测值不属于第一对象的数据类型所对应的取值范围时,确定赋值结构中存在数值溢出缺陷。
本发明实施例提供的源代码扫描方案可以应用在各种代码扫描场景中。
例如,参考图2,本方案首先可以通过命令行读入带检测工程的路径,然后判断该路径是否正确,当路径正确时,利用遍历文件夹的算法,遍历所有文件夹下面的源文件,如C++源文件(.ccp格式的文件)、C源文件(.c格式的文件)等,否则直接结束本次源代码扫描。
若该文件中包含头文件(.h格式的文件),则将头文件读入到该源文件中,然后对包含了头文件的源文件进行词法分析,否则直接对该源文件进行词法分析,建立Token构成的抽象语法树,并对AST进行语义分析,通过循环调用check子类中定义的缺陷检测规则,来实现缺陷的检测,最后通过ErrorLogger定位出程序中存在缺陷,从而可标记出软件中存在的相似缺陷,实现软件缺陷自动检测。
在一些实施例中,每遍历一个.cpp/c文件,则可以对从中读取的程序进行预处理,以去除注释语句。
本方案可以在构建AST时将被检测代码逻辑简化,并在扫描缺陷时,通过一种新的方法对不确定变量进行值范围的推演,通过对AST中的Token进行逻辑判断确定代码是否存在安全问题,能够正确获取推演值,提高了检测效率。
申请人采用本方案对测试程序进行缺陷扫描时,容错率得到了很大的提高,可以快速地发现隐藏在程序代码中的安全问题。
本方案在生成调用关系的时候不会忽略库函数,在进行可疑值的推演时,也会对未知值进行可行性的判断,且可以有效地扫描循环结构,优化了开源项目无法正确获取推演值的问题,提高了检测效率。
由上可知,本发明实施例可以获取源代码,源代码包括目标函数;对目标函数进行等效转换处理,得到目标函数对应的至少一个转换函数;采用转换函数对源代码中的目标函数进行替代处理,得到替代代码;基于替代代码构造抽象语法树;基于预设的缺陷检测规则,对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
由此本方案可以通过对源代码中未知或难处理的目标函数替换为与该目标函数等效的、已知的、便于扫描的转换函数,使得扫描缺陷时,能够检测到与目标函数有关的缺陷。由此,本方案可以提升源代码扫描的效率。
为了更好地实施以上方法,本发明实施例还提供一种源代码扫描装置,该源代码扫描装置具体可以集成在电子设备中,该电子设备可以为终端、服务器等设备。其中,终端可以为手机、平板电脑、智能蓝牙设备、笔记本电脑、个人电脑、车载设备等设备;服务器可以是单一服务器,也可以是由多个服务器组成的服务器集群。
比如,在本实施例中,将以源代码扫描装置具体集成在服务器中为例,对本发明实施例的方法进行详细说明。
例如,如图3所示,该源代码扫描装置可以包括获取单元301、转换单元302、替代单元303、构造单元304以及扫描单元305,如下:
(一)获取单元301。
获取单元301用于获取源代码,所述源代码包括目标函数。
(二)转换单元302。
转换单元302用于对所述目标函数进行等效转换处理,得到所述目标函数对应的至少一个转换函数。
在一些实施例中,转换单元302,用于:
当目标函数为未知库函数时,获取预设的未知库函数映射关系;
基于未知库函数映射关系,确定与未知库函数之间存在映射关系的转换函数。
在一些实施例中,转换单元302,用于:
当目标函数为目标库函数时,获取预设的目标库函数映射关系;
基于目标库函数映射关系,确定与目标库函数之间存在映射关系的转换函数集合,转换函数集合中包括至少一个转换函数。
(三)替代单元303。
替代单元303用于采用所述转换函数对所述源代码中的所述目标函数进行替代处理,得到替代代码。
(四)构造单元304。
构造单元304用于基于所述替代代码构造抽象语法树。
在一些实施例中,构造单元304,用于:
确定替代代码中调用转换函数的数组对象,以及转换函数的函数参数;
当转换函数为内存分配函数时,基于函数参数确定转换函数的返回值;
在替代代码中定义转换函数的返回值,以及,将调用转换函数的数组对象修改为数组对象指向目标函数的返回值,得到再次替代代码;
基于再次替代代码构造抽象语法树。
在一些实施例中,源代码包括第一函数,构造单元304在用于基于替代代码构造抽象语法树之后,还用于:
确定第一函数的函数体,以及函数体中的外部变量参数;
确定第一函数的函数体在抽象语法树中的位置;
将位置保存在调用关系表中。
(五)扫描单元305。
扫描单元305用于基于预设的缺陷检测规则,对所述抽象语法树进行缺陷扫描,得到所述源代码中缺陷的扫描结果。
在一些实施例中,源代码包括调用了第一函数的第二函数,扫描单元305,用于:
当在抽象语法树中扫描到第二函数时,基于调用关系表在抽象语法树中确定下一扫描位置;
基于下一扫描位置确定第一函数的函数体,以及函数体中的外部变量参数;
基于预设的缺陷检测规则,采用函数体和函数体中的外部变量参数对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
在一些实施例中,抽象语法树包括循环结构,扫描单元305,包括:
局部子单元,用于在对循环结构中的局部变量进行扫描时,确定局部变量的当前定值;
扫描子单元,用于基于预设的缺陷检测规则和局部变量的当前定值,对抽象语法树中局部变量进行一次缺陷扫描,得到局部变量的缺陷的扫描结果。
在一些实施例中,局部子单元,还用于:
定义局部变量的第一数据结构;
在一些实施例中,局部子单元,用于:
当扫描到循环结构中的局部变量时,从第一数据结构获取局部变量的上一定值;
基于上一定值,计算局部变量的当前定值;
将局部变量的当前定值存入局部变量的第一数据结构;
重新扫描循环结构。
在一些实施例中,局部子单元在用于重新扫描循环结构,还用于:
确定循环结构的循环类型、循环条件阈值;
当循环类型为目标循环类型时,确定局部变量的变化类型;
当局部变量的变化类型为单调变化类型,且局部变量的当前定值大于循环条件阈值,则退出循环结构;或者,
当局部变量的变化类型为单调变化类型,且循环条件阈值大于预设阈值,则退出循环结构。
在一些实施例中,扫描单元305,包括:
赋值子单元,用于当扫描到抽象语法树中的赋值结构时,确定赋值结构中的赋值对象和赋值运算;
检测值子单元,用于当赋值对象的数值未知时,确定赋值对象的检测值;
结构缺陷子单元,用于基于赋值对象的检测值和赋值运算,确定赋值结构中的缺陷。
在一些实施例中,检测值子单元,用于:
确定赋值对象的数据类型,数据类型包括有符类型和无符类型;
当赋值对象的数据类型为有符类型时,将预设的正边界值、负边界值、正中间值、负中间值和零值确定为赋值对象的检测值;
当赋值对象的数据类型为无符类型时,将预设的边界值、中间值和零值确定为赋值对象的检测值。
在一些实施例中,赋值对象包括第一赋值对象和第二赋值对象,结构缺陷子单元,用于:
确定第一对象的数据类型所对应的取值范围;
当第二对象的检测值不属于第一对象的数据类型所对应的取值范围时,确定赋值结构中存在数值溢出缺陷。
具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不再赘述。
由上可知,本实施例的源代码扫描装置由获取单元获取源代码,所述源代码包括目标函数;由转换单元对所述目标函数进行等效转换处理,得到所述目标函数对应的至少一个转换函数;由替代单元采用所述转换函数对所述源代码中的所述目标函数进行替代处理,得到替代代码;由构造单元基于所述替代代码构造抽象语法树;由扫描单元基于预设的缺陷检测规则,对所述抽象语法树进行缺陷扫描,得到所述源代码中缺陷的扫描结果。
由此,本发明实施例可以提升源代码扫描的效率。
本发明实施例还提供一种电子设备,该电子设备可以为终端、服务器等设备。其中,终端可以为手机、平板电脑、智能蓝牙设备、笔记本电脑、个人电脑,车载设备,等等;服务器可以是单一服务器,也可以是由多个服务器组成的服务器集群,等等。
在一些实施例中,该源代码扫描装置还可以集成在多个电子设备中,比如,源代码扫描装置可以集成在多个服务器中,由多个服务器来实现本发明的源代码扫描方法。
在本实施例中,将以本实施例的电子设备是电子设备为例进行详细描述,比如,如图4所示,其示出了本发明实施例所涉及的电子设备的结构示意图,具体来讲:
该电子设备可以包括一个或者一个以上处理核心的处理器401、一个或一个以上计算机可读存储介质的存储器402、电源403、输入模块404以及通信模块405等部件。本领域技术人员可以理解,图4中示出的电子设备结构并不构成对电子设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
处理器401是该电子设备的控制中心,利用各种接口和线路连接整个电子设备的各个部分,通过运行或执行存储在存储器402内的软件程序和/或模块,以及调用存储在存储器402内的数据,执行电子设备的各种功能和处理数据,从而对电子设备进行整体监控。在一些实施例中,处理器401可包括一个或多个处理核心;在一些实施例中,处理器401可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器401中。
存储器402可用于存储软件程序以及模块,处理器401通过运行存储在存储器402的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器402可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据电子设备的使用所创建的数据等。此外,存储器402可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器402还可以包括存储器控制器,以提供处理器401对存储器402的访问。
电子设备还包括给各个部件供电的电源403,在一些实施例中,电源403可以通过电源管理系统与处理器401逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源403还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
该电子设备还可包括输入模块404,该输入模块404可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。
该电子设备还可包括通信模块405,在一些实施例中通信模块405可以包括无线模块,电子设备可以通过该通信模块405的无线模块进行短距离无线传输,从而为用户提供了无线的宽带互联网访问。比如,该通信模块405可以用于帮助用户收发电子邮件、浏览网页和访问流式媒体等。
尽管未示出,电子设备还可以包括显示单元等,在此不再赘述。具体在本实施例中,电子设备中的处理器401会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器402中,并由处理器401来运行存储在存储器402中的应用程序,从而实现各种功能,如下:
获取源代码,源代码包括目标函数;
对目标函数进行等效转换处理,得到目标函数对应的至少一个转换函数;
采用转换函数对源代码中的目标函数进行替代处理,得到替代代码;
基于替代代码构造抽象语法树;
基于预设的缺陷检测规则,对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
以上各个操作的具体实施可参见前面的实施例,在此不再赘述。
由上可知,本方案可以提升源代码扫描的效率。
本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。
为此,本发明实施例提供一种计算机可读存储介质,其中存储有多条指令,该指令能够被处理器进行加载,以执行本发明实施例所提供的任一种源代码扫描方法中的步骤。例如,该指令可以执行如下步骤:
获取源代码,源代码包括目标函数;
对目标函数进行等效转换处理,得到目标函数对应的至少一个转换函数;
采用转换函数对源代码中的目标函数进行替代处理,得到替代代码;
基于替代代码构造抽象语法树;
基于预设的缺陷检测规则,对抽象语法树进行缺陷扫描,得到源代码中缺陷的扫描结果。
其中,该存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、磁盘或光盘等。
根据本申请的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述实施例中提供的源代码扫描方面或者代码扫描云服务方面的各种可选实现方式中提供的方法。
由于该存储介质中所存储的指令,可以执行本发明实施例所提供的任一种源代码扫描方法中的步骤,因此,可以实现本发明实施例所提供的任一种源代码扫描方法所能实现的有益效果,详见前面的实施例,在此不再赘述。
以上对本发明实施例所提供的一种源代码扫描方法、装置、电子设备和计算机可读存储介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (15)
1.一种源代码扫描方法,其特征在于,包括:
获取源代码,所述源代码包括目标函数;
对所述目标函数进行等效转换处理,得到所述目标函数对应的至少一个转换函数;
采用所述转换函数对所述源代码中的所述目标函数进行替代处理,得到替代代码;
基于所述替代代码构造抽象语法树;
基于预设的缺陷检测规则,对所述抽象语法树进行缺陷扫描,得到所述源代码中缺陷的扫描结果。
2.如权利要求1所述的源代码扫描方法,其特征在于,所述基于所述替代代码构造抽象语法树,包括:
确定所述替代代码中调用所述转换函数的数组对象,以及所述转换函数的函数参数;
当所述转换函数为内存分配函数时,基于所述函数参数确定所述转换函数的返回值;
在所述替代代码中定义所述转换函数的返回值,以及,将调用所述转换函数的数组对象修改为所述数组对象指向所述目标函数的返回值,得到再次替代代码;
基于所述再次替代代码构造抽象语法树。
3.如权利要求1所述的源代码扫描方法,其特征在于,所述源代码包括第一函数,所述基于所述替代代码构造抽象语法树之后,还包括:
确定所述第一函数的函数体,以及所述函数体中的外部变量参数;
确定所述第一函数的函数体在所述抽象语法树中的位置;
将所述位置保存在调用关系表中。
4.如权利要求3所述的源代码扫描方法,其特征在于,所述源代码包括调用所述第一函数的第二函数,所述基于预设的缺陷检测规则,对所述抽象语法树进行缺陷扫描,得到所述源代码中缺陷的扫描结果,包括:
当在所述抽象语法树中扫描到所述第二函数时,基于所述调用关系表在所述抽象语法树中确定下一扫描位置;
基于所述下一扫描位置确定第一函数的函数体,以及所述函数体中的外部变量参数;
基于预设的缺陷检测规则,采用所述函数体和所述函数体中的外部变量参数对所述抽象语法树进行缺陷扫描,得到所述源代码中缺陷的扫描结果。
5.如权利要求1所述的源代码扫描方法,其特征在于,所述抽象语法树包括循环结构,所述基于预设的缺陷检测规则,对所述抽象语法树进行缺陷扫描,得到所述源代码中缺陷的扫描结果,包括:
在对所述循环结构中的局部变量进行扫描时,确定所述局部变量的当前定值;
基于预设的缺陷检测规则和所述局部变量的当前定值,对所述抽象语法树中所述局部变量进行一次缺陷扫描,得到所述局部变量的缺陷的扫描结果。
6.如权利要求5所述的源代码扫描方法,其特征在于,所述在对所述循环结构中的局部变量进行扫描时,确定所述局部变量的当前定值之前,还包括:
定义局部变量的第一数据结构;
所述在对所述循环结构中的局部变量进行扫描时,确定所述局部变量的当前定值,包括:
当扫描到所述循环结构中的局部变量时,从所述第一数据结构获取所述局部变量的上一定值;
基于所述上一定值,计算所述局部变量的当前定值;
将所述局部变量的当前定值存入所述局部变量的所述第一数据结构;
重新扫描所述循环结构。
7.如权利要求6所述的源代码扫描方法,其特征在于,所述重新扫描所述循环结构,还包括:
确定所述循环结构的循环类型、循环条件阈值;
当所述循环类型为目标循环类型时,确定所述局部变量的变化类型;
当所述局部变量的变化类型为单调变化类型,且所述局部变量的当前定值大于所述循环条件阈值,则退出所述循环结构;或者,
当所述局部变量的变化类型为单调变化类型,且所述循环条件阈值大于预设阈值,则退出所述循环结构。
8.如权利要求1所述的源代码扫描方法,其特征在于,所述对所述目标函数进行等效转换处理,得到至少一个转换函数,包括:
当所述目标函数为未知库函数时,获取预设的未知库函数映射关系;
基于所述未知库函数映射关系,确定与所述未知库函数之间存在映射关系的转换函数。
9.如权利要求1所述的源代码扫描方法,其特征在于,所述对所述目标函数进行等效转换处理,得到至少一个转换函数,包括:
当所述目标函数为目标库函数时,获取预设的目标库函数映射关系;
基于所述目标库函数映射关系,确定与所述目标库函数之间存在映射关系的转换函数集合,所述转换函数集合中包括至少一个转换函数。
10.如权利要求1所述的源代码扫描方法,其特征在于,所述基于预设的缺陷检测规则,对所述抽象语法树进行缺陷扫描,得到所述源代码中缺陷的扫描结果,包括:
当扫描到所述抽象语法树中的赋值结构时,确定所述赋值结构中的赋值对象和赋值运算;
当所述赋值对象的数值未知时,确定所述赋值对象的检测值;
基于所述赋值对象的检测值和所述赋值运算,确定所述赋值结构中的缺陷。
11.如权利要求10所述的源代码扫描方法,其特征在于,所述当所述赋值对象的数值未知时,确定所述赋值对象的检测值,包括:
确定所述赋值对象的数据类型,所述数据类型包括有符类型和无符类型;
当所述赋值对象的数据类型为有符类型时,将预设的正边界值、负边界值、正中间值、负中间值和零值确定为所述赋值对象的检测值;
当所述赋值对象的数据类型为无符类型时,将预设的边界值、中间值和零值确定为所述赋值对象的检测值。
12.如权利要求11所述的源代码扫描方法,其特征在于,所述赋值对象包括第一赋值对象和第二赋值对象,所述基于所述赋值对象的检测值和所述赋值运算,确定所述赋值结构中的缺陷,包括:
确定所述第一对象的数据类型所对应的取值范围;
当所述第二对象的检测值不属于所述第一对象的数据类型所对应的取值范围时,确定所述赋值结构中存在数值溢出缺陷。
13.一种源代码扫描装置,其特征在于,包括:
获取单元,用于获取源代码,所述源代码包括目标函数;
转换单元,用于对所述目标函数进行等效转换处理,得到所述目标函数对应的至少一个转换函数;
替代单元,用于采用所述转换函数对所述源代码中的所述目标函数进行替代处理,得到替代代码;
构造单元,用于基于所述替代代码构造抽象语法树;
扫描单元,用于基于预设的缺陷检测规则,对所述抽象语法树进行缺陷扫描,得到所述源代码中缺陷的扫描结果。
14.一种电子设备,其特征在于,包括处理器和存储器,所述存储器存储有多条指令;所述处理器从所述存储器中加载指令,以执行如权利要求1~12任一项所述的源代码扫描方法中的步骤。
15.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有多条指令,所述指令适于处理器进行加载,以执行权利要求1~12任一项所述的源代码扫描方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110113984.4A CN112733153A (zh) | 2021-01-27 | 2021-01-27 | 源代码扫描方法、装置、电子设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110113984.4A CN112733153A (zh) | 2021-01-27 | 2021-01-27 | 源代码扫描方法、装置、电子设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112733153A true CN112733153A (zh) | 2021-04-30 |
Family
ID=75594246
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110113984.4A Pending CN112733153A (zh) | 2021-01-27 | 2021-01-27 | 源代码扫描方法、装置、电子设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112733153A (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102231134A (zh) * | 2011-07-29 | 2011-11-02 | 哈尔滨工业大学 | 基于静态分析的冗余代码缺陷检测方法 |
CN103778061A (zh) * | 2014-01-17 | 2014-05-07 | 南京航空航天大学 | 数组越界错误的自动检测和校正方法 |
CN104965788A (zh) * | 2015-07-03 | 2015-10-07 | 电子科技大学 | 一种代码静态检测方法 |
CN105389195A (zh) * | 2015-10-27 | 2016-03-09 | 北京理工大学 | 一种基于代码替换和正则表达式的静态分析工具改进方法 |
CN106940654A (zh) * | 2017-02-15 | 2017-07-11 | 南京航空航天大学 | 源代码中内存错误的自动检测和定位方法 |
-
2021
- 2021-01-27 CN CN202110113984.4A patent/CN112733153A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102231134A (zh) * | 2011-07-29 | 2011-11-02 | 哈尔滨工业大学 | 基于静态分析的冗余代码缺陷检测方法 |
CN103778061A (zh) * | 2014-01-17 | 2014-05-07 | 南京航空航天大学 | 数组越界错误的自动检测和校正方法 |
CN104965788A (zh) * | 2015-07-03 | 2015-10-07 | 电子科技大学 | 一种代码静态检测方法 |
CN105389195A (zh) * | 2015-10-27 | 2016-03-09 | 北京理工大学 | 一种基于代码替换和正则表达式的静态分析工具改进方法 |
CN106940654A (zh) * | 2017-02-15 | 2017-07-11 | 南京航空航天大学 | 源代码中内存错误的自动检测和定位方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111209005B (zh) | 程序文件的编译方法、装置和计算机可读存储介质 | |
CN110990019B (zh) | 一种Java类分析方法、装置、存储介质及电子设备 | |
WO2018072408A1 (zh) | 一种内存分析方法、装置、系统以及计算设备 | |
CN111309335B (zh) | 插件应用的编译方法、装置及计算机可读存储介质 | |
CN111176717B (zh) | 生成安装包的方法、装置及电子设备 | |
CN113296786B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN107832059A (zh) | 一种基于Makefile的代码静态分析方法和装置 | |
CN112783912B (zh) | 一种数据处理方法、装置、计算机设备及存储介质 | |
CN102929646A (zh) | 应用程序生成方法及装置 | |
CN110543427A (zh) | 测试用例存储方法、装置、电子设备及存储介质 | |
CN109656567B (zh) | 异质化业务数据处理逻辑的动态方法和系统 | |
US10929121B2 (en) | Method, device and related system for dynamically repairing application | |
CN117609952A (zh) | 一种Transformer网络的算子融合方法、装置及板卡 | |
CN113515303A (zh) | 一种项目转型方法、装置和设备 | |
CN112733153A (zh) | 源代码扫描方法、装置、电子设备和存储介质 | |
CN111488144A (zh) | 一种数据处理方法以及设备 | |
CN110826074A (zh) | 一种应用漏洞检测方法、装置和计算机可读存储介质 | |
CN112691382B (zh) | 资源处理方法、装置及计算机可读存储介质 | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
CN110780863A (zh) | 一种存储系统的跨平台开发方法、装置、设备及介质 | |
CN115543406A (zh) | 一种软件的物料清单生成方法、装置及电子设备 | |
CN114721709A (zh) | 程序包生成方法、装置、存储介质及计算机设备 | |
CN115022312A (zh) | 多智能合约引擎的实现方法、装置、电子设备及存储介质 | |
CN114579136A (zh) | 代码处理方法、装置、计算机设备和存储介质 | |
CN111158704B (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 |