CN110286934B - 一种静态代码的检查方法及装置 - Google Patents

一种静态代码的检查方法及装置 Download PDF

Info

Publication number
CN110286934B
CN110286934B CN201910581836.8A CN201910581836A CN110286934B CN 110286934 B CN110286934 B CN 110286934B CN 201910581836 A CN201910581836 A CN 201910581836A CN 110286934 B CN110286934 B CN 110286934B
Authority
CN
China
Prior art keywords
source file
file
function
variable
custom
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
Application number
CN201910581836.8A
Other languages
English (en)
Other versions
CN110286934A (zh
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.)
Weichai Power Co Ltd
Original Assignee
Weichai Power 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
Application filed by Weichai Power Co Ltd filed Critical Weichai Power Co Ltd
Priority to CN201910581836.8A priority Critical patent/CN110286934B/zh
Publication of CN110286934A publication Critical patent/CN110286934A/zh
Application granted granted Critical
Publication of CN110286934B publication Critical patent/CN110286934B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

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/60Software deployment
    • G06F8/65Updates

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请提供一种静态代码的检查方法及装置,该方法从更新源文件中获取到自定义函数以及自定义变量,并从区别于更新源文件的其他源文件中获取到引用函数以及引用变量,并基于获取到的自定义函数、引用函数以及自定义变量、引用变量,确定与更新源文件存在依赖关系的源文件,然后对更新源文件以及与更新源文件存在依赖关系的源文件,进行静态代码检查。由于不需要对环境中的全部源文件整体进行检查,因此节省了检查所需时间,提高了检查效率。同时,由于不仅对更新源文件进行检查而且对与更新源文件存在依赖关系的源文件也进行检查,从而避免了漏检导致检查准确性低的问题发生。

Description

