CN110442346B - 用于编译器代码检测的规则扩充方法 - Google Patents

用于编译器代码检测的规则扩充方法 Download PDF

Info

Publication number
CN110442346B
CN110442346B CN201910608055.3A CN201910608055A CN110442346B CN 110442346 B CN110442346 B CN 110442346B CN 201910608055 A CN201910608055 A CN 201910608055A CN 110442346 B CN110442346 B CN 110442346B
Authority
CN
China
Prior art keywords
rule
keyword
weight
rules
implemented
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
CN201910608055.3A
Other languages
English (en)
Other versions
CN110442346A (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.)
Institute of Computing Technology of CAS
Original Assignee
Institute of Computing Technology of CAS
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 Institute of Computing Technology of CAS filed Critical Institute of Computing Technology of CAS
Priority to CN201910608055.3A priority Critical patent/CN110442346B/zh
Publication of CN110442346A publication Critical patent/CN110442346A/zh
Application granted granted Critical
Publication of CN110442346B publication Critical patent/CN110442346B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供一种用于编译器代码检测的规则扩充方法,包括:步骤1)判断新扩充规则的所属类别;步骤2)在所述所属类别中查找与所述新扩充规则相近的已实现规则,推荐与所述新扩充规则相近的已实现规则的调用点;其中,规则的类别是对所有已实现规则的调用点进行聚类而构建的,已实现规则的调用点是该已实现规则在编译器中的实现位置。本发明能够快速地向代码检测器的开发人员推荐新扩充规则在编译器中的实现位置,大大降低了规则扩充的人力成本和时间成本;此外本发明适用于不同编程语言的规则,具有通用性。

Description

