一种代码审核方法及装置与流程

专利2025-04-10  37


本技术涉及神经网络,尤其涉及一种代码审核方法及装置。


背景技术:

1、在软件开发过程中,代码审查是一种旨在提高代码质量和减少软件缺陷的重要活动。随着软件项目的规模和复杂性的增加,手动代码审查变得越来越耗时且容易出错。因此,自动化代码审查技术应运而生,在自动化代码审查的背景下,最接近的背景技术是基于深度学习的模型,特别是那些利用卷积神经网络(cnn)或循环神经网络(rnn)来分析代码的模型。这些模型能够处理代码的序列特性,并在一定程度上理解代码的结构和语义。然而,这些模型在处理长距离依赖关系和复杂代码结构时仍面临挑战,因为它们可能难以捕捉代码中的全局上下文信息。

2、因此,目前亟需一种方案,用以在代码审核过程中,充分考虑上下文的依赖关系,进而提高代码审核的准确性。


技术实现思路

1、本技术提供一种代码审核方法及装置,用以在代码审核过程中,充分考虑上下文的依赖关系,进而提高代码审核的准确性。

2、第一方面,本技术提供一种代码审核方法,该方法包括:将待审核代码生成对应的抽象语法树;所述抽象语法树的每个节点表示所述待审核代码的语法结构中的一个基本语法单元;计算所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重;根据所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重,得到所述待审核代码的各代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重;将所述待审核代码的每个第一代码片段输入到编码器-解码器模型中的编码器,以所述第一代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重作为所述编码器的多头注意力权重,得到所述第一代码片段的编码;将所述第一代码片段的编码输入到所述编码器-解码器模型中的解码器,得到对所述第一代码片段进行修改后的第二代码片段;将所述待审核代码的各第一代码片段对应的第二代码片段,作为所述待审核代码的审核结果。

3、上述技术方案中,使用神经网络模型来学习代码的表示和语义,并根据输入的待审核代码生成相应的修改建议。其中,编码器部分通过各代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重,增加了对编程语言语法和结构的深度理解能力,而解码器部分则专注于生成语法正确、逻辑一致的代码和修改建议。基于此编码器-解码器可以更全面地理解代码,而不仅仅局限于语法和规则检查。可以提供更个性化、精准的修改建议,帮助开发者更有效地改进代码质量和性能。

4、在一种可能的设计中,将待审核代码生成对应的抽象语法树之后,还包括:将所述待审核代码运行时的动态代码数据添加到所述抽象语法树中,得到增强语法树;所述动态代码数据包括所述待审核代码运行时变量的实际值和状态;计算所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重,包括:计算所述待审核代码的增强语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重。

5、上述技术方案中,通过动态代码数据和语义分析,能够捕捉代码在运行时的动态行为和语义信息,使得特征提取更为全面和精准。

6、在一种可能的设计中,根据所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重,得到所述待审核代码的各代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重,包括:对于每一代码片段,确定代码片段中包括的抽象语法树各节点对所述代码片段的贡献度;基于所述贡献度确定所述代码片段中包括的抽象语法树各节点对应的权重;根据所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重及各节点对应的权重,得到所述待审核代码的各代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重。

7、上述技术方案中,在编码器-解码器模型中融入多种注意力机制,包括语法树注意力、类型注意力和语义角色注意力,使得模型能够细致捕捉代码的语法结构、数据类型、语义角色以及代码的上下文环境,使模型在代码编辑、修复和生成任务中实现更高的准确性和效率。

8、在一种可能的设计中,通过以下方式对编码器-解码器模型进行训练:随机对原始代码的至少一个语句进行遮挡,得到遮挡代码;对所述遮挡代码中每个遮挡语句的内容进行预测,得到每个遮挡语句的填充建议及对应的概率;根据所述每个遮挡语句的填充建议及对应的概率,对所述遮挡代码中的遮挡语句进行填充,得到填充代码;将所述填充代码中的至少一个第三代码片段输入到所述编码器-解码器模型中,得到对所述第三代码片段进行修改后的第四代码片段;计算所述第四代码片段和对应原始代码片段的相似度;根据所述第四代码片段和对应原始代码片段的相似度,对所述编码器的多头注意力权重中的各项注意力权重的参数进行调整;所述多头注意力权重包括语法树注意力权重、类型注意力权重和语义角色注意力权重;所述参数包括权重矩阵参数、偏置参数和嵌入维度参数。