一种静态代码的检查方法及装置
技术领域
本申请属于数据处理技术领域,尤其涉及一种静态代码的检查方法及装置。
背景技术
对静态代码更新后,需要对静态代码进行检查以确定静态代码中存在的缺陷、避免由于代码缺陷导致对***的正常运行产生影响。
现有技术中静态代码的检查方法为对环境中的全部源文件进行整体检查,耗时较长。
发明内容
有鉴于此,本申请的目的在于提供一种静态代码的检查方法及装置,用于解决现有技术中对全部源文件进行整体检查导致耗时较长导致检查效率低的问题。
技术方案如下:
本申请提供一种静态代码的检查方法,包括:
确定更新源文件,并获取更新源文件中的自定义函数以及自定义变量;
分别获取所述更新源文件所在环境中的区别于所述更新源文件的其他各个源文件的引用函数以及引用变量;
基于获取到的自定义函数、自定义变量、引用函数以及引用变量,确定与所述更新源文件存在依赖关系的源文件;
对所述更新源文件以及与所述更新源文件存在依赖关系的源文件,进行静态代码检查。
优选地,所述获取更新源文件中的自定义函数以及自定义变量包括:
对所述更新源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该更新文件的自定义变量、自定义函数;
从所述符号表中分别获取该更新源文件的自定义变量、自定义函数。
优选地,所述分别获取所述更新源文件所在环境中的区别于所述更新源文件的其他各个源文件的引用函数以及引用变量包括:
对区别于所述更新源文件的其他各个源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该源文件的引用变量、引用函数;
从所述符号表中分别获取该源文件的引用变量、引用函数。
优选地,其特征在于,所述基于获取到的自定义函数、自定义变量、引用函数以及引用变量,确定与所述更新源文件存在依赖关系的源文件包括:
基于获取到的自定义变量以及引用变量,确定与每个自定义变量匹配的引用变量所在的源文件为与更新源文件之间存在变量依赖关系的源文件;
基于获取到的自定义函数以及引用函数,确定与每个自定义函数匹配的引用函数所在的源文件为与更新源文件之间存在函数依赖关系的源文件。
优选地,所述确定与每个自定义函数匹配的引用函数所在的源文件为与更新源文件之间存在函数依赖关系的源文件之后,还包括:
获取所述更新源文件中的头文件信息;
分别对所述更新源文件所在环境中的各个源文件重新编译生成depend文件;所述depend文件中包括该源文件引用的头文件信息;
获取所述depend文件中的头文件信息,并依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配;
根据匹配结果,确定与所述更新源文件存在头文件依赖关系的源文件。
优选地,所述依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配包括:
基于正则匹配算法,依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配。
本申请还提供了一种静态代码的检查装置,包括:
第一获取单元,用于确定更新源文件,并获取更新源文件中的自定义函数以及自定义变量;
第二获取单元,用于分别获取所述更新源文件所在环境中的区别于所述更新源文件的其他各个源文件的引用函数以及引用变量;
第一确定单元,用于基于获取到的自定义函数、自定义变量、引用函数以及引用变量,确定与所述更新源文件存在依赖关系的源文件;
检查单元,用于对所述更新源文件以及与所述更新源文件存在依赖关系的源文件,进行静态代码检查。
优选地,所述第一获取单元包括:
生成子单元,用于对所述更新源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该更新文件的自定义变量、自定义函数;
获取子单元,用于从所述符号表中分别获取该更新源文件的自定义变量、自定义函数。
优选地,所述第一确定单元包括:
第一确定子单元,用于基于获取到的自定义变量以及引用变量,确定与每个自定义变量匹配的引用变量所在的源文件为与更新源文件之间存在变量依赖关系的源文件;
第二确定子单元,用于基于获取到的自定义函数以及引用函数,确定与每个自定义函数匹配的引用函数所在的源文件为与更新源文件之间存在函数依赖关系的源文件。
优选地,还包括:
第三获取单元,用于获取所述更新源文件中的头文件信息;
重编译单元,用于分别对所述更新源文件所在环境中的各个源文件重新编译生成depend文件;所述depend文件中包括该源文件引用的头文件信息;
第四获取单元,用于获取所述depend文件中的头文件信息,并依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配;
第二确定单元,用于根据匹配结果确定与所述更新源文件存在头文件依赖关系的源文件。
与现有技术相比,本申请提供的上述技术方案具有如下优点:
从上述技术方案可知,本申请中从更新源文件中获取到自定义函数以及自定义变量,并从区别于更新源文件的其他源文件中获取到引用函数以及引用变量,并基于获取到的自定义函数、引用函数以及自定义变量、引用变量,确定与更新源文件存在依赖关系的源文件,然后对更新源文件以及与更新源文件存在依赖关系的源文件,进行静态代码检查。由于仅对更新源文件以及与更新源文件存在依赖关系的源文件进行静态代码检查,而不需要对环境中的全部源文件整体进行检查,因此节省了检查所需时间,提高了检查效率。同时,由于不仅对更新源文件进行检查而且对与更新源文件存在依赖关系的源文件也进行检查,从而避免了漏检导致检查准确性低的问题发生。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请公开的一种静态代码的检查方法的流程图;
图2是本申请公开的从源文件中获取自定义函数、自定义变量、引用函数或引用变量的方法的流程图;
图3是本申请公开的确定与更新源文件存在头文件依赖关系的源文件的方法的流程图;
图4是本申请公开的对一个源文件编译后生成的depend文件示意图;
图5是本申请公开的一种静态代码的检查装置的结构图;
图6是本申请公开的另一种静态代码的检查装置的结构图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请实施例提供了一种静态代码的检查方法,参见图1所示,该检查方法可以包括以下步骤:
S101、确定更新源文件,并获取更新源文件中的自定义函数以及自定义变量。
对静态代码进行更新后,从组成静态代码的多个源文件中确定更新源文件。更新源文件为技术人员执行编辑操作后得到的源文件,编辑操作包括修改、添加、删除。
源文件中包括自定义函数以及自定义变量,当然还包括引用函数以及引用变量。
自定义函数指的是在该源文件中定义的函数,针对在每个源文件中定义的函数可以被其他源文件所引用,使得不需要在不同的源文件中重复定义函数。引用函数指的是该源文件引用的其他源文件中定义的函数。
同理,自定义变量指的是在该源文件中定义的变量,针对在每个源文件中定义的变量可以被其他源文件所引用,使得不需要在不同的源文件中重复定义变量。引用变量指的是该源文件引用的其他源文件中定义的变量。
本步骤中从更新源文件中获取更新源文件中的自定义函数以及自定义变量。
S102、分别获取所述更新源文件所在环境中的区别于所述更新源文件的其他各个源文件的引用函数以及引用变量。
环境指的是开发环境,开发环境中包括组成开发项目的代码程序的所有代码模块,每个代码模块可以以源文件的形式存储。
从环境中包括的全部源文件中确定出更新源文件后,可以确定区别于更新源文件的其他源文件,并分别获取区别于更新源文件的各个源文件的引用函数以及引用变量,以确定各个源文件引用的函数或者引用的变量是否是更新源文件中定义的函数或变量,进而确定各个源文件与更新源文件之间是否存在依赖关系。
假设,环境中存在四个源文件,分别是源文件1、源文件2、源文件3和源文件4。若技术人员对源文件1进行了修改,那么,确定源文件1为更新源文件,而源文件2、源文件3和源文件4为区别于更新源文件1的其他源文件。并分别从源文件2、源文件3和源文件4中获取引用函数以及引用变量。
S103、基于获取到的自定义函数、自定义变量、引用函数以及引用变量,确定与所述更新源文件存在依赖关系的源文件。
将从区别于更新源文件的其他源文件中获取到的全部引用函数,依次与从更新源文件中获取到的自定义函数进行匹配,若引用函数与自定义函数匹配,则说明包含该引用函数的源文件与包含该自定义函数的源文件之间存在依赖关系。
并将从区别于更新源文件的其他源文件中获取到的全部引用变量,依次与从更新源文件中获取到的自定义变量进行匹配,若引用变量与自定义变量匹配,则说明包含该引用变量的源文件与包含该自定义变量的源文件之间存在依赖关系。
例如,从更新源文件1中获取到的自定义函数为add,从中获取到的自定义变量为data,而从区别于更新源文件的源文件2中,获取到引用函数为add,从区别于更新源文件的源文件3中,获取到引用变量为data,从区别于更新源文件1的源文件4中获取到的引用函数为clc。
更新源文件1中的自定义函数add与源文件2中的引用函数add相匹配,则确定源文件2引用了更新源文件1中的自定义函数add,从而源文件2与更新源文件1之间存在依赖关系。
而更新源文件1中的自定义函数add与源文件4中的引用函数clc不匹配,则确定源文件4没有引用更新源文件1中的自定义函数,从而确定更新源文件1与源文件4之间不存在依赖关系。
更新源文件1中的自定义变量data与源文件3中的引用变量data相匹配,则确定源文件3引用了更新源文件1中的自定义变量data,从而源文件3与更新源文件1之间存在依赖关系。
S104、对所述更新源文件以及与所述更新源文件存在依赖关系的源文件,进行静态代码检查。
对更新源文件1、源文件2以及源文件3进行静态代码检查,而不对源文件4进行静态代码检查。
通过上述技术方案,本实施例中从更新源文件中获取到自定义函数以及自定义变量,并从区别于更新源文件的其他源文件中获取到引用函数以及引用变量,并基于获取到的自定义函数、引用函数以及自定义变量、引用变量,确定与更新源文件存在依赖关系的源文件,然后对更新源文件以及与更新源文件存在依赖关系的源文件,进行静态代码检查。由于仅对更新源文件以及与更新源文件存在依赖关系的源文件进行静态代码检查,而不需要对环境中的全部源文件整体进行检查,因此节省了检查所需时间,提高了检查效率。同时,由于不仅对更新源文件进行检查而且对与更新源文件存在依赖关系的源文件也进行检查,从而避免了漏检导致检查准确性低的问题发生。
在实际应用中,由于直接从源文件中获取自定义函数、自定义变量、引用函数或引用变量需要逐行代码的进行匹配,导致操作复杂。下面介绍一种方便地从源文件中获取自定义函数、自定义变量、引用函数或引用变量的实现方法。
以从更新源文件中获取自定义函数以及自定义变量,从区别于更新源文件的其他各个源文件中获取引用函数以及引用变量为例进行介绍。
参见图2所示,包括以下步骤:
S201、对所述更新源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该更新源文件的自定义变量、自定义函数。
源文件指的是用汇编语言或高级语言编写出来的代码保存为文件后的结果。object文件指的是对源文件编译后生成的二进制文件,文件后缀为.O。
object文件中包括函数以及变量。函数包括自定义函数以及引用函数,变量包括自定义变量以及引用变量。
自定义函数指的是在该object文件中定义的函数,针对在每个object文件中定义的函数,可以被其他object文件所引用,使得不需要在不同的object文件中重复定义函数。引用函数指的是该object文件引用的其他object文件中定义的函数。
借助编译器对更新源文件编译后,生成该更新源文件的object文件,并生成该object文件的符号表。符号表中包含该object文件的自定义变量、自定义函数、引用变量以及引用函数。
符号表如表1所示,
表1
Figure BDA0002113363730000081
Figure BDA0002113363730000091
表1中,第一列为类型(type),表征变量是自定义变量还是引用变量,函数是自定义函数还是引用函数。如,对于变量而言,Type值为OBJECT,则说明该变量为自定义变量。对于函数而言,Type值为FUNC,则说明该函数为自定义函数。无论是对函数还是变量而言,只要Type值为NOTYPE,则说明该函数为引用函数或该变量为引用变量。
第二列为绑定(bind),表征变量是全局变量还是局部变量,函数是全局函数还是局部函数。如,针对一个变量而言,bind值为LOCAL,则说明该变量为局部变量,bind值为GLOBAL,则说明该变量为全局变量。函数与变量相同,函数的bind值为LOCAL,则说明该函数为局部函数,bind值为GLOBAL,则说明该函数为全局函数。
第三列为名称(Name),表征变量的变量名,函数的函数名。
S202、从所述符号表中分别获取该更新源文件的自定义变量、自定义函数。
假设表1所示的符号表为对更新源文件编译后生成的object文件的符号表,那么,从表1中获取更新源文件的自定义变量以及自定义函数。
变量包括全局变量和局部变量,从而自定义变量包括自定义全局变量和自定义局部变量,此处,从符号表中仅获取object文件的自定义全局变量。
符号表中Bind值为GLOBAL且Type值为OBJECT,即为该object文件的自定义全局变量。获取到自定义全局变量后,为了便于后续利用自定义全局变量进行依赖关系的确定,将获取到的自定义全局变量以及对应的object文件,按照数据表的形式存储,生成第一数据表。
其中,数据表可以为哈希表,数据表中第一列的属性为Key,表示自定义全局变量的变量名,与表1中第三列所示的Name值相同,数据表中第二列的属性为values,表示object文件的文件名,其中,文件名与变量名之间存在对应关系。
从表1这一符号表中获取自定义全局变量,并基于获取到的自定义全局变量以及对应的object文件建立得到的数据表如表2所示:
表2
Key values
CVNcalc_ctCRCStep 1.O
CVNcalc_StrtAddr 1.O
CVNcalc_data 1.O
CVNcalc_data_sectionout 1.O
CVNcalc_stSectionCal 1.O
CVNcalc_CalOrder_Eol_Rom_Flash 1.O
CVNcalc_data_init 1.O
表2中第一列为1.O这一object文件中包括的全部自定义全局变量,第二列为自定义全局变量对应的object文件,即自定义全局变量所存在的object文件,本实施例中表2第二列的值为更新源文件的object文件的文件名。
从符号表中获取到更新源文件的自定义全局变量后,继续从符号表中获取该更新源文件的自定义全局函数。
需要说明的是,虽然本实施例中是先从符号表中获取更新源文件的自定义全局变量,然后再从符号表中获取更新源文件的自定义全局函数,但是,在其他实施例中可以先从符号表中获取更新源文件的自定义全局函数,然后再从符号表中获取更新源文件的自定义全局变量。在实际应用过程中,并不限定从符号表中获取更新源文件的自定义全局变量以及获取更新源文件的自定义全局函数的先后顺序。
符号表中Bind值为GLOBAL且Type值为FUNC,即为该object文件的自定义全局函数,获取到自定义全局函数后,为了便于后续利用自定义全局函数进行依赖关系的确定,将获取到的自定义全局函数以及对应的object文件,按照数据表的形式存储,生成第二数据表。
其中,数据表可以为哈希表,数据表中第一列的属性为Key,表示自定义全局函数的函数名,与表1中第三列所示的Name值相同,数据表中第二列的属性为values,表示object文件的文件名,其中,文件名与函数名之间存在对应关系。
从表1这一符号表中获取自定义全局函数,并基于获取到的自定义全局函数以及对应的object文件建立得到的数据表如表3所示:
表3
Key values
CVNcalc_GetStepNum 1.O
CVNcalc_clr 1.O
CVNcalc_Process 1.O
CVNcalc_Eol_Rom_Flash_Part 1.O
表3中第一列为1.O这一object文件中包括的全部自定义全局函数,第二列为自定义全局函数对应的object文件,即自定义全局函数所存在的object文件,本实施例中表2第二列的值为更新源文件的object文件的文件名。
完成从更新源文件中获取自定义全局变量以及自定义全局函数后,可以将获取到的自定义全局变量以及自定义全局函数合并存储在一个数据表中,及将第一数据表和第二数据表作为一个数据表存储。当然,还可以直接按照第一数据表存储获取到的自定义全局变量,第二数据表存储获取到的自定义全局函数。
S203、对区别于所述更新源文件的其他各个源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该源文件的引用变量、引用函数。
对区别于更新源文件的各个源文件进行编译生成object文件,并生成object文件的符号表都如表1所示,只是不同object文件的符号表中包括的变量、函数不同。从而从符号表中获取到的引用变量以及引用函数不同。
S204、从所述符号表中分别获取该源文件的引用变量、引用函数。
针对每个区别于更新源文件的源文件,分别执行从符号表中获取该源文件的引用变量以及引用函数。
以表1这一符号表为例,符号表中Bind值为GLOBAL且Type值为NOTYPE,即为该object文件的引用变量及引用函数。依次从区别于更新源文件的各个源文件生成object文件并生成的符号表中获取object文件中的引用变量以及引用函数。
获取到引用变量以及引用函数后,为了便于后续利用引用变量以及引用函数进行依赖关系的确定,将获取到的引用变量、引用函数以及对应的object文件,按照数据表的形式存储,生成第三数据表。
其中,数据表可以为哈希表,数据表中第一列的属性为Key,表示引用变量的变量名或引用函数的函数名,与符号表中第三列所示的Name值相同,数据表中第二列的属性为values,表示object文件的文件名,其中,文件名与变量名、函数名之间存在对应关系。
假设表1所示的符号表为根据区别于更新源文件的一个源文件的object文件生成的,那么,从表1这一符号表中获取该源文件的引用函数和引用变量,并基于获取到的引用函数、引用变量以及对应的object文件建立得到的数据表如表4所示:
表4
Key values
UND_cie 1.O
UNDCRC32WithInitVal 1.O
表4中第一列为object文件中包括的全部引用函数和引用变量,第二列为引用函数和引用变量对应的object文件,即引用函数或引用变量所存在的object文件。
通过图2所示的从更新源文件中获取自定义函数以及自定义变量,从区别于更新源文件的其他各个源文件中获取引用函数以及引用变量的方法,步骤S103的具体实现方法为:
从第三数据表中查找第一数据表中的变量,并在第三数据表中查找第二数据表中的函数。
如果第三数据表中key值与第一数据表中key值相同,则说明第三数据表中与该key值位于同一行的values值对应的源文件引用了该更新源文件中该key值对应的自定义变量,从而第三数据表中与该key值位于同一行的values值对应的源文件与该更新源文件之间存在依赖关系。
如果第三数据表中key值与第二数据表中key值相同,则说明第三数据表中与该key值位于同一行的values值对应的源文件引用了该更新源文件中该key值对应的自定义函数,从而第三数据表中与该key值位于同一行的values值对应的源文件与该更新源文件之间存在依赖关系。
确定与更新源文件存在依赖关系的所有源文件后,还可以将与更新源文件存在依赖关系的所有源文件的文件名按照列表方式存储,生成第一依赖文件列表。
基于生成的第一依赖文件列表,对更新源文件以及第一依赖文件列表中的每个源文件依次进行静态代码检查。
在进行静态代码检查时,考虑到如果更新源文件的头文件中包含宏的增加或修改,会影响到对其他源文件(没有经过修改的源文件)的检查结果,因此还需要确定与更新源文件存在头文件依赖关系的源文件。
参见图3所示,为本实施例中提供的确定与更新源文件存在头文件依赖关系的源文件的方法,可以包括以下步骤:
S301、获取所述更新源文件中的头文件信息。
S302、分别对所述更新源文件所在环境中的各个源文件重新编译生成depend文件;所述depend文件中包括该源文件引用的头文件信息。
在步骤S201以及步骤S203中,需要借助编译器对源文件进行编译,生成源文件的object文件,此处如果需要对各个源文件重新编译生成depend文件,则修改编译选项后借助编译器对源文件进行编译生成depend文件。
如图4所示,为对一个源文件编译后生成的depend文件。depend文件中包含该源文件所引用的全部头文件信息。其中,图4中“.\”为分隔符,每两个“.\”之间的信息为一项头文件信息。
S303、获取所述depend文件中的头文件信息,并依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配。
一种实现方式为基于正则匹配算法,依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配。
通过执行正则匹配,可以确定出一个源文件引用的头文件信息中是否包含更新源文件中的头文件信息。
S304、根据匹配结果,确定与所述更新源文件存在头文件依赖关系的源文件。
匹配结果为:depend文件中包括的头文件信息中存在与更新源文件中的头文件信息匹配的头文件信息,则说明depend文件对应的源文件中引用的头文件信息中包含更新源文件中的头文件信息,确定该源文件与更新源文件之间存在头文件依赖关系。
否则,源文件与更新源文件之间不存在头文件依赖关系。
在确定出源文件与更新源文件之间存在头文件依赖关系后,还可以将与更新源文件存在头文件依赖关系的所有源文件的文件名按照列表方式存储,生成第二依赖文件列表。
在进行静态代码检查时,基于更新源文件、生成的第一依赖文件列表以及第二依赖文件列表,依次对更新源文件、第一依赖文件列表中的每个源文件、第二依赖文件列表中的每个源文件进行静态代码检查。实现了增量式静态代码检查,大大节省了对静态代码检查所需的时间。
对应上述实施例公开的静态代码的检查方法,本实施例还提供了一种静态代码的检查装置,参见图5所示,该检查装置包括:
第一获取单元501、第二获取单元502、第一确定单元503和检查单元504。
第一获取单元501,用于确定更新源文件,并获取更新源文件中的自定义函数以及自定义变量;
第二获取单元502,用于分别获取所述更新源文件所在环境中的区别于所述更新源文件的其他各个源文件的引用函数以及引用变量;
第一确定单元503,用于基于获取到的自定义函数、自定义变量、引用函数以及引用变量,确定与所述更新源文件存在依赖关系的源文件;
检查单元504,用于对所述更新源文件以及与所述更新源文件存在依赖关系的源文件,进行静态代码检查。
通过上述技术方案,本实施例中从更新源文件中获取到自定义函数以及自定义变量,并从区别于更新源文件的其他源文件中获取到引用函数以及引用变量,并基于获取到的自定义函数、引用函数以及自定义变量、引用变量,确定与更新源文件存在依赖关系的源文件,然后对更新源文件以及与更新源文件存在依赖关系的源文件,进行静态代码检查。由于仅对更新源文件以及与更新源文件存在依赖关系的源文件进行静态代码检查,而不需要对环境中的全部源文件整体进行检查,因此节省了检查所需时间,提高了检查效率。同时,由于不仅对更新源文件进行检查而且对与更新源文件存在依赖关系的源文件也进行检查,从而避免了漏检导致检查准确性低的问题发生。
可选地,在其他实施例中,第一获取单元501包括:
生成子单元和获取子单元。
所述生成子单元,用于对所述更新源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该更新文件的自定义变量、自定义函数;
所述获取子单元,用于从所述符号表中分别获取该更新源文件的自定义变量、自定义函数。
在其他实施例中,第二获取单元502也可以包括:
生成子单元和获取子单元。
所述生成子单元,用于对区别于所述更新源文件的其他各个源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该源文件的引用变量、引用函数。
所述获取子单元,用于从所述符号表中分别获取该源文件的引用变量、引用函数。
可选地,第一确定单元503包括:
第一确定子单元和第二确定子单元。
所述第一确定子单元,用于基于获取到的自定义变量以及引用变量,确定与每个自定义变量匹配的引用变量所在的源文件为与更新源文件之间存在变量依赖关系的源文件;
所述第二确定子单元,用于基于获取到的自定义函数以及引用函数,确定与每个自定义函数匹配的引用函数所在的源文件为与更新源文件之间存在函数依赖关系的源文件。
在图5所示检查装置的基础上,本实施例提供了另一种静态代码的检查装置,参见图6所示,该检查装置还包括:
第三获取单元601、重编译单元602、第四获取单元603和第二确定单元604。
第三获取单元601,用于获取所述更新源文件中的头文件信息;
重编译单元602,用于分别对所述更新源文件所在环境中的各个源文件重新编译生成depend文件;所述depend文件中包括该源文件引用的头文件信息;
第四获取单元603,用于获取所述depend文件中的头文件信息,并依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配;
第二确定单元604,用于根据匹配结果确定与所述更新源文件存在头文件依赖关系的源文件。
通过上述技术方案,本实施例中考虑到如果更新源文件的头文件中包含宏的增加或修改,会影响到对其他源文件(没有经过修改的源文件)的检查结果,从而还需要进一步确定与更新源文件存在头文件依赖关系的源文件,并对与更新源文件存在头文件依赖关系的源文件进行静态代码检查,提高了检查结果的准确性。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (7)