用于编译器代码检测的规则扩充方法
技术领域
本发明涉及代码安全检测技术领域,特别涉及一种用于编译器代码检测的规则扩充方法。
背景技术
许多公司现已推出其特有的代码规则(即编码要遵循的规则,下文简称规则),如Sun Code Conventions、Google Java Style、MISRA-C、Space-C等。这些规则少则几十条,多则上千条,因此程序开发人员很难在开发程序时顾及到每一条规则。由此,出现了代码检测器(例如,静态代码分析工具)来辅助程序开发人员找到代码中的缺陷,从而避免出现规则所指出的那些问题。当前的代码检测器大多基于编译器,即在编译程序时对代码进行检测,因此对代码的检测均在编译器内部实现。
由于不同的编程语言(甚至不同的公司)具有不同的规则,因此当前的各种代码检测器均有语言上的局限性,通常一种代码检测器只支持一种或几种编程语言。此外,代码检测器的开发仍停留在人工开发阶段,过多依赖于开发人员的经验,在扩充新规则时人力和时间成本极高。
对于代码检测器的开发人员而言,如何使代码检测器能够在支持尽可能多的规则(如不同编程语言的规则)的同时高效地扩充新规则,是目前亟待解决的问题。
发明内容
为解决上述现有技术中存在的问题,根据本发明的一个实施例,提供一种用于编译器代码检测的规则扩充方法,包括:
步骤1)判断新扩充规则的所属类别;
步骤2)在所述所属类别中查找与所述新扩充规则相近的已实现规则,推荐与所述新扩充规则相近的已实现规则的调用点;其中,规则的类别是对所有已实现规则的调用点进行聚类而构建的,已实现规则的调用点是该已实现规则在编译器中的实现位置。
上述方法中,步骤1)包括:
步骤11)从新扩充规则中获得多个关键词;
步骤12)将所述多个关键词中的每个关键词映射为词向量,并且获取所述多个关键词中的每个关键词的权值;
步骤13)将所述多个关键词的词向量进行加权平均,得到所述新扩充规则的向量;
步骤14)计算所述新扩充规则的向量与所构建每个类别的中心向量之间的距离,将最短距离对应的中心向量的所属类别作为所述新扩充规则的所属类别;其中,所述新扩充规则的向量与所构建每个类别的中心向量维数相同。
上述方法中,在步骤12)中,获取所述多个关键词中的每个关键词的权值包括:
在关键字-权值列表中查找从所述新扩充规则中获得的多个关键词的权值;其中,所述关键字-权值列表是对所有已实现规则进行训练得到的,包括所有已实现规则中的关键词及其权值;
对于在所述关键字-权值列表中没有找到的关键词,在所述关键字-权值列表中查找该关键词的近义词的权值,若找到则将该近义词的权值作为该关键词的权值;若没有找到或者该关键词没有近义词,则根据下式计算该关键词的权值:
Figure BDA0002121396820000021
其中,weight(I*)表示关键词I*的权值,
Figure BDA0002121396820000022
表示超参数,p(I*)表示关键词I*在所有已实现规则中出现的次数。
上述方法中,根据以下步骤构建所述关键字-权值列表:
步骤a)从所有已实现规则中获得关键词;
步骤b)根据关键词在所有已实现规则中出现的次数,计算所有已实现规则中每个关键词的第一权值;
步骤c)对于所有已实现规则中的每个已实现规则,将该已实现规则中的关键词映射为词向量,并且根据该已实现规则中的关键词的词向量、第一权值和第二权值构建该已实现规则的向量;其中,所有已实现规则中的每个关键词的第二权值为未知量;并且,根据所有已实现规则中的每个关键词的词向量之间的距离确定关键词的近义词;
步骤d)使得每个已实现规则的向量与所构建每个类别的中心向量之间的距离等于该已实现规则的调用点的向量与该中心向量之间的距离,得到多个非线性二次方程组;
步骤e)利用非线性最小二乘法解所述多个非线性二次方程组,得到所有已实现规则中的每个关键词的第二权值;
步骤f)对于所有已实现规则中的每个关键词,将该关键词的第一权值与第二权值的乘积作为该关键词的权值,记录在所述关键字-权值列表中。
上述方法中,步骤e)还包括:对所得到的所有已实现规则中的每个关键词的第二权值进行调整。其中,对所得到的所有已实现规则中的每个关键词的第二权值进行调整包括:
对于所有已实现规则中的每个已实现规则,根据该已实现规则中的关键词的词向量、第一权值和第二权值计算该已实现规则的向量;
对所有已实现规则的向量进行聚类,如果聚类结果与所构建规则的类别不一致,则改变非线性最小二乘法中利用的参数,重新解所述多个非线性二次方程组,直到聚类结果与所构建规则的类别一致。
上述方法中,根据下式计算关键词的第一权值:
Figure BDA0002121396820000031
其中,I表示所有已实现规则中的第I个关键词,weight1(I)表示第I个关键词的第一权值,
Figure BDA0002121396820000032
表示超参数,p(I)表示第I个关键词在所有已实现规则中出现的次数;
根据下式构建已实现规则的向量:
Figure BDA0002121396820000033
其中,Rule_Vec表示已实现规则的向量,n表示该已实现规则包含n个关键词,Keyword_Vec(i)表示该已实现规则中第i个关键词的词向量,Weight1(i)表示第i个关键词的第一权值,Weight2(i)表示第i个关键词的第二权值;以及
根据下式构建非线性二次方程组:
Figure BDA0002121396820000041
其中,Distance表示已实现规则的调用点的向量与中心向量的距离,m表示关键词的词向量以及中心向量的维数,n表示该已实现规则包含n个关键词,Keyword_Vec(i)j表示该已实现规则的第i个关键词在第j维对应的元素,Weight1(i)表示该已实现规则的第i个关键词的第一权值,Weight2(i)表示该已实现规则的第i个关键词的第二权值,Cluster_Vecj表示该中心向量在第j维对应的元素。
上述方法中,步骤1)包括:
步骤11)将所有已实现规则中每个已实现规则的调用点映射为向量;
步骤12)对所有已实现规则的调用点的向量进行聚类,将得到的类别作为规则的类别。
上述方法中,已实现规则的调用点由该已实现规则在编译器中对应的文件名、函数名以及进行代码检测时所需的参数信息来表示。
根据本发明的一个实施例,还提供一种电子设备,包括处理器和存储器,所述存储器存储有可被所述处理器执行的指令,当所述指令被所述处理器执行时,使得所述电子设备实现上述用于编译器代码检测的规则扩充方法。
本发明实施例具有如下的有益效果:
能够快速地向代码检测器的开发人员推荐新扩充规则在编译器中的实现位置,使得开发人员无需深入了解编译器即可快速实现新扩充的规则,大大降低了规则扩充的人力成本和时间成本。此外,本发明适用于不同编程语言的规则,具有通用性。
附图说明
以下将通过参考附图对示例性实施例进行详细描述,附图意在描绘示例性实施例而不应被解释为对权利要求的预期范围加以限制。除非明确指出,否则附图不被认为依比例绘制。
图1示出根据本发明一个实施例的用于编译器代码检测的规则扩充方法的流程图;
图2示出根据本发明一个实施例的规则的调用点分类结果示意图;
图3示出根据本发明一个实施例的构建关键词-权值列表的方法流程图;
图4示出根据本发明一个实施例的判断新扩充规则所属类别的方法流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图通过具体实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
当前的代码检测器大多基于编译器,即在编译程序时对代码进行检测,因此对代码的检测均在编译器内部实现。而代码检测器的开发中最耗时的部分不是检测代码的设计过程,而是为每条规则在编译器中找到合适的实现位置(又称调用点)的过程,即应该在编译器的何处添加规则所对应的检测代码。发明人通过研究发现,如果规则的调用点相似,则其语义(即规则的语义)也具有一定的相似性。对于新扩充的规则,如果找到与其在语义上相似的已实现规则,则该已实现规则的调用点可以作为参考调用点推荐给开发人员,开发人员可以在该调用点处(或附近)插入新扩充规则的检测代码,以实现新扩充规则。
有鉴于此,根据本发明的一个实施例,提供一种用于编译器代码检测(后文有时简称为代码检测)的规则扩充方法。概括而言,该方法包括:对所有已实现规则的调用点进行聚类,构建规则的类别;判断新扩充规则的所属类别;以及,在所属类别中查找与新扩充规则相近的已实现规则,推荐与新扩充规则相近的已实现规则的调用点,从而由开发人员确定新扩充规则的调用点。
图1示意性地示出了根据本发明实施例的用于代码检测的规则扩充方法的流程图,现参照图1描述该方法的各个步骤:
步骤S1.构建规则的类别,所述类别是对已实现规则在编译器中的调用点进行聚类得到的。
一个规则在编译器中的调用点可以用该规则对应的文件名、函数名和检测所需的参数信息来表示(本领域技术人员应理解,该规则对应的检测代码可以在该文件的该函数下找到,而检测所需的参数信息可以用于更精确地定位规则所对应的检测代码)。如图2所示,规则(或称规则描述)“Assigning operators in non-assignment expression isforbidden”在编译器中的实现位置(调用点)由文件名c-parser.c、函数名c_parser_condition和检测所需的参数信息cond来表示。通常,编译器中现有的文件名和函数名等也是编译器的开发者根据所实现的功能起名的,因此语义类似的规则其调用点通常也类似。
根据本发明的一个实施例,步骤S1包括如下的子步骤:
步骤S11.对于在编译器中已实现的规则(即,已在编译器的相应调用点处插入了该规则对应的检测代码,下文简称为已实现规则),将每个已实现规则在编译器中的调用点映射为向量,即将调用点的文件名、函数名以及检测所需的参数映射为向量。
首先,例如,以航天型号C语言安全子集中的规则所对应的调用点(包括文件名、函数名以及检测所需的参数)作为训练集来训练第一Word2Vec模型,该第一Word2Vec模型的输入为词语(即上述文件名、函数名和检测所需的参数,例如c-parser.c、c_parser_condition等),输出为词向量。该词向量可以是多维向量,例如维数为300维,词向量可表示为<0.1,0.2,0.4……0.1>。
接着,基于下式训练文件名、函数名以及检测所需的参数分别对应的权值a、b、c:
Caller_Vec=a·File_Vec+b·Func_Vec+c·Para_Vec (1)
其中,Caller_Vec表示调用点的向量,File_Vec表示文件名的词向量,Func_Vec表示函数名的词向量,Para_Vec表示检测所需的参数的词向量。训练集包括从航天型号C语言安全子集中选取的规则所对应的调用点的文件名、函数名以及检测所需的参数的词向量以及开发人员为所选取的调用点预先设计好的向量。将选取的文件名、函数名以及检测所需的参数对应的词向量分别代入File_Vec、Func_Vec和Para_Vec;并且将预设的调用点的向量代入Caller_Vec,经训练得到权值a、b、c。
需要注意的是,检测所需的参数可能会包括一个或多个参数,当检测所需的参数为一个参数时,可以将该参数的词向量直接代入公式(1)的Para_Vec;而当检测所需的参数为多个参数时(例如有k个,k为大于1的整数),根据本发明的一个实施例,先将k个参数的词向量进行加权平均,再将得到的向量代入公式(1)中的Para_Vec。应理解,在将多个参数的词向量进行加权平均时,每个参数的权值可以通过训练的方式得到或者可以根据经验来指定。
尽管上述第一Word2Vec模型和权值a、b、c是基于航天型号C语言安全子集中的规则经过训练得到的,但本领域技术人员应理解,该第一Word2Vec模型适用于将不同编程语言的规则的调用点的文件名、函数名和检测所需的参数映射为词向量,并且确定了权值a、b、c的公式(1)适用于计算不同编程语言的规则的调用点的向量。
随后,对于每个已实现规则(例如,与航天型号C语言安全子集中的规则不同的规则)的调用点,利用已经训练好的第一Word2Vec模型得到该调用点的文件名、函数名以及检测所需的参数分别对应的词向量。
最后,根据公式(1)计算每个已实现规则的调用点的向量,即将该调用点的文件名、函数名以及检测所需的参数分别对应的词向量进行加权平均。其中,如果检测所需的参数包括多个参数,则先将所述多个参数的词向量进行加权平均,将所得到的向量代入公式(1)中的Para_Vec,然后与调用点的文件名、函数名分别对应的词向量一起进行加权平均,得到该调用点的向量。如果文件名、函数名以及检测所需的参数对应的词向量为300维,则计算得到的调用点的向量也是300维。
步骤S12.对编译器中所有已实现规则的调用点进行聚类,得到规则的多个类别。
其中,对调用点进行聚类实际上是对调用点的向量进行聚类。具体地,对于所有已实现规则的调用点的向量,计算每两个向量之间的欧式距离(即相似度),根据得到的欧式距离进行聚类,得到的多个类别即为规则的类别(如果规则的调用点属于某一类别,则该规则属于该类别)。
如图2所示,在航天型号C语言安全子集中,序号分别为6.1.1、6.1.8、14.1.2、12.2.1、12.2.2的五个规则的调用点进行聚类后得到三个类别,其中6.1.1和14.1.2为一类,6.1.8和12.2.1为一类并且12.2.2为一类。另外,从图2可见,本发明提供的考虑了语义的分类方式所得到的类别结果与航天型号C语言安全子集中按主题分类的类别结果完全不同,在航天型号C语言安全子集中,6.1.1和6.1.8为一类,然而在编译器中,这两个规则事实上并不实现在一处。
步骤S13.记录每个类别的中心向量,并且计算所有已实现规则中,每个已实现规则在编译器中的调用点的向量与每个类别的中心向量的欧氏距离。
步骤S2.得到所有已实现规则中的关键词的权值,构建关键词-权值列表。
参见图3,根据本发明的一个实施例,步骤S2包括如下的子步骤:
步骤S21.从所有已实现规则中得到关键词,记录该关键词在所有已实现规则中出现的次数。
规则(本文中,规则即规则描述)通常为一句话,可首先对规则进行分词从而得到多个词。应理解,这里的分词方法不限于THULAC、SIGHAN、LTP方法等等。在一个实施例中,可以将对规则进行分词后得到的词作为关键词。而在另一个实施例中,为进一步提高准确性,还要对分词结果(即,对规则进行分词后得到的多个词)进行依存关系分析,得到所述多个词的词性以及在句中的依赖关系,选择其中的主语、谓语以及其他的一些名词、动词等作为规则的关键词。选择关键词的策略可以是预先设定好的:例如,选择主语和谓语,或者选择主语、谓语以及其他名词,或者选择主语、谓语、定语等等,其中,根据所选择的关键词能够大致获悉规则的内容。
步骤S22.对于从所有已实现规则中得到每个关键词,计算其第一权值。
具体地,根据关键词在所有已实现规则中出现的次数。计算该关键词的第一权值,如下式所示:
Figure BDA0002121396820000081
其中,I表示所有已实现规则中的第I个关键词;weight1(I)表示第I个关键词的第一权值;
Figure BDA0002121396820000082
表示超参数,其优选值为0.1;p(I)表示第I个关键词在所有已实现规则中出现的次数。
步骤S23.将所有已实现规则中的每个关键词映射为词向量,根据关键词的词向量、第一权值和第二权值构建每个已实现规则的向量。此外,还构建关键词的近义词表。
首先,以与步骤S11中训练第一Word2Vec模型类似的方式训练第二Word2Vec模型。其中,训练集是航天型号C语言安全子集的所有规则的关键词,该第二Word2Vec模型的输入是关键词(如assignment、operator等),输出是词向量。需要注意的是,由关键词映射的词向量与步骤S11中由调用点映射的词向量的维数相同,例如均为300维。
随后,利用训练好的第二Word2Vec模型获得所有已实现规则中出现的关键词的词向量。
接着,根据下式构建每个已实现规则的向量:
Figure BDA0002121396820000091
其中,Rule_Vec表示已实现规则的向量;n表示该已实现规则包含n个关键词;Keyword_Vec(i)表示该已实现规则中第i个关键词的词向量;Weight1(i)表示该已实现规则中第i个关键词的第一权值;Weight2(i)表示该已实现规则中第i个关键词的第二权值,其中第二权值表示该关键词的重要性,并且是未知量。因此,这里构建的每个已实现规则的向量为包含其每个关键词的第二权值的表达式。
在步骤S23中,在得到了所有已实现规则中出现的所有关键词的词向量之后,还要将每两个关键词的词向量进行欧式距离计算。如果在计算了关键词A的词向量与其他所有关键词的词向量的欧氏距离之后发现,关键词A的词向量与关键词B的词向量之间的欧氏距离最小并且小于一个预定的阈值,则将关键词B作为关键词A的近义词,计入关键词的近义词表。
步骤S24.训练所有已实现规则中每个关键词的第二权值。
首先,针对步骤S23中构建的每个已实现规则的向量,将该已实现规则的向量与每个类别的中心向量做欧式距离计算,并且将该距离等于该已实现规则的调用点的向量与该类别的中心向量的欧氏距离(后一个距离参见步骤S13),如下式所示:
Figure BDA0002121396820000092
其中,Distance表示已实现规则在编译器中的调用点的向量与类别的中心向量的欧氏距离,m表示词向量的维数(例如300维,应理解的是,关键词的词向量和中心向量的维数相等),n表示该已实现规则包括n个关键词,Keyword_Vec(i)j表示该已实现规则的第i个关键词在第j维对应的元素,Weight1(i)表示该已实现规则的第i个关键词的第一权值,Weight2(i)表示该已实现规则的第i个关键词的第二权值,Cluster_Vecj表示该类别的中心向量在第j维对应的元素。
由此,得到多个包含未知量Weight2(i)的非线性二次方程组。
随后,通过非线性最小二乘法中的Levenberg-Marquardt方法来解上述多个非线性二次方程组,从而得到所有已实现规则中每个关键词的第二权值。
步骤S25.调整关键词的第二权值。
优选的,为使关键词的权值更为准确,在步骤S25中,对步骤S24中训练得到的第二权值执行进一步的调整。
具体地,首先,根据公式(3)以及步骤S24中训练得到的每个关键词的第二权值,计算每个已实现规则的向量,这里所得到的向量不包含未知量。随后,对所有已实现规则的向量进行聚类,分析该聚类结果与步骤S1中对所有已实现规则的调用点的聚类结果是否一致,如果不一致,则改变Levenberg-Marquardt方法的初始值以及优化半径,通过非线性最小二乘法中的Levenberg-Marquardt方法来重新解上述多个非线性二次方程组(参见步骤S24),直到所有已实现规则的向量的聚类结果与步骤S1中所有已实现规则的调用点的聚类结果一致。
步骤S26.得到所有已实现规则中的每个关键词的权值,其中关键词的权值为该关键词的第一权值与第二权值的乘积。并且,依此构建关键词-权值列表,该列表中的每一项包括一个关键词及其对应的权值。
步骤S3.对于新扩充规则,判断其所属类别。
具体地,参见图4,步骤S3包括如下的子步骤:
步骤S31.当有新的规则出现时,首先获取该新扩充规则的关键词(获取关键词参见步骤S21中描述的方法),并且利用第二Word2Vec模型得到该新扩充规则中的每个关键词的词向量。
步骤S32.在关键词-权值列表中查询新扩充规则的每个关键词的权值,包括以下几种情况:
①在关键词-权值列表中找到新扩充规则的所有关键词的权值;
②如果在关键词-权值列表中没有找到其中一个或多个关键词的权值,则在关键词的近义词表中查找该一个或多个关键词的近义词:
◆如果找到,则将对应的近义词的权值(查询关键词-权值列表得到近义词的权值)作为该一个或多个关键词的权值;
◆如果没有找到,或者关键词-权值列表中没有对应的近义词的权值,则计算关键词的第一权值作为关键词的权值,参见下式:
Figure BDA0002121396820000111
其中,weight(I*)表示关键词I*的权值;
Figure BDA0002121396820000112
表示超参数,其优选值为0.1;p(I*)表示关键词I*在所有已实现规则中出现的次数。
步骤S33.利用新扩充规则中所有关键词的词向量以及权值,根据公式(6)计算该新扩充规则的向量,即将新扩充规则中所有关键词的词向量进行加权平均,得到新扩充规则的向量:
Figure BDA0002121396820000113
其中,Rule_Vec*表示新扩充规则的向量;n表示该新扩充规则包含n个关键词;Keyword_Vec(i)表示该新扩充规则中第i个关键词的词向量;Weight(i)表示该新扩充规则中第i个关键词的权值。
步骤S34.将新扩充规则的向量与每个类别的中心向量计算欧式距离,取最短距离所对应的中心向量的所属类别作为该新扩充规则的所属类别。
步骤S4.在新扩充规则的所属类别中查找与所述新扩充规则相近的已实现规则,推荐相近的已实现规则的调用点,以由开发人员确定新扩充规则在编译器中的调用点(实现位置)。
与中心向量相比,计算出同一类别下相近的已实现规则,并且将相近的已实现规则的调用点推荐给开发人员,可以使得推荐信息更为精准。具体地,由于在步骤S1已获得所有已实现规则的类别,在步骤S4中,找到新扩充规则的所属类别下的所有已实现规则,计算新扩充规则的向量与所属类别下每个已实现规则的向量的欧式距离,将距离最小的k(k可以等于1、2……)个已实现规则作为相近的已实现规则,将相近的已实现规则的调用点的文件名、函数名以及检测所需参数信息推荐给开发人员。开发人员可以从中选择新扩充规则的调用点,并且将新扩充规则的对应检测代码插入该调用点。
上述实施例中,通过调用点向量与中心向量之间的欧式距离反向训练关键字的第二权值,使得最终得到的第二权值更为精准,从而新扩充规则可以通过查询训练得到的关键字权值和关键词的词向量来构建向量,获得新扩充规则的正确分类,因此本发明具有较好的泛化能力。上述实施例将新扩充规则的调用点推荐给代码检测器的开发人员,减少了开发人员调试编译器的时间,并且降低了开发人员的门槛,使得开发人员可以快速地在所确定的调用点对新扩充规则进行规则实现,提高了新规则的扩充效率。另外,上述实施例提供的方法适用于各种编程语言的规则,通用性较好。
在上述实施例中,用文件名、函数名和检测所需参数信息来表示规则在编译器中的调用点,而在其他实施例中,也可以仅使用文件名和函数名来表示规则的调用点。
在进一步的实施例中,当开发人员确定了新扩充规则在编译器中的调用点并且在该调用点实现了新扩充的规则之后,可以将该新扩充规则作为已实现的规则,并且重新执行步骤1-2,即重新构建规则的类别以及重新构建关键词-权值列表,包括重新构建近义词表。
应注意到一些示例性方法被描绘为流程图。虽然流程图将操作表述为顺序执行,但可以理解的是,许多操作可以并行、同时或同步地执行。另外,可以重新排列操作的顺序。处理可以在操作完成时终止,但是也可以具有并未包括在图中或实施例中的另外的步骤。
上述方法可以通过硬件、软件、固件、中间件、伪代码、硬件描述语言或者它们的任意组合来实现。当以软件、固件、中间件或伪代码实施时,用来执行任务的程序代码或代码分段可以被存储在计算机可读介质中,诸如存储介质,处理器可以执行该任务。
应理解,软件实现的示例性实施例通常在一些形式的程序存储介质上进行编码或者在一些类型的传输介质上实现。程序存储介质可以是任意的非瞬态存储介质,诸如磁盘(例如,软盘或硬盘)或光盘(例如,紧凑盘只读存储器或“CD ROM”),并且可以是只读的或者随机访问的。类似地,传输介质可以是双绞线、同轴线缆、光纤,或者本领域已知的一些其它适用的传输介质。
虽然本发明已经通过优选实施例进行了描述,然而本发明并非局限于这里所描述的实施例,在不脱离本发明范围的情况下还包括所做出的各种改变以及变化。