9、上述技术方案中,在对编码器-解码器模型进行训练时,通过对原始代码进行遮挡并对遮挡位置的代码进行填充,以产生更多的训练数据,使模型学习更丰富的、符合现实开发过程的代码修改建议,从而提高编码器-解码器模型的泛化能力。通过计算模型输出的代码和原始代码的相似度,以识别潜在的问题或改进点,是生成修改建议的基础,确保了生成修改建议的相关性和准确性。

10、在一种可能的设计中,计算所述第四代码片段和对应原始代码片段的相似度,包括:基于所述第四代码片段和对应原始代码片段的静态特征得到静态相似度;所述静态特征包括代码本身的文本特征;基于所述第四代码片段和对应原始代码片段的动态特征得到动态相似度;所述动态特征包括代码运行时变量的实际值和状态;根据所述静态相似度、静态相似度权重、所述动态相似度和动态相似度权重,得到所述第四代码片段和对应原始代码片段的相似度;所述静态相似度权重和所述动态相似度权重根据代码审查需求确定。

11、上述技术方案中,在计算相似度时,通过结合代码的静态和动态特征,提高了相似度计算的准确性,使得模型能够在识别潜在问题和生成修改建议时,更加注重代码的实际功能和执行效果,而不仅仅是表面的文本相似度。

12、在一种可能的设计中,根据所述第四代码片段和对应原始代码片段的相似度,对所述编码器的多头注意力权重中的各项注意力权重的参数进行调整,包括:根据所述第四代码片段和对应原始代码片段的相似度得到相似度损失;根据所述第四代码片段修改的准确性得到准确性损失;基于所述相似度损失、所述准确性损失、正则化损失及分别对应的权重,得到总损失;根据所述总损失对所述编码器的多头注意力权重中的各项注意力权重的参数进行调整。

13、上述技术方案中,在计算模型损失时通过将多种损失(包括相似度损失、准确性损失、正则化损失)相结合,以提高模型训练的准确性。

14、在一种可能的设计中,通过以下公式计算所述语法树注意力权重:

15、

16、其中,为节点vi和vj之间的语法树注意力权重;σ为激活函数;ei为节点vi的嵌入表示;ej为节点vj的嵌入表示;[ei;ej]表示对ei和ej进行向量拼接;wsyn为权重矩阵参数;bsyn为偏置参数。

17、上述技术方案中,通过计算语法树注意力权重,可以强化模型对语法结构的理解:通过显式地利用代码的抽象语法树ast,使得模型能够理解各个代码片段(如变量声明、函数调用、循环结构等)之间的语法关系和层次结构。例如,模型可以区分一个变量是在循环内被声明还是在循环外被声明,这对于识别潜在的作用域相关错误非常有帮助。提高模型的关注度:通过计算节点之间的注意力权重,语法树注意力机制能够指导模型更加关注于语法树中重要节点的特征表示。在代码审查的场景中,这意味着模型可以更加专注于那些对于理解代码逻辑和功能更为关键的部分,如函数定义、关键变量等,而不是被模板代码或较为次要的细节分散注意力。捕捉长距离依赖:代码中的某些逻辑错误或潜在问题可能涉及到在语法树上位置相距较远的节点之间的关系。传统的基于序列的模型可能难以捕捉这类长距离依赖关系。语法树注意力通过在象语法树ast上直接计算注意力权重,可以有效地捕捉和利用这些跨越大范围的语法结构之间的依赖,从而提升识别和预测代码中潜在问题的能力。

18、在一种可能的设计中,通过以下公式计算所述类型注意力权重:

19、

20、其中,为节点vi和vj之间的类型注意力权重;σ为激活函数;

21、t(vi)为节点vi的类型表示;t(vj)为节点vj的类型表示;wtype为权重矩阵参数;btype为偏置参数。

22、上述技术方案中,通过计算类型注意力权重,可以提升类型错误检测:类型错误是常见的编程错误之一,可能导致运行时异常或逻辑错误。类型注意力通过显式考虑变量和表达式的类型信息,能够帮助模型识别潜在的类型不匹配问题。例如,如果一个整型变量被错误地赋予了一个字符串值,模型可以通过分析类型信息来标识这种不一致,并生成相关的警告或建议。理解代码语义:在许多情况下,代码的语义是由变量和函数的类型决定的。类型注意力使得模型能够根据类型信息理解变量和函数调用的语义,从而更准确地分析代码行为。例如,模型可以区分重载函数调用的不同含义,或者理解泛型代码的行为。支持安全和优化的代码修改建议:在生成代码修改建议时,考虑类型信息可以帮助模型提出更安全和优化的方案。例如,在重构代码或引入新的代码片段时,模型可以确保新代码与现有代码在类型层面上的兼容性,从而避免引入新的类型错误。