1.一种静态代码的检查方法,其特征在于,包括:
确定更新源文件,并获取更新源文件中的自定义函数以及自定义变量;
分别获取所述更新源文件所在环境中的区别于所述更新源文件的其他各个源文件的引用函数以及引用变量;
基于获取到的自定义函数、自定义变量、引用函数以及引用变量,确定与所述更新源文件存在依赖关系的源文件;
对所述更新源文件以及与所述更新源文件存在依赖关系的源文件,进行静态代码检查;
其中,所述获取更新源文件中的自定义函数以及自定义变量包括:
对所述更新源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该更新文件的自定义变量、自定义函数;
从所述符号表中分别获取该更新源文件的自定义变量、自定义函数;
所述分别获取所述更新源文件所在环境中的区别于所述更新源文件的其他各个源文件的引用函数以及引用变量包括:
对区别于所述更新源文件的其他各个源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该源文件的引用变量、引用函数;
从所述符号表中分别获取该源文件的引用变量、引用函数。
2.根据权利要求1所述的方法,其特征在于,所述基于获取到的自定义函数、自定义变量、引用函数以及引用变量,确定与所述更新源文件存在依赖关系的源文件包括:
基于获取到的自定义变量以及引用变量,确定与每个自定义变量匹配的引用变量所在的源文件为与更新源文件之间存在变量依赖关系的源文件;
基于获取到的自定义函数以及引用函数,确定与每个自定义函数匹配的引用函数所在的源文件为与更新源文件之间存在函数依赖关系的源文件。
3.根据权利要求2所述的方法,其特征在于,所述确定与每个自定义函数匹配的引用函数所在的源文件为与更新源文件之间存在函数依赖关系的源文件之后,还包括:
获取所述更新源文件中的头文件信息;
分别对所述更新源文件所在环境中的各个源文件重新编译生成depend文件;所述depend文件中包括该源文件引用的头文件信息;
获取所述depend文件中的头文件信息,并依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配;
根据匹配结果,确定与所述更新源文件存在头文件依赖关系的源文件。
4.根据权利要求3所述的方法,其特征在于,所述依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配包括:
基于正则匹配算法,依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配。
5.一种静态代码的检查装置,其特征在于,包括:
第一获取单元,用于确定更新源文件,并获取更新源文件中的自定义函数以及自定义变量;
第二获取单元,用于分别获取所述更新源文件所在环境中的区别于所述更新源文件的其他各个源文件的引用函数以及引用变量;
第一确定单元,用于基于获取到的自定义函数、自定义变量、引用函数以及引用变量,确定与所述更新源文件存在依赖关系的源文件;
检查单元,用于对所述更新源文件以及与所述更新源文件存在依赖关系的源文件,进行静态代码检查;
其中,所述第一获取单元包括:
生成子单元,用于对所述更新源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该更新文件的自定义变量、自定义函数;
获取子单元,用于从所述符号表中分别获取该更新源文件的自定义变量、自定义函数;
所述分别获取所述更新源文件所在环境中的区别于所述更新源文件的其他各个源文件的引用函数以及引用变量包括:
对区别于所述更新源文件的其他各个源文件进行编译生成object文件,并生成该object文件的符号表;所述符号表中至少包括该源文件的引用变量、引用函数;
从所述符号表中分别获取该源文件的引用变量、引用函数。
6.根据权利要求5所述的检查装置,其特征在于,所述第一确定单元包括:
第一确定子单元,用于基于获取到的自定义变量以及引用变量,确定与每个自定义变量匹配的引用变量所在的源文件为与更新源文件之间存在变量依赖关系的源文件;
第二确定子单元,用于基于获取到的自定义函数以及引用函数,确定与每个自定义函数匹配的引用函数所在的源文件为与更新源文件之间存在函数依赖关系的源文件。
7.根据权利要求6所述的检查装置,其特征在于,还包括:
第三获取单元,用于获取所述更新源文件中的头文件信息;
重编译单元,用于分别对所述更新源文件所在环境中的各个源文件重新编译生成depend文件;所述depend文件中包括该源文件引用的头文件信息;
第四获取单元,用于获取所述depend文件中的头文件信息,并依次将所述更新源文件中的每个头文件信息与从所述depend文件中获取到的头文件信息进行匹配;
第二确定单元,用于根据匹配结果确定与所述更新源文件存在头文件依赖关系的源文件。
CN201910581836.8A 2019-06-30 2019-06-30 一种静态代码的检查方法及装置 Active CN110286934B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910581836.8A CN110286934B (zh) 2019-06-30 2019-06-30 一种静态代码的检查方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910581836.8A CN110286934B (zh) 2019-06-30 2019-06-30 一种静态代码的检查方法及装置