Claims (9)

1.一种用于编译器代码检测的规则扩充方法,包括:
步骤1)判断新扩充规则的所属类别,包括:
步骤11)从新扩充规则中获得多个关键词;
步骤12)将所述多个关键词中的每个关键词映射为词向量,并且获取所述多个关键词中的每个关键词的权值;
步骤13)将所述多个关键词的词向量进行加权平均,得到所述新扩充规则的向量;
步骤14)计算所述新扩充规则的向量与所构建每个类别的中心向量之间的距离,将最短距离对应的中心向量的所属类别作为所述新扩充规则的所属类别;其中,所述新扩充规则的向量与所构建每个类别的中心向量维数相同;
步骤2)在所述所属类别中查找与所述新扩充规则相近的已实现规则,推荐与所述新扩充规则相近的已实现规则的调用点;其中,规则的类别是对所有已实现规则的调用点进行聚类而构建的,已实现规则的调用点是该已实现规则在编译器中的实现位置。
2.根据权利要求1所述的方法,在步骤12)中,获取所述多个关键词中的每个关键词的权值包括:
在关键字-权值列表中查找从所述新扩充规则中获得的多个关键词的权值;其中,所述关键字-权值列表是对所有已实现规则进行训练得到的,包括所有已实现规则中的关键词及其权值;
对于在所述关键字-权值列表中没有找到的关键词,在所述关键字-权值列表中查找该关键词的近义词的权值,若找到则将该近义词的权值作为该关键词的权值;若没有找到或者该关键词没有近义词,则根据下式计算该关键词的权值:
Figure FDA0002666748850000011
其中,weight(I*)表示关键词I*的权值,
Figure FDA0002666748850000012
表示超参数,p(I*)表示关键词I*在所有已实现规则中出现的次数。
3.根据权利要求2所述的方法,其中,根据以下步骤构建所述关键字-权值列表:
步骤a)从所有已实现规则中获得关键词;
步骤b)根据关键词在所有已实现规则中出现的次数,计算所有已实现规则中每个关键词的第一权值;
步骤c)对于所有已实现规则中的每个已实现规则,将该已实现规则中的关键词映射为词向量,并且根据该已实现规则中的关键词的词向量、第一权值和第二权值构建该已实现规则的向量;其中,所有已实现规则中的每个关键词的第二权值为未知量;并且,根据所有已实现规则中的每个关键词的词向量之间的距离确定关键词的近义词;
步骤d)使得每个已实现规则的向量与所构建每个类别的中心向量之间的距离等于该已实现规则的调用点的向量与该中心向量之间的距离,得到多个非线性二次方程组;
步骤e)利用非线性最小二乘法解所述多个非线性二次方程组,得到所有已实现规则中的每个关键词的第二权值;
步骤f)对于所有已实现规则中的每个关键词,将该关键词的第一权值与第二权值的乘积作为该关键词的权值,记录在所述关键字-权值列表中。
4.根据权利要求3所述的方法,其中,步骤e)还包括:
对所得到的所有已实现规则中的每个关键词的第二权值进行调整。
5.根据权利要求4所述的方法,其中,对所得到的所有已实现规则中的每个关键词的第二权值进行调整包括:
对于所有已实现规则中的每个已实现规则,根据该已实现规则中的关键词的词向量、第一权值和第二权值计算该已实现规则的向量;
对所有已实现规则的向量进行聚类,如果聚类结果与所构建规则的类别不一致,则改变非线性最小二乘法中利用的参数,重新解所述多个非线性二次方程组,直到聚类结果与所构建规则的类别一致。
6.根据权利要求3所述的方法,其中,根据下式计算关键词的第一权值:
Figure FDA0002666748850000021
其中,I表示所有已实现规则中的第I个关键词,weight1(I)表示第I个关键词的第一权值,
Figure FDA0002666748850000022
表示超参数,p(I)表示第I个关键词在所有已实现规则中出现的次数;
根据下式构建已实现规则的向量:
Figure FDA0002666748850000031
其中,Rule_Vec表示已实现规则的向量,n表示该已实现规则包含n个关键词,Keyword_Vec(i)表示该已实现规则中第i个关键词的词向量,Weight1(i)表示第i个关键词的第一权值,Weight2(i)表示第i个关键词的第二权值;以及
根据下式构建非线性二次方程组:
Figure FDA0002666748850000032
其中,Distance表示已实现规则的调用点的向量与中心向量的距离,m表示关键词的词向量以及中心向量的维数,n表示该已实现规则包含n个关键词,Keyword_Vec(i)j表示该已实现规则的第i个关键词在第j维对应的元素,Weight1(i)表示该已实现规则的第i个关键词的第一权值,Weight2(i)表示该已实现规则的第i个关键词的第二权值,Cluster_Vecj表示该中心向量在第j维对应的元素。
7.根据权利要求1-6中任一项所述的方法,其中,在步骤1)之前还包括:
将所有已实现规则中每个已实现规则的调用点映射为向量;
对所有已实现规则的调用点的向量进行聚类,将得到的类别作为规则的类别。
8.根据权利要求1-6中任一项所述的方法,其中,已实现规则的调用点由该已实现规则在编译器中对应的文件名、函数名以及进行代码检测时所需的参数信息来表示。
9.一种电子设备,包括处理器和存储器,所述存储器存储有可被所述处理器执行的指令,当所述指令被所述处理器执行时,使得所述电子设备实现如权利要求1-8中任一项所述的方法。
CN201910608055.3A 2019-07-08 2019-07-08 用于编译器代码检测的规则扩充方法 Active CN110442346B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910608055.3A CN110442346B (zh) 2019-07-08 2019-07-08 用于编译器代码检测的规则扩充方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910608055.3A CN110442346B (zh) 2019-07-08 2019-07-08 用于编译器代码检测的规则扩充方法

