找回密码
 会员注册
查看: 13|回复: 0

代码理解技术应用实践介绍

[复制链接]

5

主题

0

回帖

16

积分

新手上路

积分
16
发表于 2024-10-6 19:23:38 | 显示全部楼层 |阅读模式
作者 | CQT&星云团队一、前言GEEK TALK代码理解作为软件知识图谱重要的技术之一,可以为构建、测试、定位、代码解释等提供基础的技术和数据保障,也是持续集成的起点,只有理解了代码才能有目的性的进行有效构建。代码理解对于软件开发的成功和维护的高效性具有重要意义,是提高软件质量、降低开发成本和提高开发效率的关键。二、什么是代码理解GEEK TALK代码理解是一个以软件系统为被分析对象,对其内部的信息和运作流程进行分析,获取相关知识信息的技术领域,这些信息可以在CI&CD各个阶段被访问和应用。代码理解常用的分析手段有静态分析、动态分析、非源码分析3种,但是随着LLM大模型时代的到来,我们也在研究大模型在代码理解领域的突破与应用。静态分析:是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。动态分析:软件系统在模拟的或真实的环境中执行之前、之中和之后,对软件系统行为的分析技术。非代码分析:主要是对数据文件、配置文件等非源码文件和源码间进行关联分析,当代码仓变更时,能感知变更内容对源码、功能的影响。基于LLM的分析:依托大模型的推理演绎能力,挖掘程序动静态数据中的知识。三、代码理解主要作用GEEK TALK本文主要对静态代码分析进行详细介绍。静态代码分析是代码理解中的一项重要技术,它在CI&CD的各个阶段都扮演着重要的角色:1、静态代码分析可以帮助开发者理解代码的结构、逻辑和功能。通过分析代码的语法、语义和行为,静态代码分析工具可以发现潜在的问题和错误,并进行修复和改进,这可以大大提高代码的可维护性和可靠性。2、静态代码分析可以通过分析代码的逻辑和结构,为开发者提供重构和优化的建议,帮助开发者改进代码的质量和效率。这可以使代码更易于维护、扩展和更新。3、静态代码分析也可以帮助开发者检测安全漏洞。通过分析代码的逻辑和数据流,静态代码分析工具可以检测出潜在的安全漏洞和攻击路径,并给出相应的建议和修复方案,提高系统的安全性。4、静态代码分析还可以帮助开发者进行自动化测试。通过分析代码的行为和功能,静态代码分析工具可以生成测试用例,自动执行测试任务,提高测试效率和准确性。5、通过理解代码,团队成员可以更好地协作,因为他们知道如何理解和使用彼此的代码。6、通过理解代码,开发者可以更容易地将代码重用于其他项目或系统,因为他们知道如何修改和适应代码。静态代码理解在CI&CD中的主要应用包括:1、漏洞检测和修复:静态代码理解工具可以通过语法分析、语义分析等方式,检测代码中的错误、潜在问题以及其他不符合规范的地方,帮助开发者及时发现和修复问题,提高代码的质量和可靠性。2、代码重构和优化:静态代码理解工具可以在不执行程序的情况下,对代码进行语法和结构分析,提供代码重构和优化的建议,帮助开发者改进代码结构、提高代码效率。3、代码质量评估:静态代码理解工具可以对代码进行全面的质量评估,包括代码的可读性、可维护性、可扩展性等,帮助开发者更好地了解代码的质量状况,从而采取相应的措施来改进代码质量。4、自动化测试:静态代码理解工具可以将传统开发过程中的手动干预转变为自动化流程,例如自动化构建、自动化测试、自动化部署等。这可以大大缩短开发周期,提高开发效率和质量。四、典型的技术方案介绍GEEK TALK传统的代码理解技术方案主要通过代码解析层、代码分析层、应用层三部分组成。如下图所示,整体方案过程可以简述为通过语法解析源代码、构建抽象语法树(AST)或中间表示(IR)并对其进行遍历、提取代码的各类特征、最终生成代码特征文件。1、源代码解析:这是构建AST或IR的第一步,涉及将源代码分解成更小的部分(例如,单词、符号、表达式等)。这一步通常由词法分析器(也称为扫描器或词法器)执行。2、构建AST/IR:一旦源代码被解析为较小的部分,这些部分就可以被组合成抽象语法树(AST)或中间表示(IR)。AST和IR都是源代码的结构化表示,但它们的粒度和复杂性有所不同。AST更接近于源代码的语法结构,而IR则更接近于机器代码。构建AST或IR的过程通常由语法分析器执行。3、提取特征:遍历访问AST或IR的每个节点。在遍历过程中,可以提取有关代码的各种特征,如变量、函数、控制流结构、数据依赖关系等,也可以识别特定的代码模式、计算某些代码度量(例如,代码复杂度、重复代码等),或者提取有关代码的其他信息。4、生成特征文件并应用:将提取出的代码特征存储在代码特征文件中(例如,JSON、XML或数据库),可供应用方进行各类分析场景的落地使用。然而,传统的代码理解技术方案在实践过程中各个环节挑战比较多,落地阻力较大。从代码解析基建的角度,对于代码解析技术的专业知识要求较高,需要进行各类语言开源解析工具的选型和改造,而且对存储扩展和执行效率要求较高。对于代码分析层,遍历AST所需的分析能力较高,并且分析能力不能复用,对多样化的场景来说存在较多重复的开发工作。从数据使用方的角度,落地应用的门槛高,针对不同语言的代码特征文件的标准不同,需要进行反复适配。对应用方的开放性较差,支持扩展的场景开发成本较高。五、我们的技术方案GEEK TALK为了解决上述传统技术方案中存在的应用门槛高、代码分析成本高、专业知识要求高等问题,我们提出了全新的解决思路:重新定义代码解析服务,?将解析和分析解耦,建立基于三层架构的代码理解服务。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倍,增量效率
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 08:49 , Processed in 0.736564 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表