CN115066674A - 使用源代码元素的数值数组表示来评估源代码的方法 - Google Patents

使用源代码元素的数值数组表示来评估源代码的方法 Download PDF

Info

Publication number
CN115066674A
CN115066674A CN202080096065.4A CN202080096065A CN115066674A CN 115066674 A CN115066674 A CN 115066674A CN 202080096065 A CN202080096065 A CN 202080096065A CN 115066674 A CN115066674 A CN 115066674A
Authority
CN
China
Prior art keywords
source code
binary
ast
representation
nodes
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
Application number
CN202080096065.4A
Other languages
English (en)
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.)
Telefonaktiebolaget LM Ericsson AB
Original Assignee
Telefonaktiebolaget LM Ericsson AB
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 Telefonaktiebolaget LM Ericsson AB filed Critical Telefonaktiebolaget LM Ericsson AB
Priority to CN202211442539.3A priority Critical patent/CN115935369A/zh
Publication of CN115066674A publication Critical patent/CN115066674A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Computing Systems (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Image Generation (AREA)

Abstract

提供了源代码评估。源代码包括多个源代码元素,并且选择源代码元素中的一个。基于源代码元素生成多个令牌,并且基于该多个令牌生成二叉AST表示。二叉AST表示包括多个二叉AST节点,所述多个二叉AST节点包括二叉AST令牌节点和空节点。二叉AST令牌节点中的每一个都基于该多个令牌中的相应一个令牌。二叉AST令牌节点和空节点中的每一个都被编码为相应数值。基于二叉AST表示生成源代码元素的数值数组表示。基于二叉AST令牌节点和空节点在二叉AST表示中的相应位置,将数值映射到数值数组表示中的位置。

Description

使用源代码元素的数值数组表示来评估源代码的方法
技术领域
本发明一般涉及软件,并且更具体地涉及评估源代码的方法和相关节点。
背景技术
人工智能(AI)(尤其是机器学习(ML))的使用一直在上升。AI和ML几乎在生活的每个领域都占有一席之地。AI/ML的一个有前途的应用领域是具有各种目标(例如漏洞预测、源代码审查和完成、综合、修复等)的智能软件分析。
仅关于数组形式的数值数据来对ML模型进行训练和开发。例如,考虑ML的图像分类任务。图像由像素组成,像素是图像的最小部分,其中每个像素都有自己的颜色,在灰色系统中用0到256之间的数字表示。因此,从ML模型的角度来看,图像实际上被视为包括数值的矩阵。
另一方面,源代码主要用高级编程语言(诸如Java、Python等)编写,该高级编程语言包括来自英语(或其他)自然语言的基于文本的关键字、词和短语。因此,用高级语言编写的一段源代码可能难以直接使用ML模型进行处理。
发明内容
根据本发明构思的一些实施例,一种提供对编程语言的源代码进行评估的方法包括以下操作。提供编程语言的源代码,其中源代码包括多个源代码元素。从源代码的该多个源代码元素中选择源代码元素。基于该源代码元素生成多个令牌,其中该多个令牌中的每个令牌包括文本字符序列。基于源代码元素的该多个令牌生成源代码元素的二叉抽象语法树(AST)表示,其中二叉AST表示包括多个二叉AST节点,该多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中二叉AST令牌节点中的每一个基于源代码元素的该多个令牌中的相应一个。将二叉AST令牌节点和二叉AST空节点中的每一个编码为相应数值。基于二叉AST表示生成源代码元素的数值数组表示,其中基于相应二叉AST令牌节点和二叉AST空节点在二叉AST表示中的相应位置,将该二叉AST令牌节点和二叉AST空节点的数值映射到数值数组表示中的位置。
根据本发明构思的一些其他实施例,源代码评估节点适用于执行以下操作。提供编程语言的源代码,其中源代码包括多个源代码元素。从源代码的该多个源代码元素中选择源代码元素。基于该源代码元素生成多个令牌,其中该多个令牌中的每个令牌包括文本字符序列。基于源代码元素的该多个令牌生成源代码元素的二叉抽象语法树(AST)表示,其中二叉AST表示包括多个二叉AST节点,该多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中二叉AST令牌节点中的每一个基于源代码元素的该多个令牌中的相应一个。将二叉AST令牌节点和二叉AST空节点中的每一个编码为相应数值。基于二叉AST表示生成源代码元素的数值数组表示,其中基于相应二叉AST令牌节点和二叉AST空节点在二叉AST表示中的相应位置,将该二叉AST令牌节点和二叉AST空节点的数值映射到数值数组表示中的位置。
根据本发明构思的又一实施例,源代码评估节点包括处理电路以及与处理电路耦接的存储器。存储器包括在由处理电路执行时使源代码评估节点执行以下操作的指令。提供编程语言的源代码,其中源代码包括多个源代码元素。从源代码的该多个源代码元素中选择源代码元素。基于该源代码元素生成多个令牌,其中该多个令牌中的每个令牌包括文本字符序列。基于源代码元素的该多个令牌生成源代码元素的二叉抽象语法树(AST)表示,其中二叉AST表示包括多个二叉AST节点,该多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中二叉AST令牌节点中的每一个基于源代码元素的该多个令牌中的相应一个。将二叉AST令牌节点和二叉AST空节点中的每一个编码为相应数值。基于二叉AST表示生成源代码元素的数值数组表示,其中基于相应二叉AST令牌节点和二叉AST空节点在二叉AST表示中的相应位置,将该二叉AST令牌节点和二叉AST空节点的数值映射到数值数组表示中的位置。
根据本发明构思的又一实施例,一种计算机程序包括要由源代码评估节点的处理电路执行的程序代码,由此程序代码的执行使源代码评估节点执行以下操作。提供编程语言的源代码,其中源代码包括多个源代码元素。从源代码的该多个源代码元素中选择源代码元素。基于该源代码元素生成多个令牌,其中该多个令牌中的每个令牌包括文本字符序列。基于源代码元素的该多个令牌生成源代码元素的二叉抽象语法树(AST)表示,其中二叉AST表示包括多个二叉AST节点,该多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中二叉AST令牌节点中的每一个基于源代码元素的该多个令牌中的相应一个。将二叉AST令牌节点和二叉AST空节点中的每一个编码为相应数值。基于二叉AST表示生成源代码元素的数值数组表示,其中基于相应二叉AST令牌节点和二叉AST空节点在二叉AST表示中的相应位置,将该二叉AST令牌节点和二叉AST空节点的数值映射到数值数组表示中的位置。
根据本发明构思的另外的实施例,一种计算机程序产品包括非暂时性存储介质,所述非暂时性存储介质包括要由源代码评估节点的处理电路执行的程序代码,由此程序代码的执行使源代码评估节点执行以下操作。提供编程语言的源代码,其中源代码包括多个源代码元素。从源代码的该多个源代码元素中选择源代码元素。基于该源代码元素生成多个令牌,其中该多个令牌中的每个令牌包括文本字符序列。基于源代码元素的该多个令牌生成源代码元素的二叉抽象语法树(AST)表示,其中二叉AST表示包括多个二叉AST节点,该多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中二叉AST令牌节点中的每一个基于源代码元素的该多个令牌中的相应一个。将二叉AST令牌节点和二叉AST空节点中的每一个编码为相应数值。基于二叉AST表示生成源代码元素的数值数组表示,其中基于相应二叉AST令牌节点和二叉AST空节点在二叉AST表示中的相应位置,将该二叉AST令牌节点和二叉AST空节点的数值映射到数值数组表示中的位置。
根据本发明构思的一些实施例,可以通过为源代码元素生成二叉抽象语法树表示并且使用该二叉AST表示来生成源代码的数值数组表示来促进对源代码的更有效评估。这类操作可以例如使用机器学习(ML)促进对源代码元素的评估,以提供漏洞预测、代码审查、代码完成、综合、修复等中的一项或多项。
附图说明
被包括以提供对本发明的进一步理解并且被并入并构成本申请的一部分的附图示出了本发明构思的某些非限制性实施例。在附图中:
图1是示出源代码元素的非二叉AST的示例的图;
图2是示出根据本发明构思的一些实施例的方法的操作的图;
图3是示出根据本发明构思的一些实施例的包括两个源代码元素的一段源代码的表格;
图4A和图4B是示出根据本发明构思的一些实施例的从图3的源代码中提取的两个源代码元素的表格;
图5是示出根据本发明构思的一些实施例的图4A的源代码元素的非二叉AST的图;
图6A是示出根据本发明构思的一些实施例的非二叉树的图,图6B是示出从图6A的非二叉树导出的二叉树的图;
图7A是示出根据本发明构思的一些实施例的从图5的非二叉AST生成的图4A的源代码元素的二叉AST的图;
图7B是示出根据本发明构思的一些实施例的将AST节点编码为数值的表格;
图8A示出了根据本发明构思的一些实施例的二叉AST到数值数组表示的转换;
图8B示出了根据本发明构思的一些实施例的用于生成图8C的数值数组表示的图4A的源代码元素;
图8C示出了根据本发明构思的一些实施例的图7A的二叉AST的数值数组表示,该数值数组表示基于图7B的编码;
图9是示出根据本发明构思的一些实施例的软件漏洞的表格;
图10是示出根据本发明构思的一些实施例的针对不同软件漏洞的评估数据的平衡子集的各方面的表格;
图11是示出根据本发明构思的一些实施例的使用经过训练的ML模型的性能的图表;
图12是示出根据本发明构思的一些实施例的针对不同软件漏洞的评估数据的不平衡子集的各方面的表格;
图13是示出根据本发明构思的一些实施例的使用经过训练的ML模型的性能的图表;
图14是示出根据本发明构思的一些实施例的操作的流程图;
图15是示出根据本发明构思的一些实施例的源代码评估节点的框图;
图16是示出根据本发明构思的一些实施例的源代码评估节点的操作的流程图;
具体实施方式
现在将在下文中参照附图更全面地描述本发明构思,其中示出了本发明构思的实施例的示例。然而,本发明构思可以以许多不同的形式来具体实施,并且不应被解释为限于本文阐述的实施例。更确切而言,提供这些实施例是为了使本发明全面和完整,并且将本发明构思的范围充分传达给本领域技术人员。还应该注意,这些实施例不是相互排斥的。可以默认假设来自一个实施例的组件在另一实施例中存在/使用。
以下描述呈现所公开主题的各种实施例。这些实施例被呈现为教导示例并且不应被解释为限制所公开主题的范围。例如,在不脱离所描述主题的范围的情况下,可以修改、省略或扩展所描述的实施例的某些细节。
图15是示出根据本发明构思的一些实施例的被配置为提供源代码评估的源代码评估节点的元素的框图。如图所示,源代码评估节点可以包括网络接口电路1607(也称为网络接口),其被配置为提供与其他节点的通信。源代码评估节点还可以包括耦接到网络接口电路的处理电路1603(也称为处理器)、以及耦接到处理电路的存储器电路1605(也称为存储器)。存储器电路1605可以包括计算机可读程序代码,其在由处理电路1603执行时使处理电路执行根据本文公开的实施例的操作。根据其他实施例,处理电路1603可以被定义为包括存储器,从而不需要单独的存储器电路。
如本文所讨论,源代码评估节点的操作可以由处理电路1603和/或网络接口电路1607执行。例如,处理电路1603可以控制网络接口电路1607与一个或多个其他节点通信。此外,模块可以存储在存储器1605中,并且这些模块可以提供指令,使得当模块的指令由处理电路1603执行时,处理电路1603执行相应的操作(例如,下面关于图16讨论的操作)。
源代码不能由计算机架构中的处理器直接执行。存在编译器或解释器,它们是各种计算机程序,它们处理源代码并且将源代码翻译成更适合由计算机架构中的指令执行的低级编程语言(例如,汇编语言、目标代码或机器代码)。在编译源代码的过程中,存在几个中间步骤将源代码元素暴露给不同的过程,诸如词汇分析、解析、抽象语法树(AST)表示等。
在词汇分析中,通过丢弃源代码中的任何空白(whitespace)或注释,将源代码元素转换为一系列令牌。例如,在C语言中,下面给出的源代码元素(也称为一行源代码),
int a=5;//This is a comment!
产生以下令牌序列,
int(关键字)、a(标识符)、=(运算符)、5(常数)、;(符号)。
在解析过程中,在词汇分析中生成的令牌被转换为数据结构(主要是一种有根解析树或其他层次结构),该数据结构在基于上下文无关文法(CFG)的规则来检查语法是否正确的同时给出输入的结构表示。此步骤可以生成给定源代码元素的非二叉抽象语法树(AST)表示,它是一种基于词汇分析中提取的令牌的有根树形式的数据结构。例如,可以如图1中所示地提供上面给出的源代码元素的非二叉AST,图1示出了源代码元素“int a=5;//This is a comment!”的非二叉AST。
非二叉AST可能是源代码元素的有用表示,因为它包括与源代码元素相关的语法和语义信息。
可以出于多种原因检查源代码元素,原因中的一些包括漏洞检测或预测、源代码审查和完成、转换为另一种语言、综合、修复等。在漏洞检测方面,存在两种主要方法可以针对潜在漏洞(也称为缺陷(bug))对源代码元素进行一些分析。这些方法包括(i)静态代码分析和(ii)动态代码分析。在静态代码分析中,直接分析源代码元素而不执行它们,而在动态分析中,使用一组特定的输入来执行源代码元素,并且针对预期目标观察它们的行为。两种分析方法都有开源工具和商业工具。
另一方面,随着人工智能(AT)和机器学习(ML)技术的出现,关于如何利用AI/ML的高级功能来提供智能软件分析的趋势和研究活动日益增长。更具体地说,人们对通过使用AI/ML来在潜在软件漏洞被发布之前自动预测它们很感兴趣。
机器学习算法可以仅接受用于训练和开发模型目的的数值输入。验证和测试数据也应该是数值。然而,源代码元素大多是用高级编程语言编写的,包括不适合由ML算法和模型直接处理的形式的元素。因此,在馈入ML模型之前,可能需要根据本发明构思的一些实施例对源代码进行预处理。
文献中的大多数先前研究借用了自然语言处理(NLP)技术中的一些方法来处理用于ML应用的源代码元素,例如Russell等人在公开“使用深度表示学习的源代码中的自动漏洞检测(Automated Vulnerability Detection in Source Code Using DeepRepresentation Learning)”中(以下引用为参考文献[1])所讨论的。此类别中众所周知的方法之一是词袋(BoW),其中每个单词都用一个数值标记,然后计算每个单词和短语的出现次数以执行一些进一步的分析。然而,在这种方法中,源代码元素中的语义信息可能会丢失,因此这些方法可能无法很好地表征源代码元素。
用于源代码处理的另一种方法是使用源代码元素的非二叉AST表示,其是在编译器或词汇分析器/解析器中被令牌化之后的源代码元素的基于树的数据结构。非二叉AST在语义和语法信息方面都包含关于原始源代码元素的丰富信息。因此,非二叉AST表示可能对ML应用是有用的。然而,非二叉AST本身可能不适合直接供ML算法使用,因为它基于源代码元素的令牌。
利用ML技术进行软件分析的一个有希望的用例是漏洞预测。预测源代码元素中的潜在漏洞可能很有用,下面将更详细地讨论其潜在优势。诸如静态代码分析和动态代码分析等传统方法各有利弊。在静态代码分析工具中,使目标漏洞具有形式(formalized),并且定义规则来检测它们,这可能需要手工工程设计。然而,可能存在过多的误报,并且大多数静态分析工具可能无法检测到大多数关键漏洞。另一方面,动态分析可能需要运行源代码元素并且观察行为以检测一些漏洞,且因为可能难以尝试和测试所有可能的输入集,所以这可能很耗时和/或可能会失败。
有一些努力和趋势正在研究如何利用AI/ML技术在源代码元素发布之前预测它们的潜在漏洞。这可能很重要,因为某些漏洞可能会导致业务损失惨重。在这个领域,一个尚未完全解决的问题是如何适当地表示源代码元素以供ML算法使用。这可能是有用的/需要的,因为ML算法可能只接受数值数据来执行训练和测试任务。然而,源代码元素只是字符串,包括字母、字符、数字、运算符等。因此,可能无法直接将源代码输入到ML算法。
根据本发明构思的一些实施例,提供了将源代码元素转换为数值数组表示的方法,该数值数组表示使得能够利用机器学习技术对源代码执行智能分析。在此类方法中,首先经由解析器获得给定源代码元素的非二叉抽象语法树(AST)表示(它是基于所提取的令牌的树型数据结构)。然后,将获得的非二叉AST转换为完整二叉AST,其中除叶子之外的每个节点都有两个子节点。随后,这个完整的二叉抽象语法树结构中的节点被编码成预定义的数值(也称为数值键)以及与每个节点相关联的辅助数据。最后,取决于每个节点在二叉AST中的位置,通过将节点映射到数组中不可变的始终如一的位置(索引),将所得的以数值标记的二叉AST转换为数组。
此外,已经实施了提出的方法,并且已经执行实验以使用ML预测源代码元素中的漏洞。最初的实验结果似乎很有希望,并且表明所提出的源代码元素表示方法可能能够表征实验中考虑的一些/所有漏洞。
根据本发明构思的一些实施例,利用数据驱动技术(例如,AI/ML)直接对源代码元素执行智能分析,包括但不限于漏洞预测、代码审查、代码完成、综合、修复等。在本发明中给出了针对漏洞预测的用例以及实验结果。对于其他用例,可以通过检查源代码元素的AST来确定树中是否存在任何缺失部分。如果存在,则本文公开的模型可以提议哪些子节点可以被插入到缺失部分。此示例也可以应用于‘代码修复’用例。
根据本发明构思的一些实施例,一种独立于语言的方法被提供并且应用于任何高级编程语言。
根据本发明构思的一些实施例,通过为数据驱动技术(例如,AI/ML)铺平道路,减少/消除了针对领域专家和/或手工工程设计的执行特定分析的需要。例如,实验表明,即使不知道目标漏洞的详细信息,也可以执行漏洞预测。
根据本发明构思的一些实施例,可以根据预期目标来改进/优化对基于ML的模型和/或工具的开发。
根据本发明构思的一些实施例,提供了执行预测分析的方式。
根据本发明构思的一些实施例,可以在保留语义信息的同时提供给定源代码元素的数值矢量表示。
根据本发明构思的一些实施例,可以实现具有各种目标(例如,漏洞检测)的自动代码分析的执行。随着人工智能(AI)的兴起,存在一种趋势是利用机器学习(ML)和数据挖掘技术对源代码元素进行一些智能分析。例如,通过使用ML算法预先预测源代码元素中的潜在软件漏洞是一项重要的研究领域。然而,如何做到这一点尚不清楚,目前还没有用于此目的的最先进的方法。困难可能源于几个因素,诸如(i)缺乏用已识别漏洞准确地标记的有用且足够大的数据集,以及(ii)缺乏将源代码元素转换为可直接用来训练ML模型的有用数据格式的有效方法。事实上,本质上由自然形式的单词和短语组成的源代码元素可能不适合直接供ML模型使用,因为只能关于矢量或矩阵结构的数值数据来对ML算法进行训练和开发。在本发明中,提供了以下方法:将源代码元素翻译成包括数值(例如,仅包括数值)的有用矢量结构(这可能适合于直接供ML算法使用),同时尽可能多地保留关于原始源代码元素的语义和句法信息。此外,可以实施提出的方法,并且可以执行一些实验,目标是对包含用已知/某些漏洞类型标记的函数级源代码元素的大型公共数据集进行漏洞预测。因此,实验结果呈现出所提出的方法的可行性。
图2示出了根据本发明构思的一些实施例的方法的操作,并且这些操作也在图14的流程图中示出。
操作1(源代码):在操作1中,将要处理的源代码作为输入。源代码可以用任何高级编程语言编写。例如,图3示出了用C语言编写的样本/一段源代码,其中包括两个源代码元素。
操作2(函数级划分):在操作2中,程序或应用的源代码在源代码元素(也称为定义的源代码行和/或源代码函数)的数量方面可以任意长。因此,一个好的做法可能是将源代码分解为函数级源代码元素,以提高处理的粒度,并且在一定程度上减少/限制其大小。这可以手动完成或通过使用解析器自动完成。然后,在以下操作中分别处理每个源代码元素。在操作2之后,术语“源代码元素”在函数级源代码元素的意义下使用。图4A和图4B示出了从图3的原始源代码中提取两个源代码元素(函数级源代码元素)。
操作3(令牌化):在操作3中,可以首先通过移除源代码元素的不重要部分(诸如注释、空白、制表符、新行等等)来清理源代码元素(例如,图4A的主函数)。然后,源代码元素的剩余部分被转换为一系列令牌,其中令牌是可以被视为编程语言语法中的一个单元的文本字符序列。这可以通过使用专门为源代码语言开发的词汇分析器来实现。举例来说,图4A的主函数的令牌可以如下给出:int(关键字)、main(标识符)、LPAREN(分隔符)、RPAREN(分隔符)、=(运算符)、5(常数)、;(符号)……
操作4(非二叉AST生成):在操作4中,生成源代码元素的非二叉AST,可以使用专门为源代码语言开发的解析器来实现。非二叉AST包含有关源代码元素的丰富信息,在某种程度上包括语法和语义信息。应注意,非二叉AST中的节点可以具有任意数量的子节点,这可能会导致存在于非二叉AST的某个深度的节点数量难以/不可能被预先估计。在尝试将非二叉AST的节点映射到固定长度数组时,这可能是一个问题。解决此问题的方法在下面针对操作5讨论。图5示出了图4A的主函数源代码元素的非二叉AST。在该非二叉AST中,每个节点是对应于源代码元素的令牌中的一个的令牌节点,并且源代码元素的每个令牌可以在非二叉AST的相应节点中表示。
操作5(转换为完整的二叉AST):操作5对于能够将非二叉AST的元素(节点)始终如一地分配到固定长度数组中(如以下操作中所述)是重要的。在常规的非二叉AST中,节点可以具有任意数量的子节点,而二叉AST中的节点最多可以具有两个子节点,通常称为左子节点和右子节点。在操作5中,将常规的非二叉AST转换为完整二叉AST,其中所有叶子(也称为末端节点)具有相同的深度,并且所有内部节点(也称为非末端节点)的度数为2(意味着一个内部节点具有两个子节点)。可能存在许多替代方法可以将m-ary非二叉抽象语法树转换为二叉抽象语法树,并且可以在此操作中使用这些方法中的任何一种。例如,可以使用基于以下两个规则的方法将m-ary非二叉抽象语法树转换为对应的完整二叉抽象语法树:
1)将m-ary非二叉抽象语法树中的Node-x的最左子节点分配为对应的完整二叉抽象语法树中的Node-x的右子节点,并且
2)将m-ary非二叉抽象语法树中的Node-x的右同辈元素(sibling)分配为对应的完整二叉抽象语法树中的Node-x的左子节点。
如果Node-x(例如,对应于非二叉AST的节点并对应于源代码元素的令牌的二叉AST令牌节点)没有子节点,则其右子节点变为空值(称为二叉AST空节点),并且如果Node-x是其父节点的最右子节点,则其左子节点变为空值(称为二叉AST空节点)。图6A和图6B的示例示出了根据一些实施例将常规m-ary非二叉抽象语法树转换为完整的二叉抽象语法树。添加虚线空值节点(也称为二叉AST空节点)以提供完整的二叉抽象语法树。在这样完整的二叉AST中,每个层级i包括2i个节点,因此每个层级都是“完整的”。
作为示例,可以在操作4处提供图6A中所示的常规m-ary非二叉抽象语法树。
基于图6A的给定m-ary非二叉抽象语法树,可以在操作5处如图6B中所示地提供对应的完整二叉抽象语法树。
图6B因此示出了对应于图6A的样本常规非二叉抽象语法树的完整二叉抽象语法树。
如上所述,完整的二叉抽象语法树可能会呈指数增长,直到所有叶子都变为空值。然而,当二叉抽象语法树的深度增加时,这可能会导致数量巨大的子节点。因此,在一些实施例中,考虑深度达到阈值的二叉抽象语法树可能就足够了,该阈值可以基于性能要求来确定。在基于实验的研究中,深度为12的部分二叉抽象语法树可以充分代表整个二叉抽象语法树。通过对操作5的完整二叉AST的深度进行限制,可以固定完整二叉AST的大小(包括节点和层级的总数),而与对应的非二叉AST的大小无关,使得可以从完整的二叉AST中省略源代码元素的一个或多个令牌,和/或使得非二叉AST的非二叉令牌节点的数量超过完整二叉AST的二叉AST令牌节点的数量。
作为示例,图7A是图3、图4A和图4B中给出的函数‘main’的二叉AST。
图7A因此示出了图5中示出的常规非二叉AST的完整二叉AST。
在二叉AST中,令牌节点(在图7A中示出为椭圆形,也称为二叉AST令牌节点)对应于非二叉AST的令牌节点(也称为非二叉AST令牌节点)并对应于源代码元素的令牌,并且空节点(在图7A中示出为正方形,也称为二叉AST空节点)被用于提供每个层级i包括2i个节点且每个层级中的不是最后层级(层级n)的每个节点具有两个子节点。在深度为n的完整二叉AST中,二叉AST具有层级i=0,1,2,…n(对应深度0,1,2,…n),二叉AST的每个层级i包括2i个节点,层级i=0,1,2,…n-1的每个节点在下一层级具有2个子节点,二叉AST包括
Figure BDA0003788630760000121
个节点,并且数值数组表示(操作7)包括分别对应于二叉AST的
Figure BDA0003788630760000122
个节点的
Figure BDA0003788630760000123
个数值。
操作6(编码为数值):在获得的完整二叉AST中,节点以“FuncDef(函数定义)”、“Decl(声明)”、“TypeDecl(类型声明)”、“Constant(常数)”、“ID”等词语或文本字符串(对应于上面讨论的源代码元素的令牌)命名。这些名称被编码为数值,以允许ML算法对其进行处理。因此,可以将这些节点名称映射成预定数值,其中节点名称的每个数值可以提供为数值元组。在图7B的表格中作为示例示出了从令牌名称到数值元组的编码示例。
在这种编码中,编码后的数值元组中的第一个数字表示令牌的类型,而数值元组中的第二个数字和第三个数字可以用于提供可能存在于节点处的辅助信息。这种编码只是基于一个实施例的示例。应注意,令牌以及编码后的数值可能因编程语言而异。
操作7(数值数组表示):操作7可以是最终操作。应注意,在完整的二叉抽象语法树中,每个深度(层级)可存在的节点数量可以是确定的。例如,层级1处最多可以存在2个节点,层级2处最多可以存在4个节点,层级3处最多可以存在8个节点,层级4处最多可以存在16个节点等。每个层级处可以存在的节点数量以2的幂增加。因此,在深度k处,最多可以存在2k个节点。这种确定性允许创建固定长度的数值数组表示,其中可以将元素的索引始终如一地分配给二叉AST中的节点,如图8A中所示,其中图8A示出了将二叉抽象语法树数据结构转换为数值数组表示。
图4A中给出的主函数(再现为图8B)被转换为图8C的数值数组表示。
图8C示出了给定函数的源代码元素的数值数组表示,直到深度10为止。通过为二叉AST选择深度10(即,n=10),二叉AST将具有2047个节点,计算为
Figure BDA0003788630760000131
更一般地,节点数量N可以计算为:
Figure BDA0003788630760000132
其中:N是二叉AST的节点数,n是二叉AST的深度,并且i表示从0到n的每个层级。
根据本发明构思的一些实施例,这种数值数组表示的一个优点是数值数组表示的每个特定索引(位置)表示/保存了特征(与对应二叉AST的节点相对应),并且这些索引始终与二叉AST中的相同节点相关联。这可以允许将二叉AST中的语义信息传输到数值数组表示,这可以是用于在不同源代码元素的二叉AST之间进行比较以及提取节点之间的模式和隐藏关系的有用属性。
根据一些实施例,用例可以提供源代码的漏洞预测。
为了表明所提出的方法对于使用ML技术对源代码元素执行智能分析是可行和有用的,实施了所提出的方法并且进行了实验,目的是预测给定源代码元素中的某些漏洞。为此,使用了公共数据集(在参考文献[1]中作为Draper VDISC数据集给出),该公共数据集包含相对大量的函数级源代码元素,这些源代码元素标记有5种不同类别的漏洞。此数据集中的源代码元素是从Debian Linux发行版、GitHub上的Git存储库和NIST的Samate项目的SATE IV Juilet测试套件中提取的,然后被进行静态工具分析并且由安全专家进行调查,以标记它们是否包括预定义的某些漏洞。下文关于图9描述了调查的漏洞。
图9示出了在实验工作中调查的漏洞类型(各自涉及常见弱点枚举或CWE)以及每类中的样本数量。
根据一些实施例的方法是使用神经网络模型来实施的。然后,对(i)平衡数据集(即在训练和测试集中包含相同数量的正负样本)和(ii)不平衡数据集(即数据集中正样本的数量高于负样本的数量,或反之亦然)二者执行了两个不同的性能评估测试。在以下公开中呈现实验结果。
下文关于图10和图11讨论平衡数据集的性能评估。
在此部分中,从上面引用的原始数据集中提取平衡子集,其细节在图10中给出。图10提供了通过对原始数据集进行欠采样获得的平衡数据集中正负样本的数量。图11提供了根据本发明构思的一些实施例对平衡数据集进行测试的ML(神经网络)实现方式的真正率和假正率。
如图11中所示,与无技能(随机决策)相比,对于所有类别,训练模型表现良好,即使这些是未调整超参数以改进/优化模型的初始结果。这些结果表明,所提出的源代码表示方法在对源代码进行漏洞预测的用例中可能非常有用。
关于图12和图13讨论了对不平衡数据集的性能评估。
在此部分中,利用图12中给出的细节来使用原始数据集的子集。图12提供了不平衡数据集中正样本和负样本的数量。图13提供了针对在不平衡数据集上测试的不同类别的精确性回调曲线。
图13示出了不同类别的分别的精确性回调(PR)曲线。还存在潜在的f1分数曲线。在解释此附图时,应该考虑正负样本的比例,因为它决定了基线。
根据本发明构思的一些实施例,提供了用于机器学习应用的源代码表示方法。
根据本发明构思的一些实施例,提供了将源代码元素翻译成数值数组表示的方法。
根据本发明构思的一些实施例,提供了在馈送到ML实现方式之前预处理源代码元素的方法。
根据本发明构思的一些实施例,提供了直接对源代码元素执行智能分析的方法。
根据本发明构思的一些实施例,提供了直接从源代码元素提供漏洞预测的方法。
根据本发明构思的一些实施例,提供了无需任何领域专家或手工工程设计即可提供自动化源代码分析的方法。
根据本发明构思的一些实施例,提供了将在源代码元素的词汇分析中识别出的令牌编码为数值的方法。
根据本发明构思的一些实施例,提供了将源代码元素的二叉AST表示编码为数值数组表示的方法。
现在将根据本发明构思的一些实施例参考图16的流程图来讨论源代码评估节点1600(使用图15的结构来实现)的操作。例如,模块可以存储在图15的存储器1605中,并且这些模块可以提供指令,使得当模块的指令由处理电路1603执行时,处理电路1603执行流程图的相应操作。
在框1701处,处理电路1603提供编程语言(例如,高级编程语言)的源代码,其中源代码包括多个源代码元素。例如,框1701的操作可以如上文关于图14的操作1所讨论的那样执行。
在框1705处,处理电路1603从源代码的该多个源代码元素中选择第一源代码元素(例如,函数级源代码元素)。根据一些实施例,第一源代码元素可以包括字母、字符、数字和运算符。例如,框1705的操作可以如上文关于图14的操作2所讨论的那样执行。
在框1709处,处理电路1603基于第一源代码元素生成第一多个令牌,其中第一多个令牌中的每个令牌包括文本字符序列。根据一些实施例,可以基于对第一源代码元素的词汇分析来生成第一多个令牌。例如,框1709的操作可以如上文关于图14的操作3所讨论的那样执行。
根据一些实施例,在框1711处,处理电路1603可以基于第一源代码元素的第一多个令牌来生成第一源代码元素的非二叉抽象语法树(AST)表示。该非二叉AST表示可以包括非二叉AST令牌节点,并且非二叉AST令牌节点中的每一个可以基于第一源代码元素的第一多个令牌中的相应一个。根据此类实施例,可以基于框1711的非二叉AST表示来生成框1715的二叉AST表示,并且二叉AST令牌节点中的每一个可以对应于非二叉AST令牌节点中的相应一个。在此类实施例中,非二叉AST令牌节点的数量可以超过二叉AST令牌节点的数量。例如,框1711的操作可以如上文关于图14的操作4所讨论的那样执行。
在框1715处,处理电路1603基于第一源代码元素的第一多个令牌生成第一源代码元素的第一二叉抽象语法树(AST)表示,其中第一二叉AST表示包括第一多个二叉AST节点,第一多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中第一二叉AST表示的二叉AST令牌节点中的每一个基于第一源代码元素的第一多个令牌中的相应一个。例如,框1715的操作可以如上文关于图14的操作5所讨论的那样执行。
根据一些实施例,基于源代码的第一多个令牌的数量可以超过第一二叉AST表示的二叉AST令牌节点的数量。例如,二叉AST表示可以具有深度n,二叉AST表示可以具有层级i=0,1,2,…n,二叉AST表示的每个层级i可以包括2i个节点,层级i=0,1,2,…n-1的每个节点在下一层级可以具有2个子节点,二叉AST表示可以包括
Figure BDA0003788630760000161
个节点,数值数组表示可以包括分别对应于二叉AST表示的
Figure BDA0003788630760000162
个节点的
Figure BDA0003788630760000163
个数值。因此,可以从二叉AST表示中省略基于第一源代码元素生成的第一多个令牌中的至少一个。
在框1719处,处理电路1603将二叉AST令牌节点和二叉AST空节点中的每一个编码为相应数值(例如,数值元组)。例如,框1719的操作可以如上文关于图14的操作6所讨论的那样执行。
在框1721处,处理电路1603基于第一二叉AST表示生成第一源代码元素的第一数值数组表示,其中基于相应二叉AST令牌节点和二叉AST空节点在第一二叉AST表示中的相应位置,将该二叉AST令牌节点和二叉AST空节点的第一数值映射到第一数值数组表示中的位置。例如,框1721的操作可以如上文关于图14的操作7所讨论的那样执行。
可以在框1725处针对源代码的每个源代码元素重复框1705、1709、1711、1715、1719和/或1721的操作。在框1725处,处理电路1603可以确定是否已经为源代码的所有源代码元素生成了数值数组表示,如果没有,则可以针对源代码的下一个源代码元素重复框1705、1709、1711、1715、1719和/或1721的操作,如下所述。
根据一些实施例,在框1705处,处理电路1603可以从源代码的该多个源代码元素中选择第二源代码元素。
根据一些实施例,在框1709处,处理电路1603可以基于第二源代码元素生成第二多个令牌,其中第二多个令牌中的每个令牌包括文本字符序列。
根据一些实施例,在框1711处,处理电路1603可以基于第二源代码元素的第二多个令牌生成第二源代码元素的第二非二叉抽象语法树(AST)表示。第二非二叉AST表示可以包括非二叉AST令牌节点,并且第二非二叉AST表示的非二叉AST令牌节点中的每一个可以基于第二源代码元素的第二多个令牌中的相应一个。
根据一些实施例,在框1715处,处理电路1603可以基于第二源代码元素的第二多个令牌生成第二源代码元素的第二二叉抽象语法树(AST)表示,其中第二二叉AST包括第二多个二叉AST节点,第二多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中第二二叉AST的二叉AST令牌节点中的每一个基于第二源代码元素的第二多个令牌中的相应一个。根据此类实施例,可以基于框1711的第二非二叉AST表示生成框1715的第二二叉AST表示,并且第二二叉AST表示的二叉AST令牌节点中的每一个可以对应于非二叉AST令牌节点中的相应一个。在此类实施例中,第二非二叉AST表示的非二叉AST令牌节点的数量可以超过第二二叉AST表示的二叉AST令牌节点的数量。
根据一些实施例,在框1719处,处理电路1603可以将第二多个二叉AST节点的令牌节点和空节点中的每一个编码为相应数值。
根据一些实施例,在框1721处,处理电路1603可以基于第二二叉AST表示生成第二源代码元素的第二数值数组表示,其中基于第二多个二叉AST节点的相应令牌节点和空节点在第二二叉AST表示中的相应位置,将该令牌节点和空节点的数值映射到第二数值数组表示中的位置。
根据框1725处的一些实施例,处理电路1603可以确定是否已经为源代码的所有源代码元素生成了数值数组表示。如果不是,则可以在框1725处针对源代码的下一个源代码元素重复框1705、1709、1711、1715、1719和/或1721的操作。否则,在框1729处,处理电路1603可以使用机器学习(ML)模型基于各个源代码元素的一个或多个数值数组表示来评估源代码,其中ML模型基于源代码元素的数据集。
根据一些实施例,框1729的评估可以包括使用ML模型预测源代码的软件漏洞、检测源代码的漏洞、识别源代码中的错误、和/或校正源代码中的错误中的一项或多项,其中ML模型基于源代码元素的数据集并基于以下至少一项:与该数据集的源代码元素相对应的对应的相应漏洞、和/或与该数据集的源代码元素相对应的相应错误。
根据一些实施例,处理电路可以使用ML模型来评估每个源代码元素的每个数值数组表示。例如,处理电路1603可以使用第一数值数组表示和ML模型来评估第一源代码元素,以预测第一源代码元素的软件漏洞、检测第一源代码元素的漏洞、识别第一源代码元素中的错误、和/或校正第一源代码元素中的错误,并且处理电路1603可以使用第二数值数组表示和ML模型来评估第二源代码元素,以预测第二源代码元素的软件漏洞、检测第二源代码元素的漏洞、识别第二源代码元素中的错误、和/或校正第二源代码元素中的错误。
如图16中所示,在框1729处使用数值数组表示来评估源代码之前,可以为源代码的所有源代码元素生成数值数组表示。根据一些其他实施例,每个源代码元素可以在为下一个源代码元素生成下一个数值数组表示之前,使用相应的数值数组表示来评估(例如,在框1721与框1725之间移动框1729)。
根据一些实施例,处理电路1603可以生成指示以下至少一项的输出(例如,要在视频显示器上呈现的输出):第一源代码元素的预测出的软件漏洞、第一源代码元素的检测出的漏洞、第一源代码元素中的错误、和/或对第一源代码元素的校正。根据一些实施例,处理电路1603可以响应于在框1729处评估第一源代码元素而自动生成(无需用户干预)第一源代码元素的校正版本,并且处理电路1603可以将第一源代码元素的校正版本保存在存储器1605中。根据一些实施例,响应于在框1729处评估第一源代码元素,处理电路1603可以自动生成(无需用户干预)第一源代码元素的校正版本,并且处理电路1603可以将包括第一源代码元素的校正版本的源代码的修正版本保存在存储器1605中。
来自图16的流程图的各种操作对于源代码评估节点和相关方法的一些实施例可以是可选的。例如,关于一些实施例的方法,图16的框1711、1725和/或1729的操作可以是可选的。
下面提供附加的解释。
通常,本文中使用的所有术语都应根据它们在相关技术领域中的普通含义进行解释,除非明确给出和/或从使用它的上下文中暗示不同的含义。除非另有明确说明,否则所有对一/一个/该元件、设备、组件、装置、步骤等的引用都应公开解释为指代该元件、设备、组件、装置、步骤等的至少一个实例。本文所公开的任何方法的步骤不必以所公开的确切顺序执行,除非一个步骤被明确地描述为在另一个步骤之后或之前和/或其中暗示一个步骤必须在另一个步骤之后或之前。只要合适,本文公开的任何实施例的任何特征都可以应用于任何其他实施例。同样,任何实施例的任何优点都可以应用于任何其他实施例,反之亦然。所附实施例的其他目的、特征和优点将从以下描述中显而易见。
已经参考附图描述了本文设想的一些实施例。然而,其他实施例包含在本文所公开的主题的范围内,所公开的主题不应被解释为仅限于本文所阐述的实施例;更确切而言,这些实施例以示例的方式提供以向本领域技术人员传达主题的范围。
在本发明构思的各种实施例的上述描述中,应理解,本文使用的术语仅用于描述特定实施例的目的,并不旨在限制本发明构思。除非另有定义,否则本文使用的所有术语(包括技术和科学术语)具有与本发明构思所属领域的普通技术人员通常理解的相同含义。将进一步理解,诸如在常用字典中定义的术语应被解释为具有与其在本说明书和相关技术的上下文中的含义一致的含义,并且不会以理想化或过于正式的意义来解释,除非本文明确如此定义。
当一个元件被称为“连接”、“耦接”、“响应”或其变体到另一个元件时,它可以直接连接、耦接或响应于另一个元件,或者可以存在中间元件。相反,当一个元件被称为“直接连接”、“直接耦接”、“直接响应”或其变体到另一个元件时,不存在中间元件。相同的数字始终指代相同的元件。此外,本文使用的“耦接”、“连接”、“响应”或其变体可以包括无线耦接、连接或响应。如本文所使用,单数形式“一”、“一个”和“该”旨在也包括复数形式,除非上下文另有明确指示。为了简洁和/或清楚起见,可能不会详细描述众所周知的功能或结构。术语“和/或”(缩写为“/”)包括一个或多个相关列出的项目的任何和所有组合。
应当理解,尽管术语第一、第二、第三等可以在本文中用于描述各种元件/操作,但是这些元件/操作不应受这些术语的限制。这些术语仅用于将一个元件/操作与另一个元件/操作区分开来。因此,在不脱离本发明构思的教导的情况下,在一些实施例中的第一元件/操作在其他实施例中可以被称为第二元件/操作。在整个说明书中,相同的元件符号或相同的附图标记表示相同或相似的元件。
如本文所使用,术语“包括”、“包含”、“具有”或其变体是开放的,并且包括一个或多个陈述的特征、整数、元件、步骤、组件或功能,但不排除存在或添加一个或多个其他特征、整数、元件、步骤、组件、功能或它们的组。此外,如本文所使用,源自拉丁短语“exempligratia”的通用缩写“e.g.”可以用于介绍或指定前述项目的一个或多个一般示例,并且不旨在限制这样的项目。源自拉丁短语“id est”的常见缩写“i.e”可以用于从更一般的阐述中指定特定项目。
在本文中参考计算机实现的方法、装置(系统和/或设备)和/或计算机程序产品的框图和/或流程图来描述示例实施例。应当理解,框图和/或流程图图示的框,以及框图和/或流程图图示中的框的组合,可以通过由一个或多个计算机电路执行的计算机程序指令来实现。可以将这些计算机程序指令提供给通用计算机电路、专用计算机电路和/或其他可编程数据处理电路的处理器电路以产生机器,使得经由计算机的处理器和/或其他可编程数据处理设备执行的指令转换和控制晶体管、存储在存储器位置中的值以及此类电路中的其他硬件组件,以实现框图和/或流程图的一个或多个框中指定的功能/动作,从而创建装置(功能)和/或结构,用于实现框图和/或流程图的框中指定的功能/动作。
这些计算机程序指令也可以存储在有形的计算机可读介质中,该计算机可读介质介质可以引导计算机或其他可编程数据处理装置以特定方式运行,使得存储在计算机可读介质中的指令产生包括执行框图和/或流程图的一个或多个框中指定的功能/动作的指令的制品。因此,本发明构思的实施例可以具体实施在硬件和/或软件(包括固件、常驻软件、微代码等)中,该软件在诸如数字信号处理器之类的处理器上运行,这些处理器可以统称为“电路”、“模块”或其变体。
还应该注意,在一些替代实现方式中,框中注明的功能/动作可能不按流程图中注明的顺序发生。例如,取决于所涉及的功能/动作,连续显示的两个框实际上可以基本上同时执行,或者这些框有时可以以相反的顺序执行。此外,流程图和/或框图的给定框的功能可以被分成多个框和/或流程图和/或框图的两个或更多个框的功能可以至少部分地一体化。最后,在不脱离本发明构思的范围的情况下,可以在所示的框之间添加/插入其他框,和/或可以省略框/操作。此外,虽然一些图包括通信路径上的箭头以显示通信的主要方向,但应理解通信可以在与所描绘的箭头相反的方向上发生。
在基本上不脱离本发明构思的原理的情况下,可以对实施例进行许多变化和修改。所有这些变化和修改旨在包括在本发明构思的范围内。因此,以上公开的主题被认为是说明性的,而不是限制性的,并且实施例的示例旨在覆盖落入本发明构思的精神和范围内的所有此类修改、增强和其他实施例。因此,在法律允许的最大范围内,本发明构思的范围应由对本发明的最广泛允许的解释确定,包括实施例的示例及其等效物,而不应受前述具体实施方式的约束或限制。
下面提供对本发明中使用的各种缩写/首字母缩略词的解释。
缩写 说明
AI 人工智能
AST 抽象语法树
BoW 词袋
CWE 常见弱点枚举
ML 机器学习
NLP 自然学习处理
PR 精确性回调
参考文献如下。
参考文献[1]Russell,Rebecca&Kim,Louis&Hamilton,Lei&Lazovich,Tomo&Harer,Jacob&Ozdemir,Onur&Ellingwood,Paul&McConley,Marc.(2018).AutomatedVulnerability Detection in Source Code Using Deep RepresentationLearning.757-762.10.1109/ICMLA.2018.00120。