Publications (2)

Publication Number Publication Date
CN110442346A CN110442346A (zh) 2019-11-12
CN110442346B true CN110442346B (zh) 2020-11-03

Family

ID=68429555

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910608055.3A Active CN110442346B (zh) 2019-07-08 2019-07-08 用于编译器代码检测的规则扩充方法

Country Status (1)

Country Link
CN (1) CN110442346B (zh)

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102231109A (zh) * 2011-07-15 2011-11-02 南京大学 无痕可管理的源代码自动插桩方法
US8997070B2 (en) * 2011-12-15 2015-03-31 Sap Se Extension mechanism for scripting language compiler
CN103309804B (zh) * 2013-04-08 2015-12-02 中国电子科技集团公司第十研究所 自动化代码规则检查平台
US10623514B2 (en) * 2015-10-13 2020-04-14 Home Box Office, Inc. Resource response expansion
CN108717470B (zh) * 2018-06-14 2020-10-23 南京航空航天大学 一种具有高准确度的代码片段推荐方法
CN109410001B (zh) * 2018-10-23 2020-09-08 杭州数梦工场科技有限公司 一种商品推荐方法、系统、电子设备和存储介质
CN109885713A (zh) * 2019-01-03 2019-06-14 刘伯涵 基于语音情绪识别的表情图像推荐方法以及装置