Publications (2)

Publication Number Publication Date
CN110286934A CN110286934A (zh) 2019-09-27
CN110286934B true CN110286934B (zh) 2023-04-18

Family

ID=68020219

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910581836.8A Active CN110286934B (zh) 2019-06-30 2019-06-30 一种静态代码的检查方法及装置

Country Status (1)

Country Link
CN (1) CN110286934B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110688320B (zh) * 2019-09-30 2023-05-23 潍柴动力股份有限公司 全局变量的检测方法、装置及终端设备
CN111241823A (zh) * 2020-01-07 2020-06-05 北京字节跳动网络技术有限公司 一种依赖配置的管理方法、装置、电子设备及存储介质
CN116401147B (zh) * 2023-02-08 2024-05-03 深圳开源互联网安全技术有限公司 一种函数库引用版本检测方法、设备及存储介质
CN116069338B (zh) * 2023-03-07 2023-08-11 深圳开源互联网安全技术有限公司 一种函数库引用检测方法、装置、设备及可读存储介质

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013097470A (ja) * 2011-10-28 2013-05-20 Mitsubishi Electric Corp ソースファイル再利用支援装置、ソースファイル再利用支援方法、及び、プログラム

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2006132427A1 (en) * 2005-06-10 2006-12-14 Canon Kabushiki Kaisha Ink jet ink, method of producing ink jet ink, ink jet recording method, ink cartridge, and cyan ink
US8364696B2 (en) * 2009-01-09 2013-01-29 Microsoft Corporation Efficient incremental parsing of context sensitive programming languages
JP2015069332A (ja) * 2013-09-27 2015-04-13 日本電気株式会社 静的検証装置に静的検証を実行させる対象範囲を抽出する、対象範囲抽出装置、静的検証システム、対象範囲抽出方法、及び対象範囲抽出プログラム
CN105335137B (zh) * 2014-07-23 2019-01-18 国际商业机器公司 用于处理源文件的方法和装置
CN106469049B (zh) * 2015-08-19 2020-09-29 腾讯科技(深圳)有限公司 一种文件扫描的方法及装置
US9547478B1 (en) * 2015-09-30 2017-01-17 Semmle Limited Hierarchical dependency analysis enhancements using disjoint-or trees
US10296311B2 (en) * 2015-11-25 2019-05-21 International Business Machines Corporation Finding uninitialized variables outside the local scope
CN106294156B (zh) * 2016-08-11 2018-12-07 北京邮电大学 一种静态代码缺陷检测分析方法及装置
CN107832059B (zh) * 2017-11-21 2021-02-09 广州视源电子科技股份有限公司 一种基于Makefile的代码静态分析方法和装置
CN108614707B (zh) * 2018-04-27 2023-05-02 深圳市腾讯网络信息技术有限公司 静态代码检查方法、装置、存储介质和计算机设备

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013097470A (ja) * 2011-10-28 2013-05-20 Mitsubishi Electric Corp ソースファイル再利用支援装置、ソースファイル再利用支援方法、及び、プログラム

