1.本技术涉及计算机技术,尤其涉及一种代码的扫描方法、装置、设备、存储介质及程序产品。
背景技术:
2.在集成开发环境(ide,integrated development environment)中,开发人员可以获取源代码中的变量参数的定义行及使用行,但对于源代码中的数组的子对象进行检索,需要开发人员自行匹配数组结构;在代码检视中,对于数组结构匹配,容易忽略数组层级结构的不同,而出现获取不到对象(例如:键(key)、数组对象)、对象对应的取值(例如:键对应的键值(value),数组对象中的值)的情况。
技术实现要素:
3.本技术实施例提供一种代码的扫描方法、装置、电子设备、计算机可读存储介质及计算机程序产品,能够安全和准确地生成与源代码中的数组对象对应的模拟数组对象,从而提升开发者查验源代码的效率。
4.本技术实施例的技术方案是这样实现的:
5.本技术实施例提供一种代码的扫描方法,包括:
6.获取源代码中每行代码分别对应的标识序列,其中,每个所述标识序列包括多个标识,每个所述标识序列对应于所述源代码中的一个数组对象;
7.对每个所述标识序列进行以下处理:
8.确定所述标识序列中每个所述标识的标识类型,以及
9.基于所述标识类型对应的字典结构转换规则,对每个所述标识进行字典结构转换;
10.基于转换结果,确定与所述数组对象一一对应的模拟数组对象。
11.本技术实施例提供一种代码的扫描装置,包括:。
12.数据采集模块,用于获取源代码中每行代码分别对应的标识序列,其中,每个所述标识序列包括多个标识,每个所述标识序列对应于所述源代码中的一个数组对象;
13.数据转换模块,用于对每个所述标识序列进行以下处理:确定所述标识序列中每个所述标识的标识类型,以及基于所述标识类型对应的字典结构转换规则,对每个所述标识进行字典结构转换;基于转换结果,确定与所述数组对象一一对应的模拟数组对象。
14.本技术实施例提供一种电子设备,所述电子设备包括:
15.存储器,用于存储可执行指令;
16.处理器,用于执行所述存储器中存储的可执行指令时,实现本技术实施例所述的代码的扫描方法。
17.本技术实施例提供一种计算机可读存储介质,存储有可执行指令,所述可执行指令被处理器执行时实现本技术实施例所述的代码的扫描方法。
18.本技术实施例提供一种计算机程序产品,包括计算机程序或指令,所述计算机程序或指令被处理器执行时实现本技术实施例所述的代码的扫描方法。
19.本技术实施例具有以下有益效果:
20.在静态扫描中将源代码的标识序列对应的数组对象转换为了字典存储结构的模拟数组对象,基于字典存储结构的模拟数组对象便于获取数组对象中的对象值,并且在静态扫描中构建模拟数组对象无需执行代码,避免了产生脏数据,提升了构建模拟数组的效率与安全性,便于开发者根据模拟数组对象高效地查验源代码。
附图说明
21.图1是本技术实施例提供的代码的扫描方法的应用场景的示意图;
22.图2是本技术实施例提供的用于代码的扫描的电子设备的结构示意图;
23.图3a是本技术实施例提供的代码的扫描方法的流程示意图;
24.图3b是本技术实施例提供的代码的扫描方法的流程示意图;
25.图3c是本技术实施例提供的代码的扫描方法的流程示意图;
26.图3d是本技术实施例提供的代码的扫描方法的流程示意图;
27.图3e是本技术实施例提供的代码的扫描方法的流程示意图;
28.图4是本技术实施例提供的数组对象的层级关系示意图;
29.图5是本技术实施例提供的代码的扫描方法的流程示意图;
30.图6是本技术实施例提供的代码的扫描方法的流程示意图。
具体实施方式
31.为了使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术作进一步地详细描述,所描述的实施例不应视为对本技术的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
32.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
33.在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本技术实施例能够以除了在这里图示或描述的以外的顺序实施。
34.除非另有定义,本文所使用的所有的技术和科学术语与属于本技术的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本技术实施例的目的,不是旨在限制本技术。
35.对本技术实施例进行进一步详细说明之前,对本技术实施例中涉及的名词和术语进行说明,本技术实施例中涉及的名词和术语适用于如下的解释。
36.1)行对象,以服务器端编程语言(php,professional hypertext preprocessor)的语法中的语句单元为单位分隔的对象,行对象可以是一个占用多行定义的数组,例如:数组对象['key1'=》'value1','key2'=》'value2']可以视为一个行对象。行对象还可以是
变量声明,例如:一行(代码中以回车符分隔的代码块)中的多个变量声明,每个变量声明可以作为一个单独行对象。
[0037]
2)标识(token)序列,是静态扫描工具(ulink,usb接口仿真器)中使用核心模块(pygments)开源工具获取的代码分词结果,标识序列中包括提取到的关键词、区分注释、字符串文本等类型的标识。
[0038]
3)数组对象,服务器端编程语言中的一种数据结构,可以是一维数组或者多维数组。通常由key和value组成的键值对的形式出现,如:['key1'=》'value1','key2'=》'value2'],是一个二维数组,包括两个键值对。本技术实施例中,为便于进行区分以及解释说明,将key称为关键字或者键,将key对应的value称为键值或者值,关键字与键值组成键值对。
[0039]
4)模拟数组对象,静态扫描工具中,基于数组对象进行模拟得到的对象。模拟数组对象提供写入、查询等接口,本体数据保存在字典存储结构中。字典数组也即模拟数组对象,是python中的一种字典存储结构,与服务器端编程语言的数组对象有相似之处,也通常以无序的键值对(键值对包括关键字、关键字对应的键值)出现,如:arrayobj{'key1':'value1','key2':'value2'}。
[0040]
5)参数获取(get)函数,用于获取数组对象中某个关键字对应的值的函数,可传入多个关键字来实现多维数组深层级取值,键值可以存在多个,返回所有的可能的键值的集合。
[0041]
6)参数设置(set)函数,用于对数组对象中键设置对应的值的函数,可用于传入多个键来实现多维数组深层级赋值。对一个键进行赋值时,值可以存在多个,例如:模拟数组对象中有一个键值对key:[value1],通过参数设置函数向模拟数组对象中写入一个值集合[value2,value3,value4],得到写入后的键值对key:[value1,value2,value3,value4]。
[0042]
本技术实施例提供一种代码的扫描方法、代码的扫描装置、用于代码的扫描的电子设备和计算机可读存储介质、计算机程序产品,能够将源代码中行对象的标识序列中的数组对象转换为字典结构的模拟数组对象,从而基于模拟素组对象便于获取对应的数组对象中不同层级的对象的值。
[0043]
本技术实施例提供的电子设备可以实施为笔记本电脑,平板电脑,台式计算机,机顶盒,移动设备(例如,移动电话,便携式音乐播放器,个人数字助理,专用消息设备,便携式游戏设备)、车载终端等各种类型的用户终端,也可以实施为服务器。下面,将说明设备实施为服务器时的示例性应用。
[0044]
参见图1,图1是本技术实施例提供的代码的扫描方法的应用场景的示意图,涉及终端设备401、网络300、服务器200。服务器200与终端设备401之间通过网络300进行通信,网络300可以是广域网或者局域网,又或者是二者的组合。
[0045]
用户可以是编写源代码的开发人员,服务器200是代码扫描工具或者平台对应的用于静态扫描的服务器,用户通过终端设备401访问代码扫描工具(服务器200的图形前端),将待检测的源代码文件发送到服务器200,服务器200获取源代码文件的标识序列(标识序列对应于数组对象),在构建模拟数组对象的过程中对标识序列进行了匹配,可以确定源代码中的错误(bug),并将错误反馈到终端设备401,使开发人员可以获取到源代码中的错误。
[0046]
在一些实施例中,基于构建完成的模拟数组对象,开发人员可以通过终端设备401向服务器200发送待检索的变量对象,服务器200基于变量对象在源代码对应的数组对象中进行检索,并基于检索得到的数组对象的模拟数组对象中提取变量对象的值,将变量对象的值反馈到终端设备401。
[0047]
本技术实施例可以通过数据库技术实现,数据库(database),简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
[0048]
数据库管理系统(database management system,dbms)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来做分类,例如关系式、xml(extensible markup language,即可扩展标记语言);或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如结构化查询语言(sql,structured query language)、xquery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些dbms能够跨类别,例如,同时支持多种查询语言。
[0049]
本技术实施例,还可以通过机器学习实现,机器学习(machine learning,ml)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。机器学习是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。机器学习和深度学习通常包括人工神经网络、置信网络、强化学习、迁移学习、归纳学习、式教学习等技术。
[0050]
本技术实施例,还可以通过云技术实现,云技术(cloud technology)基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成重要支撑。技术网络系统的后台服务需要大量的计算、存储资源,如视频网站、图片类网站和更多的门户网站。伴随着互联网行业的高度发展和应用,以及搜索服务、社会网络、移动商务和开放协作等需求的推动,将来每个物品都有可能存在自己的哈希编码识别标识,都需要传输到后台系统进行逻辑处理,不同程度级别的数据将会分开处理,各类行业数据皆需要强大的系统后盾支撑,只能通过云计算来实现。
[0051]
参见图2,图2是本技术实施例提供的用于代码的扫描的电子设备的结构示意图,以电子设备为服务器为例,包括:至少一个处理器410、存储器450、至少一个网络接口420。电子设备400中的各个组件通过总线系统440耦合在一起。可理解,总线系统440用于实现这些组件之间的连接通信。总线系统440除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线系统440。
[0052]
处理器410可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(dsp,digital signal processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
[0053]
存储器450可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存
储器,硬盘驱动器,光盘驱动器等。存储器450可选地包括在物理位置上远离处理器410的一个或多个存储设备。
[0054]
存储器450包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(rom,read only memory),易失性存储器可以是随机存取存储器(ram,random access memory)。本技术实施例描述的存储器450旨在包括任意适合类型的存储器。
[0055]
在一些实施例中,存储器450能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
[0056]
操作系统451,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。
[0057]
网络通信模块452,用于经由一个或多个(有线或无线)网络接口420到达其他计算设备,示例性的网络接口420包括:蓝牙、无线相容性认证(wifi)、和通用串行总线(usb,universal serial bus)等。
[0058]
在一些实施例中,本技术实施例提供的视频表单生成装置可以采用软件方式实现,图2示出了存储在存储器450中的代码的扫描装置455,其可以是程序和插件等形式的软件,包括以下软件模块:数据获取模块4551、数据转换模块4552,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
[0059]
将结合本技术实施例提供的终端的示例性应用和实施,说明本技术实施例提供的代码的扫描方法。参见图3a,图3a是本技术实施例提供的代码的扫描方法的流程示意图,将结合图3a示出的步骤进行说明。
[0060]
在步骤301中,获取源代码中每行代码分别对应的标识序列。
[0061]
这里,每个标识序列(也即token序列)包括多个标识,每个标识序列对应于源代码中的一个数组对象。
[0062]
在一些实施例中,源代码可以是服务器端编程语言或者其他语言的源代码,对应地,数组对象可以是php语言的数组结构或者其他语言的数组结构(或者链表结构)。本技术实施例中以源代码是服务器端编程语言的代码为例进行说明。
[0063]
示例的,数组对象可以是多维数组,多维数组中包含多个元素,元素的类型包括:键值对、键值或者数组对象,数组对象中还可以包含多个层级的数组对象,参考图4,图4是本技术实施例提供的数组对象的层级关系示意图,数组对象a1是一个多层级嵌套的数组对象,数组对象a1中包含多个数组对象(数组对象a11~数组对象a1n),n是大于1的正整数。数组对象a1是数组对象a11~数组对象a1n的父级,数组对象a11~数组对象a1n也可以是多层嵌套的数组对象,数组对象a11中包括数组对象a111~数组对象a11n,数组对象a11n中包括数组对象a11n1~数组对象a11nn。每个数组对象与其所包括的数组对象之间存在对应关系。
[0064]
示例的,可以对每个标识序列同时执行步骤302及步骤303。
[0065]
在步骤302中,确定标识序列中每个标识的标识类型。
[0066]
示例的,标识序列中包括关键词、区分注释、字符串文本等标识,标识属于字符,标识是字符中表示特定含义的字符。标识类型包括:起始标识、字符串文本以及结尾标识。
[0067]
起始标识是数组对象对应的字符中表示数组对象起始的字符或者字符串,例如:
起始标识可以是“$demoarray=[”、“[”、“array(”等,这些字符出现在数组对象中的起始位置。
[0068]
字符串文本可以是数组对象中表征元素的字符串或者用于表征元素之间关系的字符,例如:映射符号(=》)、关键字(也即key)、键值(也即value)、分隔符号(例如:逗号)。例如:字符串文本可以是“'key1'=》'value1','key2'=》'value2'”,其中“'key1'=》'value1'”是表征数组对象中一个元素的字符串,key1、key2是关键字,“=》”是映射符号,用于表征关键字与键值之间的映射关系,value1、value2是键值;“,”是分隔符号,用于分隔数组中不同的元素。
[0069]
结尾标识是数组对象对应的字符中表示数组对象结尾的字符,例如:结尾标识可以是“)”、“]”等,这些字符出现在数组对象中的结尾位置。
[0070]
在一些实施例中,步骤302可以通过以下方式实现:对标识序列中每个标识进行以下处理:对不同的标识类型对应的参考标识与标识序列中的标识进行匹配处理,得到参考标识中与标识序列中的标识匹配的目标标识;将与目标标识对应的标识类型,作为标识序列中的标识对应的标识类型。
[0071]
示例的,标识类型为起始标识,对应的参考标识可以是array(或者[、$demoarray=[等标识;标识类型为字符串文本,对应的参考标识可以是关键字(例如:key1、key2、limit、cycle等)、键值(例如:value1、value2等)、映射符号、分隔符号;标识类型为结尾标识,对应的参考标识可以是逗号等。假设标识序列中的一段字符串为:$array=['key1'=》'value1','key2'=》'value2'],依次对每个字符进行匹配得到:“$array=[”是起始标识;key1、key2是关键字;=》是映射符号;value1、value2是键值;“,”是分隔符号;“]”是结尾标识。
[0072]
在步骤303中,基于标识类型对应的字典结构转换规则,对每个标识进行字典结构转换。
[0073]
本技术实施例中,字典结构转换规则,是基于php语言的源代码中的数组对象转换为字典结构的模拟数组对象的转换规律。不同的标识类型对应于不同的字典结构转换规则,基于标识对应的标识类型确定该标识对应的字典结构转换规则,并基于对应的字典结构转换规则对该标识进行转换。
[0074]
在一些实施例中,参考图3b,图3b是本技术实施例提供的代码的扫描方法的流程示意图;步骤303可以通过步骤331至333实现,以下具体说明。
[0075]
在步骤331中,当标识的标识类型为起始标识时,基于起始标识对应的字典结构转换规则,将标识转换为字典结构中的头部标识。
[0076]
示例的,举例一个数组对象为:$demoarray=['commitstepone'=》['key1'=》'value1','key2'=》'value2',],'commitsteptwo'=》['key3'=》'value3','key4'=》'value4',],]。
[0077]
示例的,起始标识对应的字典结构转换规则包括,将起始标识对应的字符串转换为字典结构中用于表征模拟数组对象头部的标识(也即起始的标识)对应的字符串。例如:字典结构中的头部标识对应的字符串可以表征为“arrayobj{”。上述数组对象中“$demoarray=[”为数组对象中的起始标识对应的字符串,则将其转换为“arrayobj{”。
[0078]
在步骤332中,当标识的标识类型为字符串文本时,基于字符串文本对应的字典结
构转换规则,将标识转换为字典结构中的字符串文本。
[0079]
示例的,字符串文本对应的字典结构转换规则包括:将字符串文本对应的字符串的结构转换为字典结构中的字符串文本对应的结构。字符串文本包括映射符号、分隔符号、键(key)以及值(value)。不同的字符串文本对应的字典结构转换规则不同,当确定标识的标识类型为字符文本串时,对字符串文本对应的类型进行判断,基于字符串文本对应的类型的字典结构转换规则对字符串文本进行转换,以下具体说明对于不同类型的字符串文本进行的转换
[0080]
当字符串文本为映射符号时,将映射符号转换为字典结构中的定义符号(例如:冒号“:”),并将标识序列中与映射符号相邻的字符转换为字典结构,可以通过以下方式实现:从标识序列中确定位于映射符号之前的字符以及位于映射符号之后的字符;将位于映射符号之前的字符转换为字典结构中的定义词,将映射符号转换为字典结构中的定义符号,将位于映射符号之后的字符转换为字典结构中与位于映射符号之前的字符对应的定义值。
[0081]
示例的,映射符号在数组对象中通常表示关键字与键值之间的对应关系。键值可以是数字、表征数值的字符或者数组对象。例如:数组对象'commitstepone'=》['key1'=》'value1','key2'=》'value2',]中,'commitstepone'是关键字,位于映射符号之后的“['key1'=》'value1','key2'=》'value2',]”是数组对象也是'commitstepone'对应的键值。key1是关键字,value1是key1对应的键值。key2是关键字,value2是key2对应的键值。示例的,定义符号用于表征字典结构中定义词和定义值之间的对应关系,模拟数组对象中的定义词对应于数组对象中的关键字,模拟数组对象中的定义值对应于数组对象中的键值。
[0082]
示例的,将映射符号(=》)转换为字典结构为定义符号(:),将映射符号前的字符转换为字典结构中的定义词,也即将关键字作为定义词;将映射符号后的标识转换为字典结构中与映射符号前的字符对应的定义值,也即将键值转换为以字典结构进行存储,例如:'value1'存储为['value1']。则数组对象中的键值对'key1'=》'value1'转换为字典结构为:'key1':['value1'],其中'key1'是定义词,['value1']是定义值。
[0083]
当字符串文本为分隔符号(例如:“,”逗号)时,将标识序列中与分隔符号相邻的字符转换为字典结构,可以通过以下方式实现:从标识序列中确定与分隔符号相邻的字符;当与分隔符号相邻的字符中的键值缺失对应的关键字时,对缺失对应的关键字的键值进行自增标识(自增id,也即对缺失对应的关键字的键值赋予关键字)处理,得到键值对,将键值对转换为字典结构中的定义值对;当位于分隔符号之后的字符不是关键字或键值时,跳过分隔符号,并基于位于分隔符号之后的字符转入进行字典结构转换的处理;当位于分隔符号之后的字符是关键字或键值时,将分隔符号作为字典结构中的分隔符号。
[0084]
这里,键值对包括键值与键值对应的自增关键字,定义值对包括定义词以及定义词对应的定义值。
[0085]
示例的,数组对象的形式可以为每个元素为键值对或者数组(例如:['key1'=》'value1','key2'=》'value2']),还可以为每个元素为键值(例如:['value1','value2']),也即,分隔符号前的字符为缺失对应的关键字的键值。在这种情况下,可以对缺失对应的关键字的键值赋予关键字,例如:对'value1'进行自增标识处理,得到键值对0=》'value1',其中,0是自增关键字,进行自增标识后,可以按照映射符号对应的转换为字典结构的方式对0=》'value1'进行转换。
[0086]
示例的,['value1','value2',]转换成字典结构为:arrayobj{0:['value1'],1:['value2']},其中,“'value1'”与“'value2'”之间的逗号用于分隔两个键值,则将其保留,作为字典结构中的分隔符号。位于“'value2'”之后的逗号“,”之后的字符为结尾标识],结尾标识]不是关键字或键值,则跳过该逗号“,”。
[0087]
在步骤333中,当标识的标识类型为结尾标识时,基于结尾标识对应的字典结构转换规则,将标识转换为字典结构中的结尾标识。
[0088]
示例的,结尾标识对应的字典结构转换规则包括:将结尾标识对应的字符转换为字典结构中的结尾标识对应的字符,例如:结尾标识对应的字符可以为“)”、“]”等,字典结构中的结尾标识对应的字符可以为“}”。
[0089]
在一些实施例中,步骤333可以通过以下方式实现:当标识的标识类型为结尾标识且结尾标识之前存在起始标识时,将结尾标识转换为字典结构中的结尾标识;当标识的标识类型为结尾标识且结尾标识之前不存在起始标识时,对结尾标识进行异常抛弃处理。
[0090]
示例的,以数组对象['key1'=》'value1','key2'=》'value2']为例进行说明,其中“]”是结尾标识,将其转换为字典结构中的结尾标识则为“}”,则上述数组对象转换为模拟数组对象为:arrayobj{key1:['value1'],key2:['value2']}。假设标识序列的内容为:“['key1'=》'value1','key2'=》'value2',],]”,上述字符中倒数第二个结尾标识有对应的起始标识,将其转换为字典结构中的结尾标识},倒数第二个结尾标识与最后一个结尾标识之间存在一个逗号(分隔符号),将逗号跳过,最后一个结尾标识之前缺失对应的起始标识,将最后一个结尾标识进行异常抛弃处理,则转换为模拟数组对象为arrayobj{key1:['value1'],key2:['value2']}。
[0091]
示例的,在数组对象中,结尾标识与起始标识是相互对应的。若未出现独立的结尾标识(缺失对应的起始标识的结尾标识),则依次对数组对象的结尾标识以及结尾标识之后的标识进行转换,若数组对象还存在父级数组对象,则将父级数组对象的结尾标识转换为字典结构中的结尾标识,使得数组对象能够作为值存入父级数组对象;若出现了独立的结尾标识,则该结尾标识存在异常,对该结尾标识进行异常抛弃处理。执行本技术实施例代码的扫描方法的服务器,可以将异常抛弃的结尾标识对应的数组对象发送至终端设备,以使开发人员获取代码异常信息。
[0092]
示例的,每个标识进行字典结构转换得到的字符组成字典结构的模拟数组对象,每个标识与其转换得到的字符是一一对应的,则数组对象与模拟数组对象之间也是一一对应的。将字典结构的模拟数组对象,以及不同的数组对象与模拟数组对象之间的对应关系作为转换结果。
[0093]
在步骤304中,基于转换结果,确定与数组对象一一对应的模拟数组对象。
[0094]
这里,转换结果包括:字典结构的模拟数组对象,以及不同的数组对象与模拟数组对象之间的对应关系。
[0095]
示例的,数组对象可以是多维数组,也即数组对象中包含多个元素,每个元素可以是键值对或者键值、数组对象等。可以从标识序列的头部开始依次进行遍历,每匹配到起始标识则将起始标识转换为字典结构的起始标识,也即模拟数组对象中的头部标识,从外层向数组对象的内层依次进行转换,通过将结尾标识从内层至外层转换为字典结构中的结尾标识,也即模拟数组对象中的结尾标识,使得模拟数组对象中的层级关系与数组对象的层
级关系一一对应。基于不同的数组对象与模拟数组对象之间的对应关系,可以确定与数组对象对应的字典结构的模拟数组对象。
[0096]
例如:基于上述举例的数组对象$demoarray=['commitstepone'=》['cycle'=》3,'limit'=》1,],'commitsteptwo'=》['cycle'=》5,'limit'=》2,],]进行转换,可以得到模拟数组对象:arrayobj{'commitstepone':[arrayobj{'cycle':[3],'limit':[1]}],'commitsteptwo':[arrayobj{'cycle':[5],'limit':[2]}]}。
[0097]
本技术实施例中,基于源代码的标识序列构建与数组对象对应的模拟数组对象,在静态扫描下进行构建,提升了构建模拟数组对象的准确性与构建效率,有利于基于更准确的模拟数组对象获取数组对象中的层级结构以及值。
[0098]
在一些实施例中,参考图3c,图3c是本技术实施例提供的代码的扫描方法的流程示意图。在步骤304之后,当数组对象中的元素被重新赋值时,还可以通过步骤305至步骤306同步地对模拟数组对象中对应的元素进行更新,以下具体说明。
[0099]
在步骤305中,响应于针对数组对象的赋值操作,获取赋值操作对应的新键值以及新键值对应的键值地址。
[0100]
示例的,开发人员可以对数组对象进行赋值操作,例如:开发人员通过终端设备的图形前端进行赋值操作(例如:输入新键值以及新键值对应的键值地址),终端设备将赋值操作对应的数据发送到服务器中,服务器根据对应的数据获取新键值以及对应的键值地址,对数组对象进行赋值。
[0101]
在步骤305中,基于新键值以及键值地址调用参数设置函数(例如set函数),确定与数组对象一一对应的模拟数组对象中与键值地址匹配的目标地址,并基于目标地址将新键值存储到模拟数组对象中。
[0102]
示例的,新键值可以是一个键值集合,将新键值存储到模拟数组对象对应的目标地址时,将新键值新增到该目标地址对应的键值中。例如:对于模拟数组对象arrayobj{'commitstepone':[arrayobj{'cycle':[3],'limit':[1]}]},目标地址为$demoarray['commitstepone']['limit'],新键值为10,则重新赋值后的模拟数组对象可以为:arrayobj{'commitstepone':[arrayobj{'cycle':[3],'limit':[1,10]}]},对目标地址中新存入了键值10,在重新赋值后,若对模拟数组对象中的目标地址对应的键值进行获取,则可以获取到新键值10。
[0103]
本技术实施例中,通过在数组对象中的值进行更改后对模拟数组对象进行同步赋值,保持了模拟数组对象与数组对象之间的一致性。
[0104]
在一些实施例中,参考图3d,图3d是本技术实施例提供的代码的扫描方法的流程示意图。在步骤304之后,还可以通过步骤307至步骤310基于模拟数组对象获取数组对象中的对象值,以下具体说明。
[0105]
在步骤307中,响应于数据输入操作,获取数据输入操作对应的待检索的变量对象。
[0106]
示例的,数据输入操作所输入的数据可以是一个变量对象,或者包含多个变量对象的列表。获取数据输入操作对应的待检索的变量对象,也即,从数据输入操作所输入的数据提取变量对象或者变量对象的列表。,变量对象可以是键值未知的关键字。
[0107]
例如:开发人员并未确定对数组对象中的层级结构,但开发人员存在了解代码中
的某一些关键字对应的键值的需求,开发人员在终端设备上显示的图形前端(服务器对应的图形前端)输入了多个关键字(形成了一个关键字列表),终端设备将关键字列表作为数据输入操作对应的数据发送到服务器,服务器对数据进行解析得到了这些关键字,将这些关键字作为待检索的变量对象。基于待检索的变量对象对应的字符串,在源代码的标识序列中检索该变量对象对应的数组对象,并确定数组对象一一对应的模拟数组对象,利用参数获取函数从模拟数组对象中获取待检索的变量对象分别对应的对象值,对象值可以是值(value)也可以是值集合(集合中包含多个值)。服务器将这些对象值发送至终端设备,以使开发人员获取到关键字对应的键值。
[0108]
在步骤308中,基于变量对象的对象名称的字符串,在所有数组对象的标识序列中进行迭代地对象检索,确定与变量对象匹配的数组对象以及变量对象对应的变量值。
[0109]
示例的,数组对象可以是多个层级嵌套的多维数组,关键字可以是低层级数组对象中的关键字,可以通过对数组对象在各层级中进行迭代地对象检索,得到变量对象实际对应的数组对象。
[0110]
在一些实施例中,参考图3e,图3e是本技术实施例提供的代码的扫描方法的流程示意图;步骤308可以通过步骤381至步骤386实现,以下具体说明。
[0111]
在步骤381中,将待检索的变量对象作为当前的待处理对象。
[0112]
在步骤382中,按照当前的待处理对象中字符对应的标识类型,分割当前的待处理对象,得到当前的待处理对象的当前对象名称以及当前变量值。
[0113]
这里,当前对象名称是关键字或起始标识,当前变量值为值(value)。
[0114]
示例的,待处理对象以字符串的形式进行表示,假设一个待检索的变量对象为$cycle,将该待检索的变量对象作为当前的待处理对象。根据字符对应的标识类型对待处理对象的字符串进行分割,$cycle分割得到对象名称$cycle(起始标识)以及空值[](也即没有内容的值)。将对象名称$cycle作为当前对象名称,将空值[]作为当前变量值。
[0115]
在步骤383中,在当前变量值与已获取的当前变量值不同时,将当前变量值与已获取的当前变量值进行组合,得到目标变量值。
[0116]
示例的,若当前变量值与已经获取到的当前变量值相同时,则不组合当前变量与已经获取的当前变量值,执行步骤384,若与已获取的当前变量值不同时则获取目标变量值后执行步骤384。例如:已经获取的当前变量值为空值[]、['cycle'],分割后得到的当前变量值为空值[]。则与之前获取的当前变量值重复,不进行组合。假设,分割后得到的当前变量值为[$key],将其与其已经获取的当前变量值组合,得到目标变量值['$key','cycle']。
[0117]
在步骤384中,基于当前对象名称对应的字符串在所有数组对象的标识序列中进行检索,得到与当前对象名称对应的字符串匹配的目标对象。
[0118]
示例的,将当前对象名称字符串在所有数组对象的标识序列对应的字符串中进行匹配,得到当前对象名称的字符串对应的目标对象。目标对象可以是常量对象(常量是指在计算机程序运行时,不会被程序修改的量)、变量对象(变量是在计算机程序运行时,会被程序修改的量)或者数组对象。例如:根据$cycle匹配到了字符串cycle,字符串cycle对应的目标对象为$array['cycle'],目标对象是一个变量对象。
[0119]
示例的,步骤384后根据目标对象的类型,执行步骤385或者步骤386。
[0120]
在一些实施例中,可能会存在目标对象既不是常量、变量也不是数组对象的情况。
例如:目标对象不存在、目标对象是异常对象等,这种情况下服务器可以向终端设备反馈异常信息,以告知开发人员数组对象中存在异常对象。
[0121]
在步骤385中,当目标对象是数组对象时,将数组对象作为与变量对象匹配的数组对象,并将目标变量值作为变量对象对应的变量值。
[0122]
示例的,当目标对象为数组对象时,则可以根据数组对象获取对应的模拟数组对象,以便于从字典结构的模拟数组对象中提取对应的值。
[0123]
在步骤386中,当目标对象不是数组对象时,将目标对象作为当前的待处理对象,执行按照当前的待处理对象中字符对应的标识类型分割当前的待处理对象的步骤。
[0124]
示例的,若目标对象不是数组对象,则回到步骤382中迭代执行步骤382到步骤384,直至目标对象为数组对象。
[0125]
在步骤309中,基于不同的数组对象与模拟数组对象之间的关系,获取与匹配的数组对象一一对应的模拟数组对象。
[0126]
示例的,模拟数组对象是依据数组对象对应的标识序列构建的,数组对象与其对应的模拟数组对象之间存在对应关系,在检索得到数组对象后,可以基于对应关系获取该数组对象的模拟数组对象。
[0127]
在步骤310中,基于变量对象对应的变量值,从模拟数组对象中获取与变量对象对应的变量值匹配的目标值,将目标值作为变量对象的对象值。
[0128]
示例的,假设检索得到的数组对象为$demoarray=['commitstepone'=》['cycle'=》3,'limit'=》1,],'commitsteptwo'=》['cycle'=》5,'limit'=》2,],],变量对象的变量值为['$key','cycle'],数组对象对应的模拟数组对象为:arrayobj{'commitstepone':[arrayobj{'cycle':[3],'limit':[1]}],'commitsteptwo':[arrayobj{'cycle':[5],'limit':[2]}]}。$key是变量,可以将$key使用通配符'.*'替代,则根据模拟数组对象可以得到$cycle对应的对象值[3,5]。
[0129]
在一些实施例中,步骤10可以通过以下方式实现:将变量对象对应的变量值作为索引,基于索引调用参数获取函数(get函数),以从模拟数组对象中获取与索引匹配的目标值。
[0130]
示例的,模拟数组对象为字典结构,可以通过参数获取函数从模拟数组对象中某个键对应的值,参数获取函数支持传入多个键来获取多维数组深层级的值。如果存在多个值,参数获取函数可以返回所有对应的值组成的集合。例如:[3,5],这是一个具有两个元素的值集合。
[0131]
在一些实施例中,基于模拟数组对象中获取到的数组对象中的关键字对应的值,还能够对数组对象之间的大小进行比较,以确定不同数组对象之间的关系(例如:大于、小于及等于)。
[0132]
本技术实施例中,基于源代码的标识序列构建与数组对象一一对应的模拟数组对象,在静态扫描的过程中进行模拟数组对象的构建,无需执行代码,避免了产生脏数据,对数组对象存在异常的字符进行异常抛弃处理,能够获取到数组对象中的结构异常,提升了构建模拟数组的准确性与安全性、稳定性。基于数组对象与模拟数组对象之间的对应关系,即使数组对象的子结构是未知的,也可以通过模拟数组对象获取到数组对象中变量对应的值,便于获取数组对象中的变量值,便于对数组对象之间的大小进行判断。
[0133]
下面,将说明本技术实施例在一个实际的应用场景中的示例性应用。本技术实施例提供的代码的扫描方法可以应用在如下实际应用场景中:开发人员在进行一款软件的测试时,通常要对软件的源代码进行检查,以确定源代码中是否存在错误,在集成开发环境(ide,integrated development environment)中,开发人员可以获取源代码中的变量参数的定义行及使用行,但无法对源代码中的数组的子对象进行检索,需要开发人员自己匹配数组结构,在代码检视中,容易忽略数组层级结构不同,而出现取不到对象的情况。本技术实施例提供的代码的扫描方法,可以基于开发人员提供的源代码进行静态扫描,构建数组对象的字典结构的模拟数组对象,并基于模拟数组对象对数组对象中的子对象进行检索,提升了静态扫描的效率,便于确定源代码中的错误。
[0134]
示例的,数组对象是php中的一种数据结构,可以是一维数组或者多维数组。数组对象中的每个元素可以是由键(key)与值(value)组成的键值对(例如:['key1'=》'value1','key2'=》'value2']),还可以是值(例如:['value1','value2'])。以下为便于区分与解释说明,将键称为关键字,将值称为键值。模拟数组对象,是基于数组对象进行模拟得到的对象,提供写入,查询等接口,模拟数组对象对应的数组以字典存储结构进行存储,例如:{'key1':'value1','key2':'value2'}。字典(dictionary)是常用于查找和排序的列表,基于关键字可以查询得到关键字对应的键值。
[0135]
为便于对数组对象中的层级关系进行理解,参考图4,图4是本技术实施例提供的数组对象的层级关系示意图。数组对象a1是一个多层级嵌套的数组对象,数组对象a1中包含多个数组对象(数组对象a11~数组对象a1n),n是正整数。数组对象a1是数组对象a11~数组对象a1n的父级,数组对象a11~数组对象a1n也可以是多层嵌套的数组对象,数组对象a11中包括数组对象a111~数组对象a11n,数组对象a11n中包括数组对象a11n1~数组对象a11nn。对于模拟数组对象,每个子数组对象与对应的父数组对象之间存在父级指针(parent),可以基于父级指针检索每个子数组对象对应的父数组对象,父级指针也即子数组对象与其父数组对象之间的对应关系。每个模拟数组对象还具有指向模拟数组对象所在行对象的指针(line)。
[0136]
示例的,开发人员基于终端设备将源代码对应的文件发送到服务器中,服务器可以利用ulink静态扫描工具中的pygments开源工具获取源代码的代码分词结果,也即标识序列。若将源代码以行对象进行划分,则每个行对象对应于一个标识序列,每个标识序列中的源代码对应于一个数组对象,数组对象可以是多层级嵌套的多维数组。基于数组对象可以构建数组对象对应的模拟数组对象。以下对模拟数组对象的构建过程进行解释说明。
[0137]
参考图5,图5是本技术实施例提供的代码的扫描方法的流程示意图;示例的,对于每个标识序列,执行图5中的各步骤,可以得到每个标识序列对应的数组对象的模拟数组对象,图5中各步骤以服务器为执行主体,服务器可以同时多个标识序列执行图5中的步骤。
[0138]
在步骤501a中,判断是否为起始关键词,如果是,则执行步骤502a,如果否,则执行步骤503a。
[0139]
示例的,可以基于初始化(int)函数构建模拟数组对象,初始化函数用于基于实际的数组对象的标识序列,构建对应的模拟数组对象,能够迭代生成嵌套模拟的多维数组对象。标识序列包括关键词、区分注释、字符串文本等标识。对代码的标识序列中从第一行开始的每个字符进行扫描,并基于每个字符匹配到的标识类型将每个字符转换为模拟数组对
象中的字符,直至代码的标识序列中的最后一行。标识类型包括起始关键词(也即起始标识)、结尾标识(符号)、字符串文本。起始关键词例如:array(或者[等。
[0140]
为便于解释说明,举例一个php数组对象,如下所示:
[0141]
$demoarray=['commitstepone'=》['cycle'=》3,'limit'=》1,],'commitsteptwo'=》['cycle'=》5,'limit'=》2,],];
[0142]
其中,[、$demoarray=[等字符是起始关键词。
[0143]
在步骤502a中,新建字典对象或子对象。
[0144]
示例的,当步骤501a的判断结果为是时,也即,如果匹配到了起始关键词,则基于扫描到的字符新建一个对象。字典对象是指以字典结构存储的模拟数组对象,子对象是指具有父级模拟数组对象的模拟数组对象。
[0145]
假设,匹配到了array=[、array(等起始关键词,则新建的对象是字典对象,如果匹配到了[,且[之前还包括array=[、array(等起始关键词,则新建的对象是子对象。新建对象的具体方式为,将实际数组中起始字符(array=[、[、array(等字符)转换为arrayobj{。
[0146]
示例的,将$demoarray=[转换为字典结构,则得到arrayobj{。
[0147]
在步骤503a中,判断是否为映射符号,如果是,则执行步骤504a、步骤505a,如果否,则执行步骤506a。
[0148]
示例的,映射符号为=》。
[0149]
在步骤504a中,将位于映射符号之前的字符作为关键字进行存储。
[0150]
在步骤505a中,将位于映射符号之后的字符作为键值进行存储。
[0151]
示例的,字符对象是将字符或者字符串作为一个对象,映射符号用于表示关键字与键值之间的映射关系,因此若扫描到映射符号,则映射符号前的字符或者字符串是关键字,映射符号后的字符或字符串是关键字对应的键值,并将映射符号转换为字典存储结构中的用于表示键值与关键字之间关系的符号,例如冒号(:),冒号的含义是定义冒号后的内容为冒号前的内容,在模拟数组对象中,可以将冒号前的字符对象作为定义,将冒号后的字符对象作为定义的值内容,也即定义值。
[0152]
示例的,基于上述举例的数组对象进行解释说明,假设当前扫描到:
[0153]
'commitstepone'=》['cycle'=》3,'limit'=》1,]。
[0154]
转换为字典结构,则得到'commitstepone':[arrayobj{'cycle':[3],'limit':[1]}。
[0155]
在步骤506a中,判断是否为分隔符号,如果是,则执行步骤507a,如果否,则执行步骤511a。
[0156]
示例的,分隔符号(,)在代码中通常用于分隔数组对象中不同的元素(例如:键值对、键值等)。
[0157]
在步骤507a中,判断分隔符号前是否存在关键字,如果是,则执行步骤509,当步骤507a的判断为否,则执行步骤508a。
[0158]
如上文,数组对象的类型可以是['value1','value2']也可以是['key1'=》'value1','key2'=》'value2'],也即,分隔符号可以用于分隔键值对或者键值,对分隔符号前的字符进行判断以确定数组对象中元素的类型。
[0159]
在步骤508a中,进行自增标识处理,并将自增标识作为关键字。
[0160]
示例的,对于['value1','value2']这种没有关键字的数组,可以通过自增标识(id)进行维护,自增标识例如[0=》'value1',1=》'value2'],其中,0是键值'value1'的自增关键字,将其转换为模拟数组对象则为:arrayobj{0:['value1'],1:['value2']}。在步骤508a后,继续对代码的标识序列中的标识进行扫描。
[0161]
在步骤509a中,将位于分隔符号之前的字符作为键值进行存储。
[0162]
在步骤510a中,将位于分隔符号之后的字符作为关键字进行存储。
[0163]
示例的,对于['cycle'=》3,'limit'=》1,]这种存在键值对的数组,可以确定分隔符号前的“3”是关键字'cycle'的键值,可以确定分隔符号后的'limit'是键值“1”的关键字。
[0164]
在一些实施例中,分割符号后的字符为结尾符号,则分割符号前的字符对象是数组中最末尾的键值对或者键值,可以将分隔符号跳过。例如:['cycle'=》3,'limit'=》1,]转换为字典存储结构为arrayobj{'cycle':[3],'limit':[1]},其中键值“1”后的分隔符号被跳过,并未以字典存储结构进行存储。
[0165]
在步骤511a中,判断是否为结尾符号,如果是,则执行步骤512a,如果否,则执行步骤501a。
[0166]
示例的,结尾符号也即)、]等符号。在代码中用于表征数组对象的结尾。在步骤512a中,判断在结尾符号前是否匹配到起始关键词,如果是,则执行步骤514a,如果否,则执行步骤513a。
[0167]
在步骤513a中,对字符进行异常抛弃。
[0168]
示例的,数组对象通常由起始关键词作为头部,以结尾符号作为尾部,例如:数组对象array=[**]。其中**指代数组对象中的元素,结尾符号与起始关键词形成对应。若匹配到结尾符号,但不存在起始关键词,例如:**],则当前扫描到的字符是异常字符,对其进行抛弃。
[0169]
在步骤514a中,判断当前数组是否存在父数组,如果否,则执行步骤515a,如果是,则执行步骤516a。
[0170]
示例的,确定是否存在父数组可以通过以下方式实现:则判断在当前数组对象对应的起始关键词之前,是否还匹配到起始关键词。若有,则获取该起始关键词对应的数组对象与当前数组对象之间的关系,以确定是否存在父数组。
[0171]
在步骤515a中,结束返回字典对象。
[0172]
示例的,如果不存在父数组,则将当前扫描到的字符转换为字典结构中的结尾符号,生成数组对象。例如:将结尾符号]转换为}。
[0173]
在步骤516a中,将当前数组作为键值存入父数组。
[0174]
示例的,如果存在父数组,则当前数组对象是子对象,将当前扫描到的字符转换为字典结构中的结尾符号,并通过在子对象后添加父对象对应的结尾字符,将子对象添加到父对象的数组。
[0175]
示例的,基于上述举例的数组对象$demoarray=['commitstepone'=》['cycle'=》3,'limit'=》1,],'commitsteptwo'=》['cycle'=》5,'limit'=》2,],];进行转换,可以得到模拟数组对象:arrayobj{'commitstepone':[arrayobj{'cycle':[3],'limit':
[1]}],'commitsteptwo':[arrayobj{'cycle':[5],'limit':[2]}]}。
[0176]
在一些实施例中,对于多维数组,当匹配到有新的数组起始关键词时,创建一个新的模拟数组对象的起始关键词arrayobj,继而开始基于图5中的步骤向内构建内层的模拟数组对象,直到最内层模拟数组对象构建完成后,将内层的模拟数组对象作为键值存入父级模拟数组对象,以此向上迭代,直到最外层模拟数组对象构建完成。
[0177]
在一些实施例中,区别于普通计算机编程语言(python)中的字典,模拟数组对象(arrayobj)是一个自定义的字典类,具有设置参数(set),获取参数(get),转成普通计算机编程语言中的字典(dict)等功能。
[0178]
在一些实施例中,针对构建完成的模拟数组对象,还可以使用参数输出函数(values)对模拟数组对象中的关键字对应的参数值(也即键值)进行内容调试输出。
[0179]
模拟数组对象中的定义与定义值,其中,定义对应于数组对象中的关键字,定义值对应于数组对象中的键值。模拟数组对象中的元素(定义值、定义值与定义组成的对)可以通过集合的形式进行存储。
[0180]
为便于理解,如果将代码看做一个集合,则集合中包含多个层级,集合中每个对象与其父对象之间存在对应关系。在代码中逻辑分支不同的情况下,若设置不同的键值或者覆盖原始键值,会在值集合中添加新的值。对于模拟数组对象对应的值集合,集合中每个定义值对与定义值对应的模拟数组对象之间存在对应关系,可以基于对应关系追溯定义值在实际的数组对象中的实际定义(实际定义可以为变量或者函数调用)。
[0181]
在一些实施例中,当模拟数组对象对应的实际的数组对象被二次赋值时,可以通过调用参数设置函数(set函数)同步地对模拟数组对象进行二次赋值。数组对象中的键值是携带指针的元素,也即,键值携带了键值对应的关键字、所在行信息(例如:行对应的地址。)。
[0182]
例如:对实际的数组对象$demoarray=['commitstepone'=》['cycle'=》3,'limit'=》1,],'commitsteptwo'=》['cycle'=》5,'limit'=》2,],]进行二次赋值的代码如下所示:$demoarray['commitstepone']['limit']=10,可知,新赋予的值为10,地址为对象'commitstepone'中的'limit'。对模拟数组对象进行二次赋值得到:arrayobj{'commitstepone':[arrayobj{'cycle':[3],'limit':[1,10]}],'commitsteptwo':[arrayobj{'cycle':[5],'limit':[2]}]}。
[0183]
示例的,在对模拟数组对象中某一地址对应的定义值进行二次赋值后,调用该地址获取到的定义值为新赋予的定义值。例如:数组对象为$a=['key1'=》'1','key2'=》'2'];对数组对象中的key2进行二次赋值$a['key2']='3';同步对模拟数组对象进行二次赋值,得到模拟数组对象为arrayobj{'key1':[1],'key2':[2,3]},此时从模拟数组对象中获取key2对应的值,得到的是3而不是原有的2。
[0184]
示例的,定义值都包含定义行对象指针(也即,当定义值被输出时,定义值包括定义值本身以及定义值对应的地址),调试函数的过程中可以不对定义值进行打印输出。
[0185]
在一些实施例中,基于构建完成的模拟数组对象,开发人员可以获取实际的数组对象中的子对象或者更底层的对象的关键字对应的键值。参考图6,图6是本技术实施例提供的代码的扫描方法的流程示意图,图6中的各步骤以服务器为执行主体。
[0186]
在步骤601a中,获取待检索对象,将待检索对象作为当前对象。
[0187]
示例的,待检索对象可以是开发人员上传的关键字的名称、数组对象的名称或者底层数组对象的名称。例如:待检索对象为$cycle,$cycle的对象值是未知的,假设为空值[]。步骤601a之后执行步骤602a。
[0188]
在步骤602a中,切割当前对象为对象名称及dict值。
[0189]
示例的,dict值也即对象值,基于对象$cycle为例进行说明,切割对象$cycle得到了对象名称$cycle以及空值[]。步骤602a后执行步骤603a。
[0190]
在步骤603a中,判断当前对象是否为变量或者常量,如果是,则执行步骤604a,如果不是则执行步骤607a。
[0191]
示例的,当前对象可以为变量、常量或者数组对象。常量是指在计算机程序运行时,不会被程序修改的量,反之,变量是在计算机程序运行时,会被程序修改的量。
[0192]
在步骤604a中,判断是否存在新的dict值,如果是,则执行步骤605a。如果否,则执行步骤606a。
[0193]
示例的,新的dict值是与已经获取到的dict值不同的dict值。例如:已经获取到的dict值为空值[]、['cycle'],分割得到了dict值为空值[],已经获取过空值[],则不存在新的dict值。
[0194]
在步骤605a中,将新dict值添加到当前dict值中。
[0195]
示例的,例如:获取到对象值[$key],对象值[$key]与之前获取的对象值(空值[]、['cycle'])不同,则将对象值进行组合得到当前对象值为['$key','cycle']。
[0196]
在步骤606a中,基于当前对象的对象名称在标识列表中进行查询,将查询到的对象作为当前对象。
[0197]
示例的,基于数组对象$demoarray=['commitstepone'=》['cycle'=》3,'limit'=》1,],'commitsteptwo'=》['cycle'=》5,'limit'=》2,],];$array=$demoarray[$key];$cycle=$array['cycle'],为例进行说明。其中,$array=$demoarray[$key];$cycle=$array['cycle']是应用表征变量声明。
[0198]
其中,数组对象$demoarray=['commitstepone'=》['cycle'=》3,'limit'=》1,],'commitsteptwo'=》['cycle'=》5,'limit'=》2,],]对应的模拟数组对象为:arrayobj{'commitstepone':[arrayobj{'cycle':[3],'limit':[1]}],'commitsteptwo':[arrayobj{'cycle':[5],'limit':[2]}]}。
[0199]
例如:基于$cycle分割得到了空值[],不存在新的dict值。$cycle是一个变量,则基于对象名称$cycle的字符串在标识序列中进行检索,获取到$cycle匹配的对象$array['cycle']。将对象$array['cycle']作为当前对象,分割当前对象$array['cycle']可以得到对象名称$array以及对象值['cycle']。对象值['cycle']与空值不同,执行步骤605a,得到当前的对象值为['cycle']。基于对象名称$array得到当前对象是变量,则基于对象名称$array的字符串在标识序列中再次进行检索,得到了对象$demoarray[$key]。切割对象$demoarray[$key]得到了对象名称$demoarray,以及对象值[$key],对象值[$key]与之前获取的对象值不同,则将对象值进行组合得到当前对象值为['$key','cycle']。基于对象名称$demoarray的字符串可以匹配到模拟数组对象arrayobj。
[0200]
在步骤607a中,判断当前对象是否为数组对象,如果是,则执行步骤608a。如果否,则执行步骤609a。
[0201]
在步骤609a中,将当前对象作为异常对象。
[0202]
示例的,假设当前对象也不是数组对象,则可以判断数组对象的子结构可能存在异常,将当前对象作为异常对象,也即不存在待检索对象对应的对象值,或者数组对象中没有该待检索对象。在这种情况下,可以通过服务器向终端设备发送相应的信息,以提示开发人员。
[0203]
在步骤608a中,获取数组对象中与当前dict值匹配的值,作为待检索对象对应的对象值。
[0204]
示例的,继续基于上述举例进行说明,对于模拟数组对象arrayobj,可以通过参数获取函数(get函数)从模拟数组对象中获取对象值。当前对象值为['$key','cycle'],基于['$key','cycle']在模拟数组对象arrayobj进行查找,得到了$cycle对应的对象值[3,5]。
[0205]
示例的,$key是变量,可以将$key使用通配符'.*'替代(对于使用通配符替代变量,例如:'p'.$i则替换为'^p.*','pre'.$key.'test'则替换成'^pre.*test$'并在arrayobj的get方法中使用正则匹配判断是否满足键值的匹配,正则匹配用于匹配字符串中字符组合)。
[0206]
在一些实施例中,在数组中被遍历元素的类型是已知的情况下,foreach迭代器可以实现迭代。在数组的大小是已知的,且数组是有序的情况下,for迭代器可以实现迭代。如果存在foreach迭代器的对象,则会返回模拟数组对象arrayobj中的全部的关键字以及对应的键值。
[0207]
本技术实施例解决了静态代码扫描中对数组子对象没有有效验证的弊端,并支持多维数组,通过get、set等函数来对数组对象的数据进行重构和获取。基于静态检索,无需执行代码,效率更高、安全性更强,避免了脏数据的产生。同时,当数组对象不为确定值(变量或者函数调用)时,也能正常地对模拟数组对象进行构建及做正则匹配。
[0208]
下面继续说明本技术实施例提供的代码的扫描装置455的实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器440的代码的扫描装置455中的软件模块可以包括:数据获取模块4551,用于获取源代码中每行代码分别对应的标识序列,其中,每个标识序列包括多个标识,每个标识序列对应于源代码中的一个数组对象;数据转换模块4552,用于对每个标识序列进行以下处理:确定标识序列中每个标识的标识类型,以及基于标识类型对应的字典结构转换规则,对每个标识进行字典结构转换;基于转换结果,确定与数组对象一一对应的模拟数组对象。
[0209]
在一些实施例中,数据转换模块4552还用于对标识序列中每个标识进行以下处理:对不同的所述标识类型对应的参考标识与所述标识序列中的标识进行匹配处理,得到所述参考标识中与所述标识序列中的标识匹配的目标标识;将与所述目标标识对应的标识类型,作为所述标识序列中的标识对应的标识类型。
[0210]
在一些实施例中,标识类型包括:起始标识、字符串文本、以及结尾标识;数据转换模块4552还用于对每个所述标识执行以下转换:
[0211]
当标识的标识类型为起始标识时,基于起始标识对应的字典结构转换规则,将标识转换为字典结构中的头部标识;当标识的标识类型为字符串文本时,基于字符串文本对应的字典结构转换规则,将标识转换为字典结构中的字符串文本;当标识的标识类型为结尾标识时,基于结尾标识对应的字典结构转换规则,将标识转换为字典结构中的结尾标识。
[0212]
在一些实施例中,字符串文本包括映射符号、分隔符号、关键字以及键值;数据转换模块4552还用于当字符串文本为映射符号时,将映射符号转换为字典结构中的定义符号,并将标识序列中与映射符号相邻的字符转换为字典结构;当字符串文本为分隔符号时,将标识序列中与分隔符号相邻的字符转换为字典结构。
[0213]
在一些实施例中,数据转换模块4552还用于当字符串文本为映射符号时,从标识序列中确定位于映射符号之前的字符以及位于映射符号之后的字符;将位于映射符号之前的字符转换为字典结构中的定义词,将映射符号转换为字典结构中的定义符号,将位于映射符号之后的标识转换为字典结构中与映射符号前的字符对应的定义值。
[0214]
在一些实施例中,数据转换模块4552还用于当字符串文本为分隔符号时,从标识序列中确定与分隔符号相邻的字符;当与分隔符号相邻的字符中的键值缺失对应的关键字时,对缺失对应的关键字的键值进行自增标识处理,得到键值对,将键值对转换为字典结构中的定义值对,其中,键值对包括键值与键值对应的自增关键字,定义值对包括定义词以及定义词对应的定义值;当位于分隔符号之后的字符不是关键字或键值时,跳过分隔符号,并基于分隔符号后的字符转入进行字典结构转换的处理;当位于分隔符号之后的字符是关键字或键值时,将分隔符号作为字典结构中的分隔符号。其中,每个标识进行字典结构转换得到的字符组成字典结构的模拟数组对象,将字典结构的模拟数组对象,以及不同的数组对象与模拟数组对象之间的对应关系作为转换结果。
[0215]
在一些实施例中,数据转换模块4552还用于当标识的标识类型为结尾标识且结尾标识之前存在起始标识时,将结尾标识转换为字典结构中的结尾标识;当标识的标识类型为结尾标识且结尾标识之前不存在起始标识时,对结尾标识进行异常抛弃处理。
[0216]
在一些实施例中,数据转换模块4552还用于响应于针对数组对象的赋值操作,获取赋值操作对应的新键值以及新键值对应的键值地址;基于新键值以及键值地址调用参数设置函数,确定与数组对象一一对应的模拟数组对象中与键值地址匹配的目标地址,并基于目标地址将新键值存储到模拟数组对象中。
[0217]
在一些实施例中,转换结果包括:字典结构的模拟数组对象,以及不同的数组对象与模拟数组对象之间的对应关系;数据转换模块4552还用于响应于数据输入操作,获取数据输入操作对应的待检索的变量对象;基于变量对象的对象名称的字符串,在所有数组对象的标识序列中进行迭代地对象检索,确定与变量对象匹配的数组对象以及变量对象对应的变量值;基于不同的数组对象与模拟数组对象之间的关系,获取与匹配的数组对象一一对应的模拟数组对象;基于变量对象对应的变量值,从模拟数组对象中获取与变量对象对应的变量值匹配的目标值,将目标值作为变量对象的对象值。
[0218]
在一些实施例中,数据转换模块4552还用于将待检索的变量对象作为当前的待处理对象;按照当前的待处理对象中字符对应的标识类型,分割当前的待处理对象,得到当前的待处理对象的当前对象名称以及当前变量值,其中,当前对象名称是关键字或起始标识,当前变量值为键值;在当前变量值与已获取的当前变量值不同时,将当前变量值与已获取的当前变量值进行组合,得到目标变量值;基于当前对象名称对应的字符串在所有数组对象的标识序列中进行检索,得到与当前对象名称对应的字符串匹配的目标对象;当目标对象是数组对象时,将数组对象作为与变量对象匹配的数组对象,并将目标变量值作为变量对象对应的变量值;当目标对象不是数组对象时,将目标对象作为当前的待处理对象,执行
按照当前的待处理对象中字符对应的标识类型分割当前的待处理对象的步骤。
[0219]
在一些实施例中,数据转换模块4552还用于将变量对象对应的变量值作为索引,基于索引调用参数获取函数,以从模拟数组对象中获取与索引匹配的目标值。
[0220]
本技术实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本技术实施例上述的代码的扫描方法。
[0221]
本技术实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本技术实施例提供的代码的扫描方法,例如,如图3a示出的代码的扫描方法。
[0222]
在一些实施例中,计算机可读存储介质可以是fram、rom、prom、eprom、eeprom、闪存、磁表面存储器、光盘、或cd-rom等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
[0223]
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
[0224]
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标识语言(html,hyper text markup language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
[0225]
作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
[0226]
综上所述,通过本技术实施例获取源代码中每行代码分别对应的标识序列,其中,每个标识序列包括多个标识,每个标识序列对应于源代码中的一个数组对象;对每个标识序列进行以下处理:确定标识序列中每个标识的标识类型,以及基于标识类型对应的字典结构转换规则,对每个标识进行字典结构转换;基于转换结果,确定与数组对象一一对应的模拟数组对象。能够安全和准确地生成与源代码中数组对象对应的模拟数组对象,有利于基于模拟数组对象更准确地获取数组对象中的值,从而提升开发者查验源代码的效率。
[0227]
以上所述,仅为本技术的实施例而已,并非用于限定本技术的保护范围。凡在本技术的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本技术的保护范围之内。
技术特征:
1.一种代码的扫描方法,其特征在于,所述方法包括:获取源代码中每行代码分别对应的标识序列,其中,每个所述标识序列包括多个标识,每个所述标识序列对应于所述源代码中的一个数组对象;对每个所述标识序列进行以下处理:确定所述标识序列中每个所述标识的标识类型,以及基于所述标识类型对应的字典结构转换规则,对每个所述标识进行字典结构转换;基于转换结果,确定与所述数组对象一一对应的模拟数组对象。2.如权利要求1所述的方法,其特征在于,所述确定所述标识序列中每个所述标识的标识类型,包括:对所述标识序列中每个所述标识进行以下处理:对不同的所述标识类型对应的参考标识与所述标识序列中的标识进行匹配处理,得到所述参考标识中与所述标识序列中的标识匹配的目标标识;将与所述目标标识对应的标识类型,作为所述标识序列中的标识对应的标识类型。3.如权利要求1所述的方法,其特征在于,所述标识类型包括:起始标识、字符串文本以及结尾标识;所述基于所述标识类型对应的字典结构转换规则,对每个所述标识进行字典结构转换,包括:对每个所述标识执行以下转换:当所述标识的标识类型为起始标识时,基于所述起始标识对应的字典结构转换规则,将所述标识转换为字典结构中的头部标识;当所述标识的标识类型为字符串文本时,基于所述字符串文本对应的字典结构转换规则,将所述标识转换为字典结构中的字符串文本;当所述标识的标识类型为结尾标识时,基于所述结尾标识对应的字典结构转换规则,将所述标识转换为字典结构中的结尾标识;其中,每个所述标识进行字典结构转换得到的字符组成字典结构的所述模拟数组对象,将字典结构的所述模拟数组对象,以及不同的所述数组对象与所述模拟数组对象之间的对应关系作为转换结果。4.如权利要求3所述的方法,其特征在于,所述字符串文本包括映射符号、分隔符号、关键字以及键值;当所述标识的标识类型为字符串文本时,基于所述字符串文本对应的字典结构转换规则,将所述标识转换为字典结构中的字符串文本,包括:当所述字符串文本为映射符号时,将所述映射符号转换为所述字典结构中的定义符号,并将所述标识序列中与所述映射符号相邻的字符转换为字典结构;当所述字符串文本为分隔符号时,将所述标识序列中与所述分隔符号相邻的字符转换为字典结构。5.如权利要求4所述的方法,其特征在于,当所述字符串文本为映射符号时,将所述映射符号转换为所述字典结构中的定义符号,并将所述标识序列中与所述映射符号相邻的字符转换为字典结构,包括:当所述字符串文本为映射符号时,从所述标识序列中确定位于所述映射符号之前的字
符以及位于所述映射符号之后的字符;将位于所述映射符号之前的字符转换为字典结构中的定义词,将所述映射符号转换为所述字典结构中的定义符号,将位于所述映射符号之后的字符转换为所述字典结构中与位于所述映射符号之前的字符对应的定义值。6.如权利要求4所述的方法,其特征在于,当所述字符串文本为分隔符号时,将所述标识序列中与所述分隔符号相邻的字符转换为字典结构,包括:当所述字符串文本为分隔符号时,从所述标识序列中确定与所述分隔符号相邻的字符;当与所述分隔符号相邻的字符中的键值缺失对应的关键字时,对缺失对应的关键字的键值进行自增标识处理,得到键值对,将所述键值对转换为字典结构中的定义值对,其中,所述键值对包括键值与所述键值对应的自增关键字,所述定义值对包括定义词以及所述定义词对应的定义值;当位于所述分隔符号之后的字符不是关键字或键值时,跳过所述分隔符号,并基于所述分隔符号后的字符转入进行字典结构转换的处理;当位于所述分隔符号之后的字符是关键字或键值时,将所述分隔符号作为所述字典结构中的分隔符号。7.如权利要求3所述的方法,其特征在于,当所述标识的标识类型为结尾标识时,基于所述结尾标识对应的字典结构转换规则,将所述标识转换为字典结构中的结尾标识,包括:当所述标识的标识类型为结尾标识且所述结尾标识之前存在起始标识时,将所述结尾标识转换为所述字典结构中的结尾标识;当所述标识的标识类型为结尾标识且所述结尾标识之前不存在起始标识时,对所述结尾标识进行异常抛弃处理。8.如权利要求1所述的方法,其特征在于,所述基于转换结果,确定与所述数组对象一一对应的模拟数组对象之后,所述方法还包括:响应于针对所述数组对象的赋值操作,获取所述赋值操作对应的新键值以及所述新键值对应的键值地址;基于所述新键值以及所述键值地址调用参数设置函数,确定与所述数组对象一一对应的所述模拟数组对象中与所述键值地址匹配的目标地址,并基于所述目标地址将所述新键值存储到所述模拟数组对象中。9.如权利要求1所述的方法,其特征在于,所述转换结果包括:字典结构的模拟数组对象,以及不同的所述数组对象与所述模拟数组对象之间的对应关系;所述基于转换结果,确定与所述数组对象一一对应的模拟数组对象之后,所述方法还包括:响应于数据输入操作,获取所述数据输入操作对应的待检索的变量对象;基于所述变量对象的对象名称的字符串,在所有数组对象的标识序列中进行迭代地对象检索,确定与所述变量对象匹配的数组对象以及变量对象对应的变量值;基于不同的所述数组对象与所述模拟数组对象之间的对应关系,获取与所述匹配的数组对象一一对应的模拟数组对象;
基于所述变量对象对应的变量值,从所述模拟数组对象中获取与所述变量对象对应的变量值匹配的目标值,将所述目标值作为所述变量对象的对象值。10.如权利要求9所述的方法,其特征在于,所述基于所述变量对象的对象名称的字符串,在所有数组对象的标识序列中进行迭代地对象检索,包括:将所述待检索的变量对象作为当前的待处理对象;按照所述当前的待处理对象中字符对应的标识类型,分割所述当前的待处理对象,得到所述当前的待处理对象的当前对象名称以及当前变量值,其中,所述当前对象名称是关键字或起始标识,所述当前变量值为键值;当所述当前变量值与已获取的当前变量值不同时,将所述当前变量值与已获取的当前变量值进行组合,得到目标变量值;基于所述当前对象名称对应的字符串在所有数组对象的标识序列中进行检索,得到与所述当前对象名称对应的字符串匹配的目标对象;当所述目标对象是数组对象时,将所述数组对象作为与所述变量对象匹配的数组对象,并将所述目标变量值作为所述变量对象对应的变量值;当所述目标对象不是数组对象时,将所述目标对象作为当前的待处理对象,执行所述按照所述当前的待处理对象中字符对应的标识类型分割所述当前的待处理对象的步骤。11.如权利要求9所述的方法,其特征在于,所述基于所述变量对象对应的变量值,从所述模拟数组对象中获取与所述变量对象对应的变量值匹配的目标值,包括:将所述变量对象对应的变量值作为索引,基于所述索引调用参数获取函数,以从所述模拟数组对象中获取与所述索引匹配的目标值。12.一种代码的扫描装置,其特征在于,所述代码的扫描装置包括:数据采集模块,用于获取源代码中每行代码分别对应的标识序列,其中,每个所述标识序列包括多个标识,每个所述标识序列对应于所述源代码中的一个数组对象;数据转换模块,用于对每个所述标识序列进行以下处理:确定所述标识序列中每个所述标识的标识类型,以及基于所述标识类型对应的字典结构转换规则,对每个所述标识进行字典结构转换;基于转换结果,确定与所述数组对象一一对应的模拟数组对象。13.一种电子设备,其特征在于,所述电子设备包括:存储器,用于存储可执行指令;处理器,用于执行所述存储器中存储的可执行指令时,实现权利要求1至11任一项所述的代码的扫描方法。14.一种计算机可读存储介质,存储有可执行指令,其特征在于,所述可执行指令被处理器执行时实现权利要求1至11任一项所述的代码的扫描方法。15.一种计算机程序产品,包括计算机程序或指令,其特征在于,所述计算机程序或指令被处理器执行时实现权利要求1至11任一项所述的代码的扫描方法。
技术总结
本申请提供了一种代码的扫描方法、装置、设备及计算机可读存储介质;涉及计算机以及数据处理技术领域,方法包括:获取源代码中每行代码分别对应的标识序列,其中,每个标识序列包括多个标识,每个标识序列对应于源代码中的一个数组对象;对每个标识序列进行以下处理:确定标识序列中每个标识的标识类型,以及基于标识类型对应的字典结构转换规则,对每个标识进行字典结构转换;基于转换结果,确定与数组对象一一对应的模拟数组对象。通过本申请,能够安全和准确地生成与源代码中数组对象对应的模拟数组对象,从而提升开发者查验源代码的效率。效率。效率。
技术研发人员:葛雨辰 周超 邱旻峰
受保护的技术使用者:腾讯科技(深圳)有限公司
技术研发日:2022.02.09
技术公布日:2022/5/25
转载请注明原文地址:https://tc.8miu.com/read-16353.html