Also Published As

Publication number Publication date
CN110442346A (zh) 2019-11-12

Similar Documents

Publication Publication Date Title
EP3937029A2 (en) Method and apparatus for training search model, and method and apparatus for searching for target object
JP3170400B2 (ja) 意味パターン認識による文字列検索方法及びその装置
CN111488137B (zh) 一种基于共同注意力表征学习的代码搜索方法
US7383260B2 (en) Method and apparatus for ontology-based classification of media content
US11651014B2 (en) Source code retrieval
EP3051432A1 (en) Semantic information acquisition method, keyword expansion method thereof, and search method and system
US12026462B2 (en) Word embedding model parameter advisor
CN108710662B (zh) 语言转换方法和装置、存储介质、数据查询系统和方法
WO2020232898A1 (zh) 文本分类方法、装置、电子设备及计算机非易失性可读存储介质
CN110750297B (zh) 一种基于程序分析和文本分析的Python代码参考信息生成方法
CN113806482A (zh) 视频文本跨模态检索方法、装置、存储介质和设备
Yonai et al. Mercem: Method name recommendation based on call graph embedding
KR20210056131A (ko) 법령 분야 질의 응답 방법 및 장치
EP3816814A1 (en) Crux detection in search definitions
CN110442346B (zh) 用于编译器代码检测的规则扩充方法
CN109032946B (zh) 一种测试方法和装置、计算机可读存储介质
CN110580170A (zh) 软件性能风险的识别方法及装置
JP2023183447A (ja) 書換プログラム、書換方法および情報処理装置
Anthony et al. Software development automation: An approach to automate the processes of SDLC
CN110489127B (zh) 错误代码确定方法、装置、计算机可读存储介质及设备
CN110929501A (zh) 文本分析方法和装置
CN117609005B (zh) 一种代码相似度检测方法
JP5633343B2 (ja) 検索支援装置、プログラム
JP2004240769A (ja) 情報検索装置
KR100884889B1 (ko) 검색 데이터베이스의 자동 색인어 추가 방법 및 시스템

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