ChinaSoft 展商风采 | 蚂蚁集团:CodeFuse-Query代码大数据分析平台

news2024/11/17 7:48:39

2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日上海国际会议中心举行。

本次大会主题是“智能化软件创新推动数字经济与社会发展”,学术、工业、教育、竞赛等分论坛活动40余场,期待您的参与!

目前大会火热报名中!

CCF ChinaSoft 2023官方首页:

http://chinasoft.ccf.org.cn/

点击文末“阅读原文”或扫描下方二维码进入官方注册通道:

https://conf.ccf.org.cn/chinasoft2023

a9e5baf6afbbcfb336e1dbc1261ea0b7.jpeg

0281034b505ff1bee0c1cd7eea60f922.jpeg

大代码时代的基建:CodeFuse-Query代码大数据分析平台

(蚂蚁集团)

✦  +

+

引言

随着大规模软件开发的普及,对可扩展且易于适应的静态代码分析技术的需求正在加大。传统的静态分析工具,如 Clang Static Analyzer (CSA) 或 PMD,在检查编程规则或样式问题方面已经展现出了良好的效果。然而,这些工具通常是为了满足特定的目标而设计的,往往无法满足现代软件开发环境中多变和多元化的需求。这些需求可以涉及服务质量 (QoS)、各种编程语言、不同的算法需求,以及各种性能需求。例如,安全团队可能需要复杂的算法,如上下文敏感的污点分析,来审查较小的代码库,而项目经理可能需要一种相对较轻的算法,例如计算圈复杂度的算法,以在较大的代码库上测量开发人员的生产力。

这些多元化的需求,加上大型组织中常见的计算资源限制,构成了一项重大的挑战。由于传统工具采用的是问题特定的计算方式,往往无法在这种环境中实现扩展。因此,我们推出了 CodeFuse-Query,这是一个专为大规模静态分析设计的集中式数据平台。

在 CodeFuse-Query 的实现中,我们把源代码和分析结果看作数据,把执行过程看作大数据处理,这与传统的以工具为中心的方法有着显著的不同。我们利用大型组织中的常见系统,如数据仓库、MaxCompute 和 Hive 等数据计算设施、OSS 对象存储和 Kubernetes 等灵活计算资源,让 CodeFuse-Query 能够无缝地融入这些系统中。这种方法使 CodeFuse-Query 高度可维护和可扩展,能够支持多元化的需求,并有效应对不断变化的需求。此外,CodeFuse-Query 的开放架构鼓励各种内部系统之间的互操作性,实现了无缝的交互和数据交换。这种集成和交互能力不仅提高了组织内部的自动化程度,也提高了效率,降低了手动错误的可能性。通过打破信息孤岛,推动更互联、更自动化的环境,CodeFuse-Query 显著提高了软件开发过程的整体生产力和效率。

此外,CodeFuse-Query 的以数据为中心的方法在处理静态源代码分析的领域特定挑战时具有独特的优势。例如,源代码通常是一个高度结构化和互联的数据集,与其他代码和配置文件有强烈的信息和连接。将代码视为数据,CodeFuse-Query 可以巧妙地处理这些问题,这使得它特别适合在大型组织中使用,其中代码库持续但逐步地进行演变,大部分代码在每天进行微小的改动同时保持稳定。CodeFuse-Query 还支持如基于代码数据的商业智能 (BI) 这类用例,能生成报告和仪表板,协助监控和决策过程。此外,CodeFuse-Query 在分析大型语言模型 (LLM) 的训练数据方面发挥了重要作用,提供了增强这些模型整体效果的深入见解。

在当前的静态分析领域,CodeFuse-Query 带来了一种新的范式。它不仅满足了大规模、复杂的代码库分析需求,还能适应不断变化和多元化的静态分析场景。CodeFuse-Query 的以数据为中心的方法,使得其在处理大数据环境中的代码分析问题时具有独特优势。CodeFuse-Query 的设计,旨在解决大规模软件开发环境中的静态分析问题。它能够将源代码和分析结果视作数据,使得其可以灵活地融入大型组织的各种系统中。这种方法不仅可以有效地处理大规模的代码库,还可以应对各种复杂的分析需求,从而使得静态分析工作变得更加高效和准确。

✦  +

+

特点和优势

高度可扩展:CodeFuse-Query 可以处理大规模的代码库,且能够适应不同的分析需求。这种高度的可扩展性使得 CodeFuse-Query 可以在大型组织中发挥重要作用。

以数据为中心:CodeFuse-Query 将源代码和分析结果视作数据,这种以数据为中心的方法使其在处理大数据环境中的代码分析问题时具有独特优势。

