CN106469049B - 一种文件扫描的方法及装置 - Google Patents
一种文件扫描的方法及装置 Download PDFInfo
- Publication number
- CN106469049B CN106469049B CN201510511052.XA CN201510511052A CN106469049B CN 106469049 B CN106469049 B CN 106469049B CN 201510511052 A CN201510511052 A CN 201510511052A CN 106469049 B CN106469049 B CN 106469049B
- Authority
- CN
- China
- Prior art keywords
- file
- dependent
- symbol table
- main
- dependent file
- 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
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种文件扫描的方法,包括:符号化主文件,生成主文件符号表;根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表;扫描所述统一符号表,并输出扫描结果。本发明实施例提供的文件扫描的方法,通过文件依赖关系,扫描文件时可以扫描所有有依赖关系的文件的统一符号表,从而有效的避免了误报和漏报。
Description
技术领域
本发明涉及数据处理技术领域,具体涉及一种文件扫描的方法及装置。
背景技术
不基于编译的静态代码分析工具有着高效、不依赖编译环境、轻量化的优点。现有的不基于编译的静态分析工具(如cppcheck)的主要流程为:获取扫描路径配置,对每一个源文件进行预处理、对预处理后的字符串进行符号化处理、生成符号表、存储符号表、对生成的符号表进行检查。
在预处理、符号化、生成符号表时,机制为线性单文件处理。因此难以处理跨文件场景,导致较多的误报和漏报。
预处理不可控,因静态代码分析不依赖编译,无法获取编译器或环境变量里配置的include路径,因此需要用户手动配置依赖文件的目录。如果用户没有配置或配置不全,会使头文件未包含完整、宏定义找不到,导致宏无法正确展开或无法找到变量定义等一系列问题,从而引起较多的误报和漏报。
发明内容
本发明实施例提供一种文件扫描的方法,可以避免误报和漏报。本发明实施例还提供了相应的装置。
本发明第一方面提供一种文件扫描的方法,包括:
符号化主文件,生成主文件符号表;
根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;
为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表;
扫描所述统一符号表,并输出扫描结果。
本发明第二方面提供一种文件扫描的装置,包括:
第一处理单元,用于符号化主文件,生成主文件符号表;
第二处理单元,用于根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;
链接建立单元,用于为所述第一处理单元处理得到的所述主文件符号表和所述第二处理单元处理得到的所述依赖文件的符号表建立链接关系,得到统一符号表;
扫描单元,用于扫描所述链接建立单元建立的所述统一符号表;
输出单元,用于输出所述扫描单元扫描所述统一符号的扫描结果。
本发明实施例采用符号化主文件,生成主文件符号表;根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表;扫描所述统一符号表,并输出扫描结果。与现有技术中因跨文件场景的文件扫描时误报漏报较多相比,本发明实施例提供的文件扫描的方法,通过文件依赖关系,扫描文件时可以扫描所有有依赖关系的文件的统一符号表,从而有效的避免了误报和漏报。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例中文件扫描的方法的一实施例示意图;
图2是本发明实施例中一示例的一示意图;
图3是本发明实施例中一示例的另一示意图;
图4是本发明实施例中一示例的另一示意图;
图5是本发明实施例中一示例的另一示意图;
图6是本发明实施例中一示例的另一示意图;
图7是本发明实施例中一示例的另一示意图;
图8是本发明实施例中一示例的另一示意图;
图9是本发明实施例中文件扫描的方法的另一实施例示意图;
图10是本发明实施例中文件扫描的装置的一实施例示意图;
图11是本发明实施例中文件扫描的装置的另一实施例示意图;
图12是本发明实施例中文件扫描的装置的另一实施例示意图;
图13是本发明实施例中文件扫描的装置的另一实施例示意图;
图14是本发明实施例中文件扫描的装置的另一实施例示意图;
图15是本发明实施例中文件扫描的装置的另一实施例示意图。
具体实施方式
本发明实施例提供一种文件扫描的方法,可以避免误报和漏报。本发明实施例还提供了相应的装置。以下分别进行详细说明。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参阅图1,本发明实施例提供的文件扫描的方法的一实施例包括:
101、符号化主文件,生成主文件符号表。
本发明实施例中的文件指的源文件,而非其他类型文件
源文件就是用汇编语言或高级语言写出来的代码保存为文件后的结果。
本发明实施例中,符号化主文件是指对主文件进行符号化处理,生成主文件对应的符号表的过程,文件符号化的过程属于现有技术,本发明实施例中不做过多赘述。
主文件在本发明实施例中是相对于依赖文件而言的,如图2所示,文件file1可以理解为是主文件。file2、file3以及图2所示的其他文件都可以理解为是file1的依赖文件。
102、根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系。
本发明实施例中,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表参阅图2可以理解为是对file2、file3以及图2所示的其他文件进行符号化。
本发明实施例中不限定步骤101和步骤102的时序,任一在前执行都可以,也可以同时执行。
103、为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表。
主文件符号表和依赖文件的符号表通过链接关系联系到一起,这样扫描时就可以实现跨文件扫描,而不限于只扫描单独文件的符号表。
104、扫描所述统一符号表,并输出扫描结果。
如图3所示,A.cpp中调用了B.cpp的BFunc函数,将常量i值为5作为BFunc函数的参数。
BFunc函数实现用参数i访问数组a,数组大小为3,此时i超出了数组的上限,则会造成溢出。
如果cppcheck在单独扫描B.cpp时,因并不知道传入的参数i值为5,所以不会报错,从而产生漏报。而本发明实施例中,A.cpp和B.cpp之间建立了链接,会依次扫描A.cpp和B.cpp,则避免了漏报,输出i值为5存在错误的扫描结果。
本发明实施例采用符号化主文件,生成主文件符号表;根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表;扫描所述统一符号表,并输出扫描结果。与现有技术中因跨文件场景的文件扫描时误报漏报较多相比,本发明实施例提供的文件扫描的方法,通过文件依赖关系,扫描文件时可以扫描所有有依赖关系的文件的统一符号表,从而有效的避免了误报和漏报。
可选地,在上述图1对应的实施例的基础上,本发明实施例提供的文件扫描的方法的第一个可选实施例中,所述根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化之前,所述方法还可以包括:
遍历全局文件,分析所述全局文件的代码内容中标识依赖的语句,建立所述全局文件依赖关系,所述全局文件包括所述主文件和所述依赖文件。
本发明实施例中,文件间如果有依赖关系,例如:有引用关系,在会在代码内容中做出标识的,因此,可以通过标识依赖的语句,建立所述全局文件依赖关系,生成全局依赖表。
可选地,在上述图1对应的第一个可选实施例的基础上,本发明实施例提供的文件扫描的方法的第二个可选实施例中,所述遍历全局文件,分析所述全局文件的代码内容中标识依赖的语句,建立所述全局文件依赖关系,所述全局文件包括所述主文件和所述依赖文件,可以包括:
从所述主文件的头文件中获取所述主文件所依赖的依赖文件名;
根据所述依赖文件名,从已建立的文件名和文件信息的对应关系中查找所述依赖文件名对应的依赖文件信息;
当查找到所述依赖文件名对应的依赖文件信息,则将所述依赖文件名对应的依赖文件加入所述主文件的依赖关系,根据每个主文件的依赖关系,建立所述全局文件依赖关系。
本发明实施例中,广度遍历待扫描工程文件夹下的所有代码文件,如图4所示,遍历图4中的.h,.c,.cpp及其他源码文件。
将文件信息记录到文件基础数据结构中,每个节点就是一个文件或一个目录,节点间通过地址链接,形成如图2所示的树形结构,用以记录全局的文件目录结构。
同时保存一份映射map数据,key为文件唯一标识,value为文件信息数据,查找文件信息时可以通过唯一标识快速索引到文件信息。
建立依赖关系时,可以遍历文件树形结构中的每个主文件,打开主文件内容,读取其中的头信息(#include信息),提取出所述主文件所依赖的文件名。为最大程度还原编译过程,需严格按照#include的顺序获取文件名。
在map中查找该文件名对应的文件信息,因#include写法多样且依赖的文件不一定会在待扫描的工程目录下(如图5),故采取如下策略进行决策:
若通过文件名找到唯一的文件,则将依赖文件直接加入主文件的依赖关系列表DependenceFileList,结束;
若通过文件名同时找到多个文件,且#include带目录路径,则向上层匹配路径,若路径匹配到唯一的文件,则将依赖文件直接加入主文件DependenceFileList,结束;若路径匹配到多个文件或者通过文件名找到多个文件,而#include不带目录路径,则计算主文件在目录结构上与多个匹配文件的距离,若得到路径最小的文件,则将依赖文件直接加入主文件的依赖关系列表DependenceFileList,结束;若存在距离相同的多个文件,选取#include顺序靠前的文件,加入DependenceFileList,结束。
以上策略在理论上虽然存在找到错误文件依赖的风险,但通过很多个项目数据验证,用以上策略寻找文件依赖的准确率达到90%,再次证明了使用路径匹配和最短路径算法来查找依赖文件的可靠性。
可选地,在上述图1对应的实施例、第一个或第二个可选实施例的基础上,本发明实施例提供的文件扫描的方法的第三个可选实施例中,所述根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,可以包括:
根据全局文件依赖关系,确认所述主文件所依赖的依赖文件是否已经符号化;
当所述依赖文件未被符号化,则符号化所述依赖文件,生成所述依赖文件的符号表,并缓存所述依赖文件的符号表;
当所述依赖文件已被符号化,则从所述缓存中获取所述依赖文件的符号表。
本发明实施例中,因同一个文件可能会被其他多个文件所依赖,如按常规流程扫描这些文件的时候,会把相同依赖的文件重复符号化多次,造成不必要的性能和时间损耗。于是采取如下符号化缓存策略,提升效率。根据依赖关系表统计每个依赖文件被依赖次数,以依赖文件X为例,如图6所示:
112、当需要符号化依赖文件X时,检查依赖文件X的依赖计数器dCnt。
扫描开始,初始化所有依赖文件的依赖计数器,数值为-1。
113、dCnt==-1,表示还未符号化过,则进行符号化到内存。
114、修改X的依赖计数器数值为其被依赖的次数。
115、dCnt!=-1表示依赖文件X已被符号化过。
116、从缓存中获取依赖文件X的符号表。
在依赖文件X符号化后,还可以进一步的管理依赖文件X的符号表,可以参阅图7进行理解:
201、依赖X的主文件扫描完成。
202、X的依赖计数器次数减1,也就是dCnt-1。
203、检查此时X的依赖计数器数值dCnt。
204、dCnt==0,表示X不再会被使用,执行步骤205。
205、删除X的符号化缓存数据。
206、dCnt>0,表示X还可能会被使用,执行步骤207。
207、保留X的符号化数据到缓存。
本发明实施例所提供的方案可以而达到依赖调用的平衡、完备性和内存的有效利用。
本发明实施例提供的缓存策略,可以避免被重复包含的头文件被多次符号化,第一次符号化后进行缓存,后续再被使用时只需要从缓存中调用,避免了被重复符号化,提高了扫描效率。
可选地,在上述图1对应的实施例、第一个或第二个可选实施例的基础上,本发明实施例提供的文件扫描的方法的第四个可选实施例中,所述为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表,可以包括:
根据所述主文件符号表和所述依赖文件的符号表中的唯一变量标识,建立所述主文件符号表和所述依赖文件的符号表中特征参数的链接关系,得到统一符号表,所述唯一变量标识在所述主文件符号表和所述依赖文件的符号表中用于标识同一特征参数。
本发明实施例中,建立主文件符号表和所述依赖文件的符号表中特征参数的链接关系可以通过唯一变量标识来建立,如图8所示,通过唯一变量id建立依赖文件Player.h和主文件Player.cpp之间的依赖关系。
全局变量TSCDependency::varBase来记录变量id的起始位置,并随着变量的增加,varBase不断递增,从而保证每个变量的id都是唯一的。比如A.cpp中定义了变量a和b,B.cpp中定义了变量c和d,varbase为0,先符号化A,则a的id为1,b的id为2,varbase递增为2;接下来符号化B,则c的id为3,d的id为4,varbse递增为4,以此类推。
成员变量和全局变量链接,由于局部变量的声明和使用都在同一个文件中,是一起进行符号化的,无需在符号化后进行链接。而成员变量和全局变量的声明和使用可能存在于不同文件时,因此需要在符号化后,将主文件中的成员变量和全局变量跟依赖文件中对应的声明链接起来。符号化过程中需要额外记录每个文件中所声明的类及成员变量信息,这样在主文件A.cpp中检查到了成员m时,可以先从其依赖文件A.h的记录中查找是否存在对应的类和成员,如果能够匹配上,则可以将A.cpp中m的变量id置为A.h中声明m时的变量id。
可选地,在上述图1对应的实施例、第一个或第二个可选实施例的基础上,本发明实施例提供的文件扫描的方法的第五个可选实施例中,符号化所述主文件和所述依赖文件时,所述方法还可以包括:
将所述主文件和所述依赖文件中的函数声明都记录在同一函数声明列表中;
所述为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表,可以包括:
根据所述同一函数声明列表,建立所述主文件的函数与所述依赖文件的函数声明之间的映射关系,得到统一符号表。
本发明实施例中,函数链接的过程可以理解为:符号化过程中将主文件和所有依赖文件中的函数声明都记录在同一列表中。符号化后遍历主文件,当发现主文件中调用的函数fun(a)时,遍历该主文件对应的函数声明列表,通过参数匹配找到其对应的函数声明,建立函数调用与函数声明之间的映射关系。
参阅图9,本发明实施例提供的文件扫描的方法的另一实施例包括:
301、自动分析代码建立全局依赖关系。
预先遍历整个项目工程的代码,快速分析代码内容中标识依赖的语句,建立全局的依赖关系,生成全局依赖表。
302、遍历扫描每个主文件,对每个文件执行以下步骤;
303、根据全局依赖关系,对主文件依赖的文件遍历进行符号化,生成依赖文件独立的符号表,如该文件符号表已经被缓存,则直接从缓存中获取。
304、符号化主文件。
305、分析与依赖文件独立符号表之间的变量、宏等引用关系,建立符号链接,形成统一符号表。
306、缓存符号表。
根据缓存策略,缓存若干独立符号表,供之后的进程使用,同时释放掉不需要的符号表,降低内存占用;
307、对统一符号表执行扫描,检查缺陷。
308、输出扫描结果。
步骤301-308的具体过程可以参阅图1只图8中的相关描述进行理解,本处不做过多赘述。
参阅图10,本发明实施例提供的文件扫描的装置40的一实施例包括:
第一处理单元401,用于符号化主文件,生成主文件符号表;
第二处理单元402,用于根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;
链接建立单元403,用于为所述第一处理单元401处理得到的所述主文件符号表和所述第二处理单元402处理得到的所述依赖文件的符号表建立链接关系,得到统一符号表;
扫描单元404,用于扫描所述链接建立单元403建立的所述统一符号表;
输出单元405,用于输出所述扫描单元扫描所述统一符号的扫描结果。
本发明实施例中,第一处理单元401符号化主文件,生成主文件符号表;第二处理单元402根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;链接建立单元403为所述第一处理单元401处理得到的所述主文件符号表和所述第二处理单元402处理得到的所述依赖文件的符号表建立链接关系,得到统一符号表;扫描单元404扫描所述链接建立单元403建立的所述统一符号表;输出单元405输出所述扫描单元扫描所述统一符号的扫描结果。与现有技术中因跨文件场景的文件扫描时误报漏报较多相比,本发明实施例提供的文件扫描的装置,通过文件依赖关系,扫描文件时可以扫描所有有依赖关系的文件的统一符号表,从而有效的避免了误报和漏报。
可选地,在上述图10对应的实施例的基础上,参阅图11,本发明实施例提供的文件扫描的装置40的第一个可选实施例中,所述装置40还包括:
依赖关系建立单元406,用于在所述第二处理单元402符号化所述依赖文件之前,遍历全局文件,分析所述全局文件的代码内容中标识依赖的语句,建立所述全局文件依赖关系,所述全局文件包括所述主文件和所述依赖文件。
可选地,在上述图11对应的实施例的基础上,参阅图12,本发明实施例提供的文件扫描的装置40的第二个可选实施例中,所述依赖关系建立单元406包括:
获取子单元4061,用于从所述主文件的头文件中获取所述主文件所依赖的依赖文件名;
查找子单元4062,用于根据所述获取子单元4061获取的所述依赖文件名,从已建立的文件名和文件信息的对应关系中查找所述依赖文件名对应的依赖文件信息;
建立子单元4063,用于当所述查找子单元4062查找到所述依赖文件名对应的依赖文件信息,则将所述依赖文件名对应的依赖文件加入所述主文件的依赖关系,根据每个主文件的依赖关系,建立所述全局文件依赖关系。
可选地,在上述图10对应的实施例的基础上,参阅图13,本发明实施例提供的文件扫描的装置40的第三个可选实施例中,所述第二处理单元402包括:
确认子单元4021,用于根据全局文件依赖关系,确认所述主文件所依赖的依赖文件是否已经符号化;
生成子单元4022,用于当所述确认子单元4021确认到所述依赖文件未被符号化,则符号化所述依赖文件,生成所述依赖文件的符号表;
缓存子单元4023,用于缓存所述生成子单元4022生成的所述依赖文件的符号表;
获取子单元4024,用于当所述确认子单元4021确认到所述依赖文件已被符号化,则从所述缓存中获取所述依赖文件的符号表。
可选地,在上述图10对应的实施例、第一个或第二个可选实施例的基础上,本发明实施例提供的文件扫描的装置40的第四个可选实施例中,
所述链接建立单元403,用于根据所述主文件符号表和所述依赖文件的符号表中的唯一变量标识,建立所述主文件符号表和所述依赖文件的符号表中特征参数的链接关系,得到统一符号表,所述唯一变量标识在所述主文件符号表和所述依赖文件的符号表中用于标识同一特征参数。
可选地,在上述图10对应的实施例、第一个或第二个可选实施例的基础上,参阅图14,本发明实施例提供的文件扫描的装置40的第五个可选实施例中,所述装置还包括:记录单元407,
所述记录单元407,用于将所述主文件和所述依赖文件中的函数声明都记录在同一函数声明列表中;
所述链接建立单元403,用于根据所述记录单元407记录的所述同一函数声明列表,建立所述主文件的函数与所述依赖文件的函数声明之间的映射关系,得到统一符号表。
本发明图10只图14实施例所提供的文件扫描的装置40可以参阅图1至图9中的相关描述进行理解,本处不做过多赘述。
图15是本发明实施例中文件扫描的装置40的结构示意图。文件扫描的装置40可包括输入设备410、输出设备440、处理器430和存储器440。
存储器440可以包括只读存储器和随机存取存储器,并向处理器430提供指令和数据。存储器440的一部分还可以包括非易失性随机存取存储器(NVRAM)。
存储器440存储了如下的元素,可执行模块或者数据结构,或者它们的子集,或者它们的扩展集:
操作指令:包括各种操作指令,用于实现各种操作。
操作***:包括各种***程序,用于实现各种基础业务以及处理基于硬件的任务。
在本发明实施例中,处理器430通过调用存储器440存储的操作指令(该操作指令可存储在操作***中),执行如下操作:
符号化主文件,生成主文件符号表;
根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;
为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表;
扫描所述统一符号表,并通过输出设备420输出扫描结果。
与现有技术中因跨文件场景的文件扫描时误报漏报较多相比,本发明实施例提供的文件扫描的装置,通过文件依赖关系,扫描文件时可以扫描所有有依赖关系的文件的统一符号表,从而有效的避免了误报和漏报。
处理器430控制为文件扫描的装置40的操作,处理器430还可以称为CPU(CentralProcessing Unit,中央处理单元)。存储器440可以包括只读存储器和随机存取存储器,并向处理器430提供指令和数据。存储器440的一部分还可以包括非易失性随机存取存储器(NVRAM)。具体的应用中,为文件扫描的装置40的各个组件通过总线***450耦合在一起,其中总线***450除包括数据总线之外,还可以包括电源总线、控制总线和状态信号总线等。但是为了清楚说明起见,在图中将各种总线都标为总线***450。
上述本发明实施例揭示的方法可以应用于处理器430中,或者由处理器430实现。处理器430可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器430中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器430可以是通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器440,处理器430读取存储器440中的信息,结合其硬件完成上述方法的步骤。
可选地,所述处理器430用于遍历全局文件,分析所述全局文件的代码内容中标识依赖的语句,建立所述全局文件依赖关系,所述全局文件包括所述主文件和所述依赖文件。
可选地,所述处理器430用于:
从所述主文件的头文件中获取所述主文件所依赖的依赖文件名;
根据所述依赖文件名,从已建立的文件名和文件信息的对应关系中查找所述依赖文件名对应的依赖文件信息;
当查找到所述依赖文件名对应的依赖文件信息,则将所述依赖文件名对应的依赖文件加入所述主文件的依赖关系,根据每个主文件的依赖关系,建立所述全局文件依赖关系。
可选地,所述处理器430用于:
根据全局文件依赖关系,确认所述主文件所依赖的依赖文件是否已经符号化;
当所述依赖文件未被符号化,则符号化所述依赖文件,生成所述依赖文件的符号表,并缓存所述依赖文件的符号表;
当所述依赖文件已被符号化,则从所述缓存中获取所述依赖文件的符号表。
可选地,所述处理器430用于根据所述主文件符号表和所述依赖文件的符号表中的唯一变量标识,建立所述主文件符号表和所述依赖文件的符号表中特征参数的链接关系,得到统一符号表,所述唯一变量标识在所述主文件符号表和所述依赖文件的符号表中用于标识同一特征参数。
可选地,所述处理器430用于将所述主文件和所述依赖文件中的函数声明都记录在同一函数声明列表中;根据所述同一函数声明列表,建立所述主文件的函数与所述依赖文件的函数声明之间的映射关系,得到统一符号表。
本发明实施例所提供的文件扫描的装置40可以参阅图1至图9中的相关描述进行理解,本处不做过多赘述。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:ROM、RAM、磁盘或光盘等。
以上对本发明实施例所提供的文件扫描的方法以及装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (12)
1.一种文件扫描的方法,其特征在于,包括:
符号化主文件,生成主文件符号表;
从所述主文件的头文件中获取所述主文件所依赖的依赖文件名;
根据所述依赖文件名,从已建立的文件名和文件信息的对应关系中查找所述依赖文件名对应的依赖文件信息;
当查找到所述依赖文件名对应的多个匹配文件,且所述头文件中未包含所述依赖文件名对应的目录路径时,计算所述主文件在目录结构上与所述多个匹配文件的路径距离,并将路径距离最短的匹配文件作为所述依赖文件名对应的依赖文件;
将所述依赖文件名对应的依赖文件加入所述主文件的依赖关系,根据每个主文件的依赖关系,建立全局文件依赖关系;
根据所述全局文件依赖关系,统计每个依赖文件被依赖的次数,其中包括目标依赖文件被依赖的次数,所述目标依赖文件为所述全局文件依赖关系中包含的任一依赖文件;
根据所述全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,并缓存所述依赖文件的符号表;所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;
为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表;
扫描所述统一符号表,并输出扫描结果;
在依赖所述目标依赖文件的主文件扫描完成后,将所述目标依赖文件被依赖的次数减1,并在所述目标依赖文件被依赖的次数为零时,删除所述目标依赖文件的符号化缓存数据。
2.根据权利要求1所述的方法,其特征在于,在所述根据所述依赖文件名,从已建立的文件名和文件信息的对应关系中查找所述依赖文件名对应的依赖文件信息之后,所述方法还包括:
当查找到所述依赖文件名对应的唯一的匹配文件时,将所述唯一的匹配文件作为所述依赖文件名对应的依赖文件;
当查找到所述依赖文件名对应的多个匹配文件,且所述头文件中包含所述依赖文件名对应的目录路径时,向上层匹配路径,若路径匹配到唯一的文件,则将所述目录路径对应的匹配文件作为所述依赖文件名对应的依赖文件。
3.根据权利要求1-2任一所述的方法,其特征在于,所述根据所述全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,包括:
根据全局文件依赖关系,确认所述主文件所依赖的依赖文件是否已经符号化;
当所述依赖文件未被符号化,则符号化所述依赖文件,生成所述依赖文件的符号表,并缓存所述依赖文件的符号表;
当所述依赖文件已被符号化,则从所述缓存中获取所述依赖文件的符号表。
4.根据权利要求1-2任一所述的方法,其特征在于,所述为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表,包括:
根据所述主文件符号表和所述依赖文件的符号表中的唯一变量标识,建立所述主文件符号表和所述依赖文件的符号表中特征参数的链接关系,得到统一符号表,所述唯一变量标识在所述主文件符号表和所述依赖文件的符号表中用于标识同一特征参数。
5.根据权利要求1-2任一所述的方法,其特征在于,符号化所述主文件和所述依赖文件时,所述方法还包括:
将所述主文件和所述依赖文件中的函数声明都记录在同一函数声明列表中;
所述为所述主文件符号表和所述依赖文件的符号表建立链接关系,得到统一符号表,包括:
根据所述同一函数声明列表,建立所述主文件的函数与所述依赖文件的函数声明之间的映射关系,得到统一符号表。
6.一种文件扫描的装置,其特征在于,包括:
第一处理单元,用于符号化主文件,生成主文件符号表;
第二处理单元,用于根据全局文件依赖关系,对所述主文件所依赖的依赖文件进行符号化,生成所述依赖文件的符号表,并缓存所述依赖文件的符号表;所述全局文件依赖关系为根据所述主文件与所述依赖文件间的依赖语句建立的关系;
所述装置还用于,根据所述全局文件依赖关系,统计每个依赖文件被依赖的次数,其中包括目标依赖文件被依赖的次数,所述目标依赖文件为所述全局文件依赖关系中包含的任一依赖文件;
链接建立单元,用于为所述第一处理单元处理得到的所述主文件符号表和所述第二处理单元处理得到的所述依赖文件的符号表建立链接关系,得到统一符号表;
扫描单元,用于扫描所述链接建立单元建立的所述统一符号表;
输出单元,用于输出所述扫描单元扫描所述统一符号的扫描结果;
所述装置还用于,在依赖所述目标依赖文件的主文件扫描完成后,将所述目标依赖文件被依赖的次数减1,并在所述目标依赖文件被依赖的次数为零时,删除所述目标依赖文件的符号化缓存数据;
依赖关系建立单元,用于在所述第二处理单元符号化所述依赖文件之前,遍历全局文件,分析所述全局文件的代码内容中标识依赖的语句,建立所述全局文件依赖关系,所述全局文件包括所述主文件和所述依赖文件;
所述依赖关系建立单元包括:
获取子单元,用于从所述主文件的头文件中获取所述主文件所依赖的依赖文件名;
查找子单元,用于根据所述获取子单元获取的所述依赖文件名,从已建立的文件名和文件信息的对应关系中查找所述依赖文件名对应的依赖文件信息;
建立子单元,用于当查找到所述依赖文件名对应的多个匹配文件,且所述头文件中未包含所述依赖文件名对应的目录路径时,计算所述主文件在目录结构上与所述多个匹配文件的路径距离,并将路径距离最短的匹配文件作为所述依赖文件名对应的依赖文件,将所述依赖文件名对应的依赖文件加入所述主文件的依赖关系,根据每个主文件的依赖关系,建立所述全局文件依赖关系。
7.根据权利要求6所述的装置,其特征在于,所述建立子单元,还用于:
当查找到所述依赖文件名对应的唯一的匹配文件时,将所述唯一的匹配文件作为所述依赖文件名对应的依赖文件;
当查找到所述依赖文件名对应的多个匹配文件,且所述头文件中包含所述依赖文件名对应的目录路径时,向上层匹配路径,若路径匹配到唯一的文件,则将所述目录路径对应的匹配文件作为所述依赖文件名对应的依赖文件。
8.根据权利要求6-7任一所述的装置,其特征在于,所述第二处理单元包括:
确认子单元,用于根据全局文件依赖关系,确认所述主文件所依赖的依赖文件是否已经符号化;
生成子单元,用于当所述确认子单元确认到所述依赖文件未被符号化,则符号化所述依赖文件,生成所述依赖文件的符号表;
缓存子单元,用于缓存所述生成子单元生成的所述依赖文件的符号表;
获取子单元,用于当所述确认子单元确认到所述依赖文件已被符号化,则从所述缓存中获取所述依赖文件的符号表。
9.根据权利要求6-7任一所述的装置,其特征在于,
所述链接建立单元,用于根据所述主文件符号表和所述依赖文件的符号表中的唯一变量标识,建立所述主文件符号表和所述依赖文件的符号表中特征参数的链接关系,得到统一符号表,所述唯一变量标识在所述主文件符号表和所述依赖文件的符号表中用于标识同一特征参数。
10.根据权利要求6-7任一所述的装置,其特征在于,所述装置还包括:记录单元,
所述记录单元,用于将所述主文件和所述依赖文件中的函数声明都记录在同一函数声明列表中;
所述链接建立单元,用于根据所述记录单元记录的所述同一函数声明列表,建立所述主文件的函数与所述依赖文件的函数声明之间的映射关系,得到统一符号表。
11.一种文件扫描的装置,其特征在于,包括处理器与存储器;
其中,所述存储器用于存储操作指令;
所述处理器用于调用所述存储器存储的操作指令,以执行如权利要求1-5任一项所述的文件扫描的方法。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有程序,所述程序被执行时实现如权利要求1-5任一项所述的文件扫描的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510511052.XA CN106469049B (zh) | 2015-08-19 | 2015-08-19 | 一种文件扫描的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510511052.XA CN106469049B (zh) | 2015-08-19 | 2015-08-19 | 一种文件扫描的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106469049A CN106469049A (zh) | 2017-03-01 |
CN106469049B true CN106469049B (zh) | 2020-09-29 |
Family
ID=58214551
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510511052.XA Active CN106469049B (zh) | 2015-08-19 | 2015-08-19 | 一种文件扫描的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106469049B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110795069A (zh) * | 2018-08-02 | 2020-02-14 | Tcl集团股份有限公司 | 代码分析方法、智能终端及计算机可读存储介质 |
CN109189729A (zh) * | 2018-09-03 | 2019-01-11 | 五八有限公司 | 各组件间依赖关系的查找方法、装置、设备及存储介质 |
CN110286934B (zh) * | 2019-06-30 | 2023-04-18 | 潍柴动力股份有限公司 | 一种静态代码的检查方法及装置 |
CN110262803B (zh) * | 2019-06-30 | 2023-04-18 | 潍柴动力股份有限公司 | 一种依赖关系的生成方法及装置 |
CN111158663B (zh) * | 2019-12-26 | 2021-07-02 | 深圳逻辑汇科技有限公司 | 用于处理程序代码中的变量的引用的方法和*** |
CN113296777B (zh) * | 2020-04-10 | 2022-05-27 | 阿里巴巴集团控股有限公司 | 依赖分析和程序编译方法、设备及存储介质 |
CN112230979A (zh) * | 2020-09-28 | 2021-01-15 | 北京五八信息技术有限公司 | 一种依赖关系检测方法、装置、电子设备及存储介质 |
CN112230980A (zh) * | 2020-09-28 | 2021-01-15 | 北京五八信息技术有限公司 | 一种依赖关系检测方法、装置、电子设备及存储介质 |
CN113448553B (zh) * | 2021-06-23 | 2023-11-03 | 南京大学 | 一种c语言项目依赖信息管理和可视化的方法及*** |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101739339A (zh) * | 2009-12-29 | 2010-06-16 | 北京航空航天大学 | 一种基于程序动态依赖关系的软件故障定位方法 |
US20140059525A1 (en) * | 2012-08-24 | 2014-02-27 | Vmware, Inc. | Method and system for facilitating replacement of system calls |
CN104182519A (zh) * | 2014-08-25 | 2014-12-03 | 百度在线网络技术(北京)有限公司 | 一种文件扫描方法及装置 |
-
2015
- 2015-08-19 CN CN201510511052.XA patent/CN106469049B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101739339A (zh) * | 2009-12-29 | 2010-06-16 | 北京航空航天大学 | 一种基于程序动态依赖关系的软件故障定位方法 |
US20140059525A1 (en) * | 2012-08-24 | 2014-02-27 | Vmware, Inc. | Method and system for facilitating replacement of system calls |
CN104182519A (zh) * | 2014-08-25 | 2014-12-03 | 百度在线网络技术(北京)有限公司 | 一种文件扫描方法及装置 |
Non-Patent Citations (1)
Title |
---|
刘春燕.基于规则的C/C++代码静态检测方法研究.《中国优秀硕士学位论文全文数据库 信息科技辑》.2011,(第05期),正文第8,14-15,24-27,34-35,41-42页. * |
Also Published As
Publication number | Publication date |
---|---|
CN106469049A (zh) | 2017-03-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106469049B (zh) | 一种文件扫描的方法及装置 | |
US10394694B2 (en) | Unexplored branch search in hybrid fuzz testing of software binaries | |
US9122540B2 (en) | Transformation of computer programs and eliminating errors | |
CN111104335B (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
CN106295346B (zh) | 一种应用漏洞检测方法、装置及计算设备 | |
US11262988B2 (en) | Method and system for using subroutine graphs for formal language processing | |
CN104320312A (zh) | 网络应用安全测试工具及模糊测试用例生成方法和*** | |
CN111124480A (zh) | 应用程序包的生成方法、装置、电子设备及存储介质 | |
CN111427578B (zh) | 一种数据转换方法、装置及设备 | |
CN111240772B (zh) | 一种基于区块链的数据处理方法、装置及存储介质 | |
CN106776266B (zh) | 测试工具的配置方法及终端设备 | |
CN115658128A (zh) | 一种生成软件物料清单的方法、装置及存储介质 | |
CN111580821B (zh) | 脚本绑定方法、装置、电子设备及计算机可读存储介质 | |
CN113568604B (zh) | 风控策略的更新方法、装置及计算机可读存储介质 | |
CN108897678B (zh) | 静态代码检测方法和静态代码检测***、存储设备 | |
CN111240987B (zh) | 移植程序检测方法、装置、电子设备及计算机可读存储介质 | |
US20040010780A1 (en) | Method and apparatus for approximate generation of source code cross-reference information | |
US9396239B2 (en) | Compiling method, storage medium and compiling apparatus | |
CN111309301A (zh) | 程序语言转换方法、装置和转换设备 | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
CN114153447B (zh) | 一种自动化生成ai训练代码的方法 | |
CN113190235B (zh) | 一种代码的分析方法、装置、电子终端及存储介质 | |
CN112799673B (zh) | 一种网络协议数据的校核方法及装置 | |
Kumar et al. | Code clone detection and analysis using software metrics and neural network-a literature review | |
Newman et al. | srcType: A tool for efficient static type resolution |
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 |