Also Published As

Publication number Publication date
CN110286934A (zh) 2019-09-27

Similar Documents

Publication Publication Date Title
CN110286934B (zh) 一种静态代码的检查方法及装置
CN110262803B (zh) 一种依赖关系的生成方法及装置
US10606570B2 (en) Representing software with an abstract code graph
CN106843840B (zh) 一种基于相似度分析的源代码版本演化注释复用方法
CN112596739B (zh) 一种数据的处理方法和装置
JP2018505506A (ja) 機械ベースの命令編集
US20110214110A1 (en) Compiler Mechanism for Handling Conditional Statements
JP5976209B2 (ja) プログラム解析装置、プログラム解析方法およびプログラム解析プログラム
CN112328259A (zh) 一种编译时长的处理方法和装置
Solanki et al. Comparative study of software clone detection techniques
CN112860312A (zh) 项目依赖关系变化的检测方法及装置
CN106933591A (zh) 代码合并的方法及装置
Michelon et al. Mining feature revisions in highly-configurable software systems
KR100834676B1 (ko) 소프트웨어 프로젝트 빌드 방법
CN110119283B (zh) 一种应用更新处理方法、装置及***、应用更新***
CN112230963A (zh) 安全漏洞修复的方法、装置、计算机设备和存储介质
US9396239B2 (en) Compiling method, storage medium and compiling apparatus
CN116578282A (zh) 代码生成方法、装置、电子设备及介质
CN115113858A (zh) 一种类循环依赖的检测方法及***
US9747085B2 (en) Source code generation from prototype source
JP6369177B2 (ja) 開発支援プログラム,開発支援方法及び開発支援装置
CN113126998A (zh) 一种增量源码获取方法、装置、电子设备及存储介质
WO2017071777A1 (en) Generation of a data type code value for a data type
CN107239395B (zh) 一种源代码中无效函数的查找方法和设备
Cholakov et al. Duplicate code detection algorithm

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