23、在一种可能的设计中,通过以下公式计算所述语义角色注意力权重:

24、

25、其中,为节点ei和ej之间的注意力权重;wsem为权重矩阵参数;dsem为嵌入维度参数。

26、上述技术方案中,在计算语义角色注意力权重时,可以增强对函数调用的理解:在代码审查过程中,深入理解函数调用的语义是发现潜在问题和优化代码质量的关键。语义角色注意力通过专注于函数调用中各个实体的语义角色,使模型能够更准确地理解函数调用的目的和行为,比如哪些参数是必须的,哪些是可选的,函数的返回值应该如何处理等。改善参数和返回值的分析:错误地使用参数或忽视函数返回值是常见的编程错误。语义角色注意力机制有助于模型识别函数调用中参数和返回值的正确语义角色,从而检测出如类型不匹配、错误的参数顺序、未使用的返回值等问题,这些都是代码审查中需要重点关注的问题。促进代码逻辑的验证:函数调用是代码逻辑和功能实现的基础。通过计算注意力权重来反映函数调用中各个实体的语义重要性,模型可以更好地验证代码逻辑的正确性,识别潜在的逻辑错误或设计上的缺陷,比如错误的函数调用顺序、缺失的功能实现、不恰当的错误处理等。

27、第二方面,本技术实施例提供一种代码审核装置,该装置包括:

28、处理模块,用于将待审核代码生成对应的抽象语法树;所述抽象语法树的每个节点表示所述待审核代码的语法结构中的一个基本语法单元;

29、所述处理模块,还用于计算所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重;

30、所述处理模块,还用于根据所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重,得到所述待审核代码的各代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重;

31、编码模块,用于将所述待审核代码的每个第一代码片段输入到编码器-解码器模型中的编码器,以所述第一代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重作为所述编码器的多头注意力权重,得到所述第一代码片段的编码;

32、解码模块,用于将所述第一代码片段的编码输入到编码器-解码器模型中的解码器,得到对所述第一代码片段进行修改后的第二代码片段;

33、所述处理模块,还用于将所述待审核代码的各第一代码片段对应的第二代码片段,作为所述待审核代码的审核结果。

34、在一种可能的设计中,将待审核代码生成对应的抽象语法树之后,所述处理模块,还用于将所述待审核代码运行时的动态代码数据添加到所述抽象语法树中,得到增强语法树;所述动态代码数据包括所述待审核代码运行时变量的实际值和状态;所述处理模块,在计算所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重时,具体用于计算所述待审核代码的增强语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重。

35、在一种可能的设计中,所述处理模块,在根据所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重,得到所述待审核代码的各代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重时,具体用于,包括对于每一代码片段,确定代码片段中包括的抽象语法树各节点对所述代码片段的贡献度;基于所述贡献度确定所述代码片段中包括的抽象语法树各节点对应的权重;根据所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重及各节点对应的权重,得到所述待审核代码的各代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重。

36、在一种可能的设计中,所述装置还包括训练模块,用于通过以下方式对编码器-解码器模型进行训练:随机对原始代码的至少一个语句进行遮挡,得到遮挡代码;对所述遮挡代码中每个遮挡语句的内容进行预测,得到每个遮挡语句的填充建议及对应的概率;根据所述每个遮挡语句的填充建议及对应的概率,对所述遮挡代码中的遮挡语句进行填充,得到填充代码;将所述填充代码中的至少一个第三代码片段输入到所述编码器-解码器模型中,得到对所述第三代码片段进行修改后的第四代码片段;计算所述第四代码片段和对应原始代码片段的相似度;根据所述第四代码片段和对应原始代码片段的相似度,对所述编码器的多头注意力权重中的各项注意力权重的参数进行调整;所述多头注意力权重包括语法树注意力权重、类型注意力权重和语义角色注意力权重;所述参数包括权重矩阵参数、偏置参数和嵌入维度参数。