高度集成:CodeFuse-Query 能够无缝地融入大型组织的各种系统中,包括数据仓库、数据计算设施、对象存储和灵活计算资源等。这种高度的集成性使得 CodeFuse-Query 在大型组织中的使用变得更加方便和高效。

支持多元化的需求:CodeFuse-Query 不仅可以处理大规模的代码库,还可以应对各种复杂的分析需求,包括服务质量分析需求、跨编程语言分析需求、算法需求和性能需求等。

CodeFuse-Query 是一种强大的静态代码分析平台,适合大规模、复杂的代码库分析场景。它的以数据为中心的方法和高度的可扩展性使得它在现代软件开发环境中具有独特的优势。未来,随着静态代码分析技术的不断发展,CodeFuse-Query 有望在这个领域中扮演更加重要的角色。

✦  +

+

架构

从整体上来说,CodeFuse-Query代码数据平台分为三大部分:代码数据模型、代码查询DSL、平台产品化服务。主要工作流程如下图所示:

db266fd2141a115ae2e2264771667c5d.png

代码数据化和标准化:COREF

我们定义了一种代码数据化和标准化的模型:COREF,要求所有代码都要能通过各种语言抽取器转化到该模型。 

COREF主要包含以下几种信息:

COREF = AST (抽象语法树) + ASG(抽象语义图) + CFG(控制流图) + PDG(程序依赖图)+ Call Graph(函数调用图) + Class Hierarchy (类继承关系)+ Documentation(文档/注释信息)

注:由于每种信息的计算难度不一,所以并不是所有语言的COREF信息均包含以上全部信息,基础信息主要有AST、ASG、Call Graph、Class Hierarchy和Documentation,其他信息( CFG 和 PDG )仍在建设中,后续会逐步支持。

代码查询DSL

基于生成的COREF代码数据,CodeFuse-Query 使用一种自定义的DSL语言 Gödel 来进行查询,从而完成代码分析需求。

Gödel是一种逻辑推理语言,它的底层实现是基于逻辑推理语言Datalog,通过描述“事实”和“规则”, 程序可以不断地推导出新的事实。Gödel也是一个声明式语言,相较于命令式编程,声明式编程更加着重描述“要什么”,而把如何实现交给计算引擎。

既然代码已经转化为关系型数据(COREF数据以关系型数据表的形式存储),相信大家会有疑问,为什么不直接用SQL,或者是直接使用SDK,而是又要专门去学习一个新的DSL语言呢?因为Datalog的计算具备单调性和终止性,简单理解就是,Datalog是在牺牲了表达能力的前提下获得了更高的性能,而Gödel继承了这个特点。 

1. 相比较SDK,Gödel的主要优点是易学易用,声明式的描述,用户不需要关注中间的运算过程,只需要像SQL一样简单描述清楚需求即可。

2. 相比较SQL,Gödel的优点主要是描述能力更强、计算速度更快,例如描述递归算法和多表联合查询,而这些对于SQL来说都是比较困难的。

平台化、产品化

CodeFuse-Query 包括Sparrow CLI 和CodeFuse-Query在线服务Query中心。Sparrow CLI包含了所有组件和依赖,例如抽取器,数据模型,编译器等,用户完全可以通过使用Sparrow CLI在本地进行代码数据生成和查询(Sparrow CLI的使用方式请见 第3节 安装、配置、运行)。如果用户有在线查询的需求,可以使用Query中心进行实验。

分析语言

截止到目前,CodeFuse-Query支持对11种编程语言进行数据分析。其中对5种编程语言( Java、JavaScript、TypeScript、XML、Go )的支持度非常成熟,对剩余6种编程语言(Object-C、C++、Python3、Swift、SQL、Properties )的支持度处于beta阶段,还有进一步提升和完善的空间,具体的支持情况见下表:

30b55f340c83c774529ba46f108fa408.png

注:以上语言状态的成熟程度判断标准是根据COREF包含的信息种类和实际落地情况来进行判定,除了OC/C++外,所有语言均支持了完整的AST信息和Documentation信息,以Java为例,COREF for Java还支持了ASG、Call Graph、Class Hierarchy、以及部分CFG信息。

✦  +

+

使用场景

查询代码特征

小开发同学想知道 Repo A 里面使用了哪些 String 型的变量,所以他写了一个 Godel 如下,交给 CodeFuse-Query系统给他返回了结果。

b7d2bc58546b45b716cad3b05e5e2ac3.png

类似需求:查询:类,函数,变量,返回值,调用图,类继承等等。

