01
前 言
代码理解作为软件知识图谱重要的技术之一,可以为构建、测试、定位、代码解释等提供基础的技术和数据保障,也是持续集成的起点,只有理解了代码才能有目的性的进行有效构建。代码理解对于软件开发的成功和维护的高效性具有重要意义,是提高软件质量、降低开发成本和提高开发效率的关键。
02
什么是代码理解
代码理解是一个以软件系统为被分析对象,对其内部的信息和运作流程进行分析,获取相关知识信息的技术领域,这些信息可以在CI&CD各个阶段被访问和应用。
代码理解常用的分析手段有静态分析、动态分析、非源码分析3种,但是随着LLM大模型时代的到来,我们也在研究大模型在代码理解领域的突破与应用。
静态分析:是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。
03
代码理解主要作用
本文主要对静态代码分析进行详细介绍。静态代码分析是代码理解中的一项重要技术,它在CI&CD的各个阶段都扮演着重要的角色:
1、静态代码分析可以帮助开发者理解代码的结构、逻辑和功能。通过分析代码的语法、语义和行为,静态代码分析工具可以发现潜在的问题和错误,并进行修复和改进,这可以大大提高代码的可维护性和可靠性。
静态代码理解在CI&CD中的主要应用包括:
1、漏洞检测和修复:静态代码理解工具可以通过语法分析、语义分析等方式,检测代码中的错误、潜在问题以及其他不符合规范的地方,帮助开发者及时发现和修复问题,提高代码的质量和可靠性。
04
典型的技术方案介绍
传统的代码理解技术方案主要通过代码解析层、代码分析层、应用层三部分组成。如下图所示,整体方案过程可以简述为通过语法解析源代码、构建抽象语法树(AST)或中间表示(IR)并对其进行遍历、提取代码的各类特征、最终生成代码特征文件。
1、源代码解析:这是构建AST或IR的第一步,涉及将源代码分解成更小的部分(例如,单词、符号、表达式等)。这一步通常由词法分析器(也称为扫描器或词法器)执行。
然而,传统的代码理解技术方案在实践过程中各个环节挑战比较多,落地阻力较大。从代码解析基建的角度,对于代码解析技术的专业知识要求较高,需要进行各类语言开源解析工具的选型和改造,而且对存储扩展和执行效率要求较高。对于代码分析层,遍历AST所需的分析能力较高,并且分析能力不能复用,对多样化的场景来说存在较多重复的开发工作。从数据使用方的角度,落地应用的门槛高,针对不同语言的代码特征文件的标准不同,需要进行反复适配。对应用方的开放性较差,支持扩展的场景开发成本较高。
05
技术方案
为了解决上述传统技术方案中存在的应用门槛高、代码分析成本高、专业知识要求高等问题,我们提出了全新的解决思路:重新定义代码解析服务, 将解析和分析解耦,建立基于三层架构的代码理解服务。
5.1 基础层
基础层旨在通过构建高效易扩展的多语言代码编译前端数据,解决在代码解析层面需要依赖高专业知识要求的问题。基础层主要由以下几个部分组成:
1、多语言解析器。针对不同代码语言选取合适的代码解析方案,如c++语言的cppcheck 2.5、go语言的go native ast等。各解析器必须保证优异的性能,解析效率可达到200w+行代码/小时。解析器将代码解析为多种粒度的数据如token、ast、symbol,供上层分析层使用。
2、数据存储。建立面向多语言的通用存储Schema标准,同时又可依据各语言特性进行个性化扩展。综合代码解析数据的量级大小、查询需求、查询速度等方面考虑,灵活采用file/neo4j等多种存储方案。
3、缓存机制。在实际落地过程中面临的难题是一些大型模块的解析效率慢(超过1小时)。分析发现主要有2个原因:①代码文件多。②解析过程重复。一方面,通过多进程并发解析来提升效率;另一方面,通过设计缓存机制来避免重复解析过程,实现仅分析部分文件即可得到完整代码前端数据。
5.2 分析层
分析层旨在通过抽象通用专业分析能力刻画模块内外代码关系,解决代码分析层面成本高的问题。主要思路是结合业务场景,拆分能力图,由内到外,逐步建立起整个关系网。
5.3 服务层
分析层旨在通过抽象通用专业分析能力刻画模块内外代码关系,解决代码分析层面成本高的问题。主要思路是结合业务场景,拆分能力图,由内到外,逐步建立起整个关系网。
5.4 技术效果
-
探索一套通用的代码理解方案,构建白盒级软件知识图谱,在C++/GO上落地实践 -
基础能力:覆盖多语言,高效易扩展
-
支持3种语言、10+种代码实体数据源 -
C/C++效率突破,效率缩短近9倍,增量效率<200s,具备铺面落地水平 -
标准一致的shcema和通用提取框架,易扩展 -
分析能力:多样化
-
12通用分析能力 -
20+种常用关系的建立 -
对外服务能力上:易用且开放
-
3种数据访问方式 -
200+ APIs -
业务可低成本完成基础白盒策略开发(<1小时)
覆盖2000+业务代码路径数据,积累1T+代码知识数据,支撑10+个质效应用孵化落地,日均调用2.4k+次。
06
代码理解在百度的典型应用
△代码理解-孤独函数识别应用
△代码理解-AISA
【效果&收益】
07
大模型时代下的代码理解技术考虑
2、语言的语法更新迭代飞快,这样会导致底层解析也需要随之发生变化。
3、应用上场景过分依赖于人及人的认识范围内进行分析和挖掘,极大的限制了代码理解的应用。
4、基于规则的场景只能是0/1的判断在召回方面也有很大的局限性,应该想办法应用模型预测的方式进行场景挖掘。
2、分析层:利用大模型的语言理解能力,可以更加合理的对文件块,上下文等进行切割分析,通过大模型的知识迁移能力,能够解决传统代码分析多语言迁移能力的难题。同时调优同学也可以利用大模型的多轮对话能力,对特定领域的代码分析大模型进行微调,低成本的建立特定领域的代码分析模型,使其更加准确。
3、模型层:引入GPT-4,文心一言等相关大模型更加精准的对代码中的风险进行识别、功能理解等。提高风险识别、功能理解的准确率。
-
多轮问答方式理解代码,降低程序员和测试人员对于代码的学习成本。 -
利用大模型提供代码重构、改进意见和测试用例设计,降低开发人员和测试人员的人力成本。
-
利用大模型对代码进行文档化,降低开发人员的人力成本。以及通过代码理解生成的文档进行人工调整,反复训练大模型提高模型代码理解准确度。
-
利用大模型预期代码风险类型和大小,可以将此结果输入给构建系统,来决策构建系统的行为,从而提升构建效率。
– END –
报告下载
大佬观点