37、在一种可能的设计中,所述训练模块,在计算所述第四代码片段和对应原始代码片段的相似度时,还用于基于所述第四代码片段和对应原始代码片段的静态特征得到静态相似度;所述静态特征包括代码本身的文本特征;基于所述第四代码片段和对应原始代码片段的动态特征得到动态相似度;所述动态特征包括代码运行时变量的实际值和状态;根据所述静态相似度、静态相似度权重、所述动态相似度和动态相似度权重,得到所述第四代码片段和对应原始代码片段的相似度;所述静态相似度权重和所述动态相似度权重根据代码审查需求确定。

38、在一种可能的设计中,所述训模块在根据所述第四代码片段和对应原始代码片段的相似度,对所述编码器的多头注意力权重中的各项注意力权重的参数进行调整时,具体用于根据所述第四代码片段和对应原始代码片段的相似度得到相似度损失;根据所述第四代码片段修改的准确性得到准确性损失;基于所述相似度损失、所述准确性损失、正则化损失及分别对应的权重,得到总损失;根据所述总损失对所述编码器的多头注意力权重中的各项注意力权重的参数进行调整。

39、在一种可能的设计中,通过以下公式计算所述语法树注意力权重:

40、

41、其中,为节点vi和vj之间的语法树注意力权重;σ为激活函数;ei为节点vi的嵌入表示;ej为节点vj的嵌入表示;[ei;ej]表示对ei和ej进行向量拼接;wsyn为权重矩阵参数;bsyn为偏置参数。

42、在一种可能的设计中,通过以下公式计算所述类型注意力权重:

43、

44、其中,为节点vi和vj之间的类型注意力权重;σ为激活函数;

45、t(vi)为节点vi的类型表示;t(vj)为节点vj的类型表示;wtype为权重矩阵参数;btype为偏置参数。

46、在一种可能的设计中,通过以下公式计算所述语义角色注意力权重:

47、

48、其中,为节点ei和ej之间的注意力权重;wsem为权重矩阵参数;dsem为嵌入维度参数。

49、第三方面,本技术实施例还提供一种计算设备,包括:

50、存储器,用于存储程序指令;

51、处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行如第一方面或第二方面的任一种可能的设计中所述的方法。

52、第四方面,本技术实施例还提供一种计算机可读存储介质,其中存储有计算机可读指令,当计算机读取并执行所述计算机可读指令时,使得上述第一方面或第二方面的任一种可能的设计中所述的方法实现。


技术特征:

1.一种代码审核方法,其特征在于,所述方法包括:

2.根据权利要求1所述的方法,其特征在于,将待审核代码生成对应的抽象语法树之后,还包括:

3.根据权利要求1所述的方法,其特征在于,根据所述待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重,得到所述待审核代码的各代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重,包括:

4.根据权利要求1所述的方法,其特征在于,通过以下方式对编码器-解码器模型进行训练:

5.根据权利要求4所述的方法,其特征在于,计算所述第四代码片段和对应原始代码片段的相似度,包括:

6.根据权利要求4所述的方法,其特征在于,根据所述第四代码片段和对应原始代码片段的相似度,对所述编码器的多头注意力权重中的各项注意力权重的参数进行调整,包括:

7.根据权利要求1所述的方法,其特征在于,通过以下公式计算所述语法树注意力权重:

8.根据权利要求1所述的方法,其特征在于,通过以下公式计算所述类型注意力权重:

9.根据权利要求1所述的方法,其特征在于,通过以下公式计算所述语义角色注意力权重:

10.一种代码审核装置,其特征在于,包括:


技术总结
一种代码审核方法及装置,该方法包括:将待审核代码生成对应的抽象语法树;根据待审核代码的抽象语法树各节点的语法树注意力权重、类型注意力权重和语义角色注意力权重,得到待审核代码的各代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重;将待审核代码的每个第一代码片段输入到编码器‑解码器模型中的编码器,以第一代码片段的语法树注意力权重、类型注意力权重和语义角色注意力权重作为编码器的多头注意力权重,得到第一代码片段的编码;将第一代码片段的编码输入到编码器‑解码器模型中的解码器,得到对第一代码片段进行修改后的第二代码片段;将待审核代码的各第一代码片段对应的第二代码片段,作为待审核代码的审核结果。

技术研发人员:林子良
受保护的技术使用者:深圳前海微众银行股份有限公司
技术研发日:
技术公布日:2024/12/17
转载请注明原文地址:https://xbbs.6miu.com/read-23293.html