输出静态分析能力

小安全是 XX 团队的安全同学,他做了一套系统交叉验证日志数据和代码数据是否一致。为了完成某个分析任务,他计划通过写 Godel 查询出来静态数据 D1,合并动态数据 D2,联合分析得出结论 C。小安全通过在 CodeFuse-Query 上面编写 Godel Query 测试技术上可行之后,使用 CodeFuse-Query 提供的标准 API 将系统对接了起来。

类似需求:通过静态分析进行系统的卡点,提高测试的效率,通过分析出来的数据合并成说明文档。

代码规则检查器

小 TL 同学发现团队总是写出很多类似的 Bug A,他想针对 Bug A 制定一个代码规则和其检查器,并在 CodeReview 阶段做个卡点。小 TL 通过在 CodeFuse-Query 平台上面编写了一段分析 Query,在平台上面测试符合要求,把这段分析 Query 固化下来作为一个代码规则,并上线到了 CodeReview/CI 阶段。从此这个 Bug 再也没发生过了。

类似需求:编写静态缺陷扫描规则进行代码风险拦截。

分析代码特性

研发部同学小框架想知道目前代码仓库中Spring工程和Spring Boot工程比例。好量化新框架的推广情况。小架构通过编写 Godel Query 描述不同项目分析特征,然后一次性 Query 了 11 万个代码仓库,过了几十分钟后就拿到了所有代码的数据,开开心心做 KPI 去了。

类似需求:应用画像,代码画像,架构分析。

获取统计数据

小研究发现传统的代码复杂度指标很难准确地衡量代码的复杂情况,通过学习国际先进经验加上自我灵光一闪,设计了一套复杂度指标和算法。通过 Godel 实现出来以后,发现不怎么优化就已经性能非常高了,很快就应用到了 10 几种语言,11+万个仓库当中去了。马上就对代码仓库整体的复杂度有了深入的了解。相比较以前需要自己解析代码,分析语法树,对接系统,不知道方便了多少

类似需求:代码统计,代码度量,算法设计,学术研究。

架构分析

小架构同学最近推行了一种新的基于 txt 文件的消息中间件,目前已有的分析平台都不能支持分析此类系统的上下游依赖。小架构通过 Godel快速建模了该消息格式,并马上获取到了目前系统中不同组件的依赖关系。

类似需求:系统 Overview,架构治理,血缘分析。

模型验证

小促销设计的系统里面要求用户一定是先玩游戏再领券。他通过 Godel 描述了该模型的验证逻辑,然后通过 CodeFuse-Query 系统保障当前以及未来系统的代码实现,都是完全符合该模型的。从此再不担心游戏出资损~

类似需求:系统验证,网络验证,权限验证。

✦  +

+

应用领域

目前,CodeFuse-Query在蚂蚁集团已经支持 CodeFuse大语言模型数据清洗、代码度量评估、研发风险控制、隐私安全分析、代码智能、终端包大小治理等多个场景的落地应用,服务月均调用量超过百万。

091d4a016ee8b91426ef25f092bae058.png

高质量代码数据清洗 - CodeFuse代码大模型

CodeFuse代码大模型是蚂蚁集团对外开源的处理代码相关问题的模型,对于CodeFuse大语言模型而言,训练的数据质量直接影响模型的推理结果。低质量的代码数据会直接污染语言模型的输出,例如:模型可能会学习到错误的代码模式,从而生成错误的代码;数据中只包含某种编程语言的代码,模型可能无法很好地适应其他编程语言的代码。

为了把控进入模型的代码数据质量,进而提升模型的推理能力。我们基于蚂蚁程序分析团队多年的实践积累结合业界共识,梳理了高质量代码的定义方式,并利用已有程序分析技术实现了自动化、大规模的代码数据清洗。

CodeFuse-Query为CodeFuse代码大模型提供了以下数据清洗能力:

1. 高质量代码数据清洗:对代码数据进行清洗,包括对 Python,Java,JavaScript,TypeScript,Go,C,C++ 7 种语言进行漏洞扫描,对语言种类 / star 数进行筛选,过滤有效代码行数为 0 的数据等。目前已沉淀清洗后的 GitHub 和蚂蚁内部代码数据总共约 2TB

2. 代码画像:实现对大规模代码进行高性能多维度的自动标注,支持 Java, Scala, Kotlin, JavaScript, JSX, TypeScript, TSX, Vue, Python, Go 等 10 种语言,77 种通用标签,40 种蚂蚁特有标签,共 117 种标签。目前自动标注性能能够达到 40MB/s