Claims (38)

1.一种提供对编程语言的源代码进行评估的方法,所述方法包括:
提供(1701)所述编程语言的所述源代码,其中所述源代码包括多个源代码元素;
从所述源代码的所述多个源代码元素中选择(1705)源代码元素;
基于所述源代码元素生成(1709)多个令牌,其中所述多个令牌中的每个令牌包括文本字符序列;
基于所述源代码元素的所述多个令牌生成(1715)所述源代码元素的二叉抽象语法树AST表示,其中所述二叉AST表示包括多个二叉AST节点,所述多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中所述二叉AST令牌节点中的每一个基于所述源代码元素的所述多个令牌中的相应一个;
将所述二叉AST令牌节点和所述二叉AST空节点中的每一个编码(1719)为相应数值;以及
基于所述二叉AST表示生成(1721)所述源代码元素的数值数组表示,其中基于相应二叉AST令牌节点和二叉AST空节点在所述二叉AST表示中的相应位置,将该二叉AST令牌节点和二叉AST空节点的数值映射到所述数值数组表示中的位置。
2.根据权利要求1所述的方法,还包括:
基于所述源代码元素的所述多个令牌生成(1711)所述源代码元素的非二叉抽象语法树AST表示,其中所述非二叉AST表示包括非二叉AST令牌节点,其中所述非二叉AST令牌节点中的每一个基于所述源代码元素的所述多个令牌中的相应一个;
其中生成所述二叉AST表示包括基于所述非二叉AST表示生成所述二叉AST表示,并且其中所述二叉AST令牌节点中的每一个对应于所述非二叉AST令牌节点中的相应一个。
3.根据权利要求2所述的方法,其中所述非二叉AST令牌节点的数量超过所述二叉AST令牌节点的数量。
4.根据权利要求1至3中任一项所述的方法,其中基于所述源代码的多组所述多个令牌中的每一组超过所述二叉AST令牌节点的数量。
5.根据权利要求1至4中任一项所述的方法,其中所述二叉AST表示具有深度n,其中所述二叉AST表示具有层级i=0,1,2,…n,其中所述二叉AST表示的每个层级i包括2i个节点,其中层级i=0,1,2,…n-1的每个节点在下一层级具有2个子节点,其中所述二叉AST表示包括
Figure FDA0003788630750000021
个节点,并且其中所述数值数组表示包括分别对应于所述二叉AST表示的所述
Figure FDA0003788630750000022
个节点的
Figure FDA0003788630750000023
个数值。
6.根据权利要求5所述的方法,其中从所述二叉AST表示中省略基于所述源代码元素生成的所述多个令牌中的至少一个。
7.根据权利要求1至6中任一项所述的方法,其中生成所述多个令牌包括基于对所述源代码元素的词汇分析生成所述多个令牌。
8.根据权利要求1至7中任一项所述的方法,其中所述源代码元素包括字母、字符、数字和运算符。
9.根据权利要求1至8中任一项所述的方法,其中对于所述二叉AST令牌节点中的每一个,所述相应数值包括数值元组。
10.根据权利要求1至9中任一项所述的方法,还包括:
使用机器学习ML模型基于所述源代码元素的所述数值数组表示来评估(1729)所述源代码,其中所述ML模型基于源代码元素的数据集。
11.根据权利要求10所述的方法,其中评估包括以下至少一项:使用所述ML模型预测所述源代码的软件漏洞、检测所述源代码的漏洞、识别所述源代码中的错误、和/或校正所述源代码中的错误,其中所述ML模型基于所述源代码元素的数据集并基于以下至少一项:与所述数据集的源代码元素相对应的对应的相应漏洞、和/或与所述数据集的源代码元素相对应的相应错误。
12.根据权利要求10至11中任一项所述的方法,其中所述源代码元素是第一源代码元素,其中所述多个令牌是第一多个令牌,其中所述二叉AST表示是第一二叉AST表示,并且其中所述多个二叉AST节点是第一多个二叉AST节点,所述方法还包括:
从所述源代码的所述多个源代码元素中选择(1705)第二源代码元素;
基于所述第二源代码元素生成(1709)第二多个令牌,其中所述第二多个令牌中的每个令牌包括文本字符序列;
基于所述第二源代码元素的所述第二多个令牌生成(1715)所述第二源代码元素的第二二叉抽象语法树AST表示,其中所述第二二叉AST表示包括第二多个二叉AST节点,所述第二多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中所述第二二叉AST表示的二叉AST令牌节点中的每一个基于所述第二源代码元素的所述第二多个令牌中的相应一个;
将所述第二多个二叉AST节点的令牌节点和空节点中的每一个编码(1719)为相应数值;以及
基于所述第二二叉AST表示生成(1721)所述第二源代码元素的第二数值数组表示,其中基于所述第二多个节点中的相应令牌节点和空节点在所述第二二叉AST表示中的相应位置,将该令牌节点和空节点的数值映射到所述第二数值数组表示中的位置;
其中评估所述源代码包括基于所述第一源代码元素的第一数值数组表示和所述第二源代码元素的所述第二数值数组表示来评估所述源代码。
13.一种源代码评估节点(1600),适用于:
提供编程语言的源代码,其中所述源代码包括多个源代码元素;
从所述源代码的所述多个源代码元素中选择源代码元素;
基于所述源代码元素生成多个令牌,其中所述多个令牌中的每个令牌包括文本字符序列;
基于所述源代码元素的所述多个令牌生成所述源代码元素的二叉抽象语法树AST表示,其中所述二叉AST表示包括多个二叉AST节点,所述多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中所述二叉AST令牌节点中的每一个基于所述源代码元素的所述多个令牌中的相应一个;
将所述二叉AST令牌节点和二叉AST空节点中的每一个编码为相应数值;以及
基于所述二叉AST表示生成所述源代码元素的数值数组表示,其中基于相应二叉AST令牌节点和二叉AST空节点在所述二叉AST表示中的相应位置,将该二叉AST令牌节点和二叉AST空节点的数值映射到所述数值数组表示中的位置。
14.根据权利要求13所述的源代码评估节点(1600),其中所述源代码评估节点(1600)还适用于:
基于所述源代码元素的所述多个令牌生成所述源代码元素的非二叉抽象语法树AST表示,其中所述非二叉AST表示包括非二叉AST令牌节点,其中所述非二叉AST令牌节点中的每一个基于所述源代码元素的所述多个令牌中的相应一个;
其中生成所述二叉AST表示包括基于所述非二叉AST表示生成所述二叉AST表示,并且其中所述二叉AST令牌节点中的每一个对应于所述非二叉AST令牌节点中的相应一个。
15.根据权利要求14所述的源代码评估节点(1600),其中所述非二叉AST令牌节点的数量超过所述二叉AST令牌节点的数量。
16.根据权利要求13至15中任一项所述的源代码评估节点(1600),其中基于所述源代码的多组所述多个令牌中的每一组超过所述二叉AST令牌节点的数量。
17.根据权利要求13至16中任一项所述的源代码评估节点(1600),其中所述二叉AST表示具有深度n,其中所述二叉AST表示具有层级i=0,1,2,…n,其中所述二叉AST表示的每个层级i包括2i个节点,其中层级i=0,1,2,…n-1的每个节点在下一层级具有2个子节点,其中所述二叉AST表示包括
Figure FDA0003788630750000041
个节点,并且其中所述数值数组表示包括分别对应于所述二叉AST表示的所述
Figure FDA0003788630750000042
个节点的
Figure FDA0003788630750000043
个数值。
18.根据权利要求17所述的源代码评估节点(1600),其中基于所述源代码元素生成的所述多个令牌中的至少一个被从所述二叉AST表示中省略。
19.根据权利要求13至18中任一项所述的源代码评估节点(1600),其中生成所述多个令牌包括基于对所述源代码元素的词汇分析生成所述多个令牌。
20.根据权利要求13至19中任一项所述的源代码评估节点(1600),其中所述源代码元素包括字母、字符、数字和运算符。
21.根据权利要求13至20中任一项所述的源代码评估节点(1600),其中对于所述二叉AST令牌节点中的每一个,所述相应数值包括数值元组。
22.根据权利要求13至21中任一项所述的源代码评估节点(1600),其中所述源代码评估节点(1600)还适用于:
使用机器学习ML模型基于所述源代码元素的所述数值数组表示来评估所述源代码,其中所述ML模型基于源代码元素的数据集。
23.根据权利要求22所述的源代码评估节点(1600),其中评估包括以下至少一项:使用所述ML模型预测所述源代码的软件漏洞、检测所述源代码的漏洞、识别所述源代码中的错误、和/或校正所述源代码中的错误,其中所述ML模型基于所述源代码元素的数据集并基于以下至少一项:与所述数据集的源代码元素相对应的对应的相应漏洞、和/或与所述数据集的源代码元素相对应的相应错误。
24.根据权利要求22至23中任一项所述的源代码评估节点(1600),其中所述源代码元素是第一源代码元素,其中所述多个令牌是第一多个令牌,其中所述二叉AST表示是第一二叉AST表示,并且其中所述多个节点是第一多个节点,并且其中所述源代码评估节点(1600)还适用于:
从所述源代码的所述多个源代码元素中选择第二源代码元素;
基于所述第二源代码元素生成第二多个令牌,其中所述第二多个令牌中的每个令牌包括文本字符序列;
基于所述第二源代码元素的所述第二多个令牌生成所述第二源代码元素的第二二叉抽象语法树AST表示,其中所述第二二叉AST表示包括第二多个二叉AST节点,所述第二多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中所述第二二叉AST表示的二叉AST令牌节点中的每一个基于所述第二源代码元素的所述第二多个令牌中的相应一个;
将所述第二多个二叉AST节点的令牌节点和空节点中的每一个编码为相应数值;以及
基于所述第二二叉AST表示生成所述第二源代码元素的第二数值数组表示,其中基于所述第二多个节点中的相应令牌节点和空节点在所述第二二叉AST表示中的相应位置,将该令牌节点和空节点的数值映射到所述第二数值数组表示中的位置;
其中评估所述源代码包括基于所述第一源代码元素的第一数值数组表示和所述第二源代码元素的所述第二数值数组表示来评估所述源代码。
25.一种源代码评估节点(1600),包括:
处理电路(1603);以及
与所述处理电路耦接的存储器(1605),其中所述存储器包括在由所述处理电路执行时使所述源代码评估节点(1600)进行以下操作的指令:
提供编程语言的源代码,其中所述源代码包括多个源代码元素,
从所述源代码的所述多个源代码元素中选择源代码元素,
基于所述源代码元素生成多个令牌,其中所述多个令牌中的每个令牌包括文本字符序列,
基于所述源代码元素的所述多个令牌生成所述源代码元素的二叉抽象语法树AST表示,其中所述二叉AST表示包括多个二叉AST节点,所述多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中所述二叉AST令牌节点中的每一个基于所述源代码元素的所述多个令牌中的相应一个,
将所述二叉AST令牌节点和二叉AST空节点中的每一个编码为相应数值,以及
基于所述二叉AST表示生成所述源代码元素的数值数组表示,其中基于相应二叉AST令牌节点和二叉AST空节点在所述二叉AST表示中的相应位置,将该二叉AST令牌节点和二叉AST空节点的数值映射到所述数值数组表示中的位置。
26.根据权利要求25所述的源代码评估节点(1600),其中所述存储器还包括在由所述处理电路执行时使所述源代码评估节点(1600)进行以下操作的指令:
基于所述源代码元素的所述多个令牌生成所述源代码元素的非二叉抽象语法树AST表示,其中所述非二叉AST表示包括非二叉AST令牌节点,其中所述非二叉AST令牌节点中的每一个基于所述源代码元素的所述多个令牌中的相应一个;
其中生成所述二叉AST表示包括基于所述非二叉AST表示生成所述二叉AST表示,并且其中所述二叉AST令牌节点中的每一个对应于所述非二叉AST令牌节点中的相应一个。
27.根据权利要求26所述的源代码评估节点(1600),其中所述非二叉AST令牌节点的数量超过所述二叉AST令牌节点的数量。
28.根据权利要求25至27中任一项所述的源代码评估节点(1600),其中基于所述源代码的多组所述多个令牌中的每一组超过所述二叉AST令牌节点的数量。
29.根据权利要求25至28中任一项所述的源代码评估节点(1600),其中所述二叉AST表示具有深度n,其中所述二叉AST表示具有层级i=0,1,2,…n,其中所述二叉AST表示的每个层级i包括2i个节点,其中层级i=0,1,2,…n-1的每个节点在下一层级具有2个子节点,其中所述二叉AST表示包括
Figure FDA0003788630750000071
个节点,并且其中所述数值数组表示包括分别对应于所述二叉AST表示的所述
Figure FDA0003788630750000072
个节点的
Figure FDA0003788630750000073
个数值。
30.根据权利要求29所述的源代码评估节点(1600),其中基于所述源代码元素生成的所述多个令牌中的至少一个被从所述二叉AST中省略。
31.根据权利要求25至30中任一项所述的源代码评估节点(1600),其中生成所述多个令牌包括基于对所述源代码元素的词汇分析生成所述多个令牌。
32.根据权利要求25至31中任一项所述的源代码评估节点(1600),其中所述源代码元素包括字母、字符、数字和运算符。
33.根据权利要求25至32中任一项所述的源代码评估节点(1600),其中对于所述二叉AST令牌节点中的每一个,所述相应数值包括数值元组。
34.根据权利要求25至33中任一项所述的源代码评估节点(1600),其中所述存储器还包括在由所述处理电路执行时使所述源代码评估节点(1600)进行以下操作的指令:
使用机器学习ML模型基于所述源代码元素的所述数值数组表示来评估所述源代码,其中所述ML模型基于源代码元素的数据集。
35.根据权利要求34所述的源代码评估节点(1600),其中评估包括以下至少一项:使用所述ML模型预测所述源代码的软件漏洞、检测所述源代码的漏洞、识别所述源代码中的错误、和/或校正所述源代码中的错误,其中所述ML模型基于所述源代码元素的数据集并基于以下至少一项:与所述数据集的源代码元素相对应的对应的相应漏洞、和/或与所述数据集的源代码元素相对应的相应错误中的至少一个。
36.根据权利要求34至35中任一项所述的源代码评估节点(1600),其中所述源代码元素是第一源代码元素,其中所述多个令牌是第一多个令牌,其中所述二叉AST表示是第一二叉AST表示,并且其中所述多个节点是第一多个节点,并且其中所述存储器还包括在由所述处理电路执行时使所述源代码评估节点(1600)进行以下操作的指令,
从所述源代码的所述多个源代码元素中选择第二源代码元素;
基于所述第二源代码元素生成第二多个令牌,其中所述第二多个令牌中的每个令牌包括文本字符序列;
基于所述第二源代码元素的所述第二多个令牌生成所述第二源代码元素的第二二叉抽象语法树AST表示,其中所述第二二叉AST表示包括第二多个二叉AST节点,所述第二多个二叉AST节点包括二叉AST令牌节点和二叉AST空节点,其中所述第二二叉AST表示的二叉AST令牌节点中的每一个基于所述第二源代码元素的所述第二多个令牌中的相应一个;
将所述第二多个二叉AST节点的令牌节点和空节点中的每一个编码为相应数值;以及
基于所述第二二叉AST表示生成所述第二源代码元素的第二数值数组表示,其中基于所述第二多个节点中的相应令牌节点和空节点在所述第二二叉AST表示中的相应位置,将该相应令牌节点和空节点的数值映射到所述第二数值数组表示中的位置;
其中评估所述源代码包括基于所述第一源代码元素的第一数值数组表示和所述第二源代码元素的所述第二数值数组表示来评估所述源代码。
37.一种计算机程序,包括要由源代码评估节点(1600)的处理电路(1603)执行的程序代码,由此所述程序代码的执行使所述源代码评估节点(1600)执行根据权利要求1至12中任一项所述的操作。
38.一种计算机程序产品,包括非暂时性存储介质,所述非暂时性存储介质包括要由源代码评估节点(1600)的处理电路(1603)执行的程序代码,由此所述程序代码的执行使所述源代码评估节点(1600)执行根据权利要求1至12中任一项所述的操作。
CN202080096065.4A 2020-02-10 2020-02-10 使用源代码元素的数值数组表示来评估源代码的方法 Pending CN115066674A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211442539.3A CN115935369A (zh) 2020-02-10 2020-02-10 使用源代码元素的数值数组表示来评估源代码的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/EP2020/053335 WO2021160242A1 (en) 2020-02-10 2020-02-10 Methods of evaluating source code using numeric array representations of source code elements