3. 其他原子能力

a. 高级代码特征提取,包括提取 AST(抽象语法树),DFG(数据流图)数据等。目前 AST 信息已用于 SFT 训练,准确率 97% 左右。

b. 代码片段识别,用于针对文本数据中的代码进行提取,方便进行代码格式化或加上 Markdown 格式:

§ 文本提取代码:从文本中提取代码块信息,支持主流语言的解析,函数及类定义,仅验证二分类问题,就是说仅验证文本是否含有代码块准确率 83% 左右。

§ 识别代码片段的编程语言种类:识别任意代码片段的编程语言种类,支持 30+ 种语言,准确率80%左右。

c. 代码注释对提取:支持提取方法级别的注释-代码对信息,覆盖 15 种 GitHub 最流行的语言,用于 Text To Code/Code To Text 的 SFT 训练。

变更分析-优酷服务端研发效能

优酷质量保障团队从2023年开始针对服务端精准测试的探索,经过半年的技术沉淀和体系搭建,形成了具备变更内容识别、变更影响分析、测试能力推荐、测试覆盖评估的精准测试体系。

在此过程中,CodeFuse-Query能提供的能力主要有:

1. 根据代码变更内容(文件+行号),分析出影响的对象:方法、入口(http入口、hsf入口)、调用链路(从入口到变更方法的所有调用链路)、数据库操作(表、操作类型)。

2. 结合线上动态调用链路(方法链路)、CodeFuse-Query静态分析调用链路的影响面精准分析能力,提升变更分析影响面的有效性、准备率。

到目前为止,优酷已通过CodeFuse-Query接入所有核心应用,并基于静态分析采集数据,构建了服务端完整的代码知识库和流量知识库。

ea9fdceef3eceb1aad1a87f7de032461.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1262036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java---类的继承

文章目录 1. 理解继承2. 继承概述3. 代码块理解4. 继承的好处与弊端5. 继承中变量的访问特点6. super关键字7. 继承中构造方法访问特点8. 继承中成员方法访问特点9. 方法重写10. 方法重写注意事项11. Java继承注意事项 1. 理解继承 2. 继承概述 1. 继承是面向对象的三大特征之一…

ILSVRC2012数据集处理