Related Child Applications (1)

Application Number Title Priority Date Filing Date
CN202211442539.3A Division CN115935369A (zh) 2020-02-10 2020-02-10 使用源代码元素的数值数组表示来评估源代码的方法

Publications (1)

Publication Number Publication Date
CN115066674A true CN115066674A (zh) 2022-09-16

Family

ID=69631518

Family Applications (2)

Application Number Title Priority Date Filing Date
CN202080096065.4A Pending CN115066674A (zh) 2020-02-10 2020-02-10 使用源代码元素的数值数组表示来评估源代码的方法
CN202211442539.3A Pending CN115935369A (zh) 2020-02-10 2020-02-10 使用源代码元素的数值数组表示来评估源代码的方法

Family Applications After (1)

Application Number Title Priority Date Filing Date
CN202211442539.3A Pending CN115935369A (zh) 2020-02-10 2020-02-10 使用源代码元素的数值数组表示来评估源代码的方法

Country Status (5)

Country Link
US (1) US12111934B2 (zh)
EP (1) EP4104047B1 (zh)
CN (2) CN115066674A (zh)
MX (1) MX2022009749A (zh)
WO (1) WO2021160242A1 (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20210050178A (ko) * 2019-10-28 2021-05-07 삼성전자주식회사 소스 코드에서 취약성을 탐지하기 위한 방법, 디바이스, 및 컴퓨터 판독가능 매체
US12050892B2 (en) * 2021-09-22 2024-07-30 Row64, Inc. Card solver compiler parsing
US11941115B2 (en) * 2021-11-29 2024-03-26 Bank Of America Corporation Automatic vulnerability detection based on clustering of applications with similar structures and data flows
US20230359822A1 (en) * 2022-05-06 2023-11-09 Microsoft Technology Licensing, Llc Method and system to extract data dependencies for machine learning models
CN118113278A (zh) * 2024-03-06 2024-05-31 北京当境科技有限责任公司 一种基于无代码平台快速搭建数字孪生应用的方法及系统
CN117850870B (zh) * 2024-03-08 2024-05-07 四川大学 一种代码注释生成方法、装置、电子设备及存储介质

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9146712B2 (en) 2013-09-18 2015-09-29 Vmware, Inc. Extensible code auto-fix framework based on XML query languages
US9928040B2 (en) * 2013-11-12 2018-03-27 Microsoft Technology Licensing, Llc Source code generation, completion, checking, correction
JP7074739B2 (ja) * 2019-10-21 2022-05-24 矢崎総業株式会社 脆弱性評価装置
US20220067538A1 (en) * 2020-09-03 2022-03-03 Intuit Inc. Methods and systems for generating knowledge graphs from program source code
WO2022096574A1 (en) * 2020-11-05 2022-05-12 Accenture Global Solutions Limited Scalable source code vulnerability remediation
US11586437B1 (en) * 2021-03-31 2023-02-21 Amazon Technologies, Inc. Data flow tracking in program verification

Also Published As

Publication number Publication date
MX2022009749A (es) 2022-09-07
WO2021160242A1 (en) 2021-08-19
CN115935369A (zh) 2023-04-07
EP4104047B1 (en) 2024-09-25
EP4104047A1 (en) 2022-12-21
US12111934B2 (en) 2024-10-08
US20230252161A1 (en) 2023-08-10

Similar Documents

Publication Publication Date Title
Alon et al. code2vec: Learning distributed representations of code
Ding et al. Patching as translation: the data and the metaphor
Rabin et al. On the generalizability of neural program models with respect to semantic-preserving program transformations
CN115066674A (zh) 使用源代码元素的数值数组表示来评估源代码的方法
Dehaerne et al. Code generation using machine learning: A systematic review
CN109885479B (zh) 基于路径记录截断的软件模糊测试方法及装置
US10210249B2 (en) Method and system of text synthesis based on extracted information in the form of an RDF graph making use of templates
CN114861194B (zh) 一种基于bgru与cnn融合模型的多类型漏洞检测方法
JP2017519300A (ja) ソフトウェアアナリティクスのためのシステム及び方法
CN113127339B (zh) 一种Github开源平台数据的获取方法及源代码缺陷修复系统
Sellam et al. Deepbase: Deep inspection of neural networks
CN111475820A (zh) 基于可执行程序的二进制漏洞检测方法、系统及存储介质
JP2022115815A (ja) 拡張プログラミング言語コーパスに基づく意味コード検索
Moore et al. A convolutional neural network for language-agnostic source code summarization
JP2007026451A (ja) Xパスクエリーの処理方法
Bäumer et al. Flexible ambiguity resolution and incompleteness detection in requirements descriptions via an indicator-based configuration of text analysis pipelines
CN114385491B (zh) 一种基于深度学习的js转译器缺陷检测方法
Zhuang et al. Just-in-time defect prediction based on AST change embedding
KR102546424B1 (ko) 학습용 데이터 생성 장치, 소스 코드 오류 분석 장치 및 방법
Santos et al. Finding and correcting syntax errors using recurrent neural networks
Sengamedu et al. Neural language models for code quality identification
Liu et al. Prompt Learning for Multi-Label Code Smell Detection: A Promising Approach
Szalontai et al. Localizing and idiomatizing nonidiomatic python code with deep learning
Butler Analysing Java Identifier Names
Büyük et al. Deep learning with class-level abstract syntax tree and code histories for detecting code modification requirements

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