ILSVRC2012数据集处理 解压图像处理标签和图像 解压图像 先解压 tar -xvf ILSVRC2012_img_train.tar 解压之后其实还是1000个tar压缩包(对应1000个类别),需要再次解压,解压脚本unzip.sh如下(PS:可能需要自…

银行合规知识竞赛要怎么策划才高大上

合规是银行业务永恒的主题,也是银行发展的根本保障。加强合规知识的学习和理解是保障银行业务健康发展的基础。通过竞赛形式的开展,旨在增强员工对风险和合规的敏感度和关注度,推动全行合规水平全面提升。那么如何策划一场高水平的银行合规知…

开发环境配置整理大全——Visual Studio 最新安装篇

Visual Studio是微软的集成开发环境(IDE),以Windows为主的平台开发的一套功能全面而强大的IDE,支持C#、F#、VB、C/C、HTML等36 种语言的开发。开发人员常使用的开发工具之一,Visual Studio今年4月出了最新版本的2022款…

Ubuntu系统CLion安装

Ubuntu系统CLion安装 pycharm 同理。 参考官网安装过程:官网安装过程 下载linux tar.gz包 # 解压 sudo tar -xzvf CLion-*.tar.gz -C /opt/ sh /opt/clion-*/bin/clion.sh其中第二个命令是启动CLion命令 clion安装完以后,不会在桌面或者菜单栏建立图…

数学公式KaTex识别神器,LaTex-OCR

使用KaTex格式来书写数学公式是个痛苦的事情,有时候看到某个数学公式想记录下来,为了省事不得不截图,但这很不专业,今天发现一个可以智能识别公式的程序,它使用机器学习模型来识别图像,并转化成KaTex代码&a…

vmware虚拟机怎么安装linux-rocky操作系统

vmware虚拟机安装linux-rocky操作系统 rocky下载地址:https://rockylinux.org/zh_CN/download/ 我下载boot版本,安装时候需要联网。 接下来一路下一步,硬盘这里可以选择“将虚拟磁盘存储为单个文件”,然后一直点击到完成就可以。…

【C 语言经典100例】C 练习实例9

题目&#xff1a;要求输出国际象棋棋盘。 程序分析&#xff1a;国际象棋棋盘由64个黑白相间的格子组成&#xff0c;分为8行*8列。用i控制行&#xff0c;j来控制列&#xff0c;根据ij的和的变化来控制输出黑方格&#xff0c;还是白方格。 #include<stdio.h>int main() {…

《社交泛娱乐出海作战地图》加印领取啦!

全网都在找的、内容扎实形制精炼的行业首款 融云《社交泛娱乐出海作战地图》 响应需求&#xff0c;惊喜加印啦&#xff01; 久等的大家点击上图或阅读原文获取吧~ 关注【融云全球互联网通信云】了解更多 发布以来&#xff0c;《地图》两次加印均被抢购一空。 公众号后台、朋友…

SAP SM30及ABAP维护ADRC中央地址主数据(BAS)

文章背景&#xff1a; 项目组员在创建SM30的时候&#xff0c;发现了下图的报错&#xff0c;原因是因为自建表中的地址编号ADRNR字段使用了标准的数据元素AD_ADDRNUM&#xff0c;当使用包含该数据元素的视图在SM30进行维护时&#xff0c;就会出现下面的报错AM287。 后续了解到&…

python操作Mysql学习

文章目录 版权声明准备&#xff1a;MYSQL数据库数据库简介数据库分类数据库管理系统SQL语句关系型数据库中核心元素MySQL环境搭建Mysql数据类型数据完整性和约束MYSql基本操作登录和退出数据库命令数据库基本操作命令数据表基本操作命令数据表结构修改命令表数据操作命令Mysql查…

Programming Abstractions in C阅读笔记:p197-p201

《Programming Abstractions in C》学习第64天&#xff0c;p196-p201总结。 一、技术总结 很难&#xff0c;唯有继续往下看才能让其变容易。 二、英语总结 1.psychologically是什么意思&#xff1f; 答&#xff1a; (1))psychology > psychological > psychologica…

filebeat日志收集工具

elk:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小得多 filebeat可以运行在非Java环境&#xff0c;它可以代理logstash在非Java环境上收集日志 filebeat无法实现数据的过滤&…

Spring Security 6.x 系列(6)—— 显式设置和修改登录态信息

一、前言 此篇是对上篇 Spring Security 6.x 系列&#xff08;5&#xff09;—— Servlet 认证体系结构介绍 中4.9章节显式调用SecurityContextRepository#saveContext进行详解分析。 二、设置和修改登录态 2.1 登录态存储形式 使用Spring Security框架&#xff0c;认证成功…

Django回顾【一】

一、Web应用程序 Web应用程序是一种可以通过Web访问的应用程序&#xff0c;程序的最大好处是用户很容易访问应用程序&#xff0c;用户只需要有浏览器即可&#xff0c;不需要再安装其他软件。应用程序有两种模式C/S、B/S。 C/S&#xff1a;客户端<----->服务端 例如My…

第二十章,多线程

创建线程 有两种方式&#xff0c;分别为继承Java.lang.Thread类与实现Java.lang.Runnable接口 继承Thread类 Thread常用的两个构造方法语法 public Thread&#xff08;&#xff09;&#xff1b; public Thread&#xff08;String threadName&#xff09;&#xff1b; 继承…

揭秘Java三宝:final,static,volatile,面试中不可不知的关键字秘籍!

大家好&#xff0c;我是小米&#xff0c;一名热爱技术分享的程序员。最近在和小伙伴们聊天时&#xff0c;发现有不少小伙伴对于Java中的一些关键字&#xff0c;比如final&#xff0c;static&#xff0c;volatile等&#xff0c;还是感到有些懵懂。为了帮助大家更好地理解这些概念…

企业如何选择安全又快速的大文件传输平台

在现代信息化社会&#xff0c;数据已经成为各个行业的重要资源&#xff0c;而数据的传输和交换则是数据价值的体现。在很多场合&#xff0c;企业需要传输或接收大文件&#xff0c;例如设计图纸、视频素材、软件开发包、数据库备份等。这些文件的大小通常在几百兆字节到几十个字…

HashMap的实现原理

1.HashMap实现原理 HashMap的数据结构&#xff1a; *底层使用hash表数据结构&#xff0c;即数组链表红黑树 当我们往HashMap中put元素时&#xff0c;利用key的hashCode重新hash计算出当前对象的元素在数组中的下标 存储时&#xff0c;如果出现hash值相同的key&#xff0c;此时…

HarmonyOS-Service服务开发(一)

文章目录 创建新项目启动Serviceets获取service的bundleName DataAbility开发指导开发Data步骤创建Data 创建新项目 ServiceAbility开发指导 在config.json中也有配置出现 启动Service ets获取service的bundleName 项目的bundleName service的bundleName 这里serviceAbil…