ICSE‘25 LLM Assistance for Memory Safety

不知道从什么时候开始,各大技术社区,技术群聊流行着 “用Rust重写!” ,放一张图(笑死…
请添加图片描述
这不, 随着大模型技术的流行,大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构,代码变换(Refactor,Transformer)

最近有很多类似的工作,将一个语言的工程项目转换为另一个语言工程项目。

  • 字节在代码重构方面的探索
    • 半空:LLM 辅助的 Go2Rust 项目迁移
  • C to Rust
    • ICSE’23: Concrat: An Automatic C-to-Rust Lock API Translator for Concurrent Programs
    • Context-aware Code Segmentation for C-to-Rust Translation using Large Language Models
    • Towards Translating Real-World Code with LLMs: A Study of Translating to Rust
  • Java to ArkTS
    • ASE’24: LLM-Based Java Concurrent Program to ArkTS Converter
    • ArkTS就是鸿蒙应用开发语言, TypeScript的一个超集

请添加图片描述

本文阅读: ICSE’25 “Using Large Language Models for inferring Checked C annotations”

原文是利用LLM去完成全程序代码重构,即: 将C语言项目的源代码转换成C语言的一个方言CheckedC,该C语言方言是内存安全的。

本文不关注它重构或者转换(Refactor/Transformer)的具体细节,而是关注整个Whole Program Transformer框架,具体细节可以查看原文。

1. 依赖图构造 (Dependency Graph Generation)

核心方法学就是:渐进式代码分析(模块化代码分析). 推荐看我之前推荐的一篇文章:SOAP’24 Interleaving Static Analysis and LLM Prompting

由于大模型上下文窗口的限制,我们不可能把所有的工程文件一股脑扔给LLM,而是将大的任务拆分成更小的任务,每个任务的上下文大小就足够小,可以交给大模型去完成。

SOAP'24 Interleaving Static Analysis and LLM Prompting中提到的拆分方法是按函数级别去拆分,即构造函数调用图,然后对调用图拓扑排序,自底向上进行LLM与静态分析交互的代码分析。

但是在代码重构这个领域,按函数级别去拆分仍然不够,因为我们期望将程序中每个元素,包括数据结构,类型定义,宏定义,全局变量定义等也进行重构,很显然单纯构造全程序函数调用图仍然不够。

于是,在之前的函数调用图之上进行扩展。

  • 如果一个函数内用到了某个类型,那么该函数也应该有一条边连接到这个类型的定义。
  • 如果一个函数内用到了某个全局变量,那么该函数也应该有一条边连接到这个全局变量的定义。
  • 类似地, 可以递归地进行边的连接:

最后的依赖图大概长这样:
请添加图片描述

下面给出依赖图的具体定义:

依赖图的节点为程序中所有的top-level declarations。例如:

  • 函数: 函数签名 + 函数体
  • 类型声明: struct, union, enum
  • 全局变量声明
  • 宏定义

依赖图的边为有向边: n1 -> n2表示n1中用到了n2

  • n1为函数。n1 -> n2,如果
    • n2为n1中被调用的函数。
      • 对于函数指针调用,直接连接n1到这个函数指针的类型声明
    • n2为n1中出现的所有类型,全局变量,宏定义。
  • n1类型定义。n1 -> n2,如果
    • n2为n1中出现的所有类型和宏定义
  • n1全局变量声明。n1 -> n2,如果
    • n2为n1中一定用到的类型或者宏定义
  • n1为宏定义
    • 宏定义没有出边

宏定义作者目前并没有太考虑.

2. 通用全程序变换框架 (Generic Whole-Program Transformation)

作者给出了一个通用的全程序变换算法框架:
请添加图片描述

算法的输入为:依赖图,Prompt模板。

其中,根据Transformation的不同,框架输入的具体Prompt就不同。下面是Prompt模板。
请添加图片描述

CheckedC Preamble 给大模型介绍CheckedC相关知识,例如内置的注解,语法规则等。(In-Context Learning)

模板中提供了几个模板变量,待具体问题去实例化这些变量:

  • {{Task definition}}:描述LLM要执行的具体任务
  • {{Task example}}:Few-shot learning,举几个例子。
  • {{prelude}}:In-Context Learning,给它提供额外的相关的上下文。
  • {{code}}:被变换的源代码文本
  • {{refactor_history}}:之前的重构历史
  • {{task_specific_code_elements}}:具体的任务

整个框架的工作流:
请添加图片描述

3. 实例化框架

之前介绍了作者的给出的算法框架,以及Prompt模板。作者将这个框架实例化为3个任务。即:在这个通用框架上扩展了3个任务实例:

  • Replacing Nested Arrays with Structs
  • Inferring Bounds Annotations
  • Annotating Globals and Struct Fields

三个任务的Prompt分别是:
请添加图片描述
请添加图片描述

请添加图片描述

4. 实验结论

算法框架的有效性验证

  • 不提供CheckedC知识背景,即使是小程序,LLM也不能推到出注解。
  • 模块化分析更加高效得完成大小规模程序的全程序的代码变换。
  • 最好让LLM一次分析一个函数,然后提供给它相关的依赖作为上下文

真实代码库的实验效果

  • MSA能够推导出86%的3C无法推到出的指针注解
  • MSA算法能够应用到要求复杂代码推理的真实代码场景

作为还拿vsftpd项目为例,与人工编辑作代码重构的对比,这里不展开了。详见原文。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现.env文件读取敏感数据

文章目录 1.common-env-starter模块1.目录结构2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行,提前读取配置3.EnvProperties.java 这里的path只是为了代码提示4.EnvAutoConfiguration.java Env模块自动配置类5.spring.factories 自动配置和注册Enviro…

基于Python的人工智能患者风险评估预测模型构建与应用研究(下)

3.3 模型选择与训练 3.3.1 常见预测模型介绍 在构建患者风险评估模型时,选择合适的预测模型至关重要。不同的模型具有各自的优缺点和适用场景,需要根据医疗数据的特点、风险评估的目标以及计算资源等因素进行综合考虑。以下详细介绍几种常见的预测模型。 逻辑回归(Logisti…

零基础Vue入门4——Vue3基础核心

本节重点: vue3最佳实践 ref reactive computed watch、watchEffect 讲解重点之后下面会带大家开发一个页面(表单表格),之后会有一个TodoList的小练习,文末附有小练习的代码参考。跟着练习一定带你可以上手开发vu…

一文掌握ADB的安装及使用

文章目录 一、什么是ADB?二、 安装ADB2.1 下载ADB2.2 配置环境变量 三、连接Android设备四、 常用ADB命令五、ADB高级功能5.1 屏幕截图和录制5.2 模拟按键输入5.3 文件管理5.4 系统设置管理5.5 系统操作指令5.6 日志操作指令5.7 APK操作指令5.8 设备重启和恢复 六、…

使用Edu邮箱申请一年免费的.me域名

所需材料:公立Edu教育邮箱一枚(P.S:该服务不支持所有的Edu教育邮箱,仅支持比较知名的院校) 说到域名,.me这个后缀可谓是个性十足,适合个人网站、博客等。.me是黑山的国家顶级域名(c…

7.抽象工厂(Abstract Factory)

抽象工厂与工厂方法极其类似,都是绕开new的,但是有些许不同。 动机 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。 假设案例 假设…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能? 每月 2000 代码补全,帮助开发者快速完成代码编写。 每月 …

[JavaWeb]搜索表单区域

一.注意事项 设置外边距:margin:(参数可省去部分)上 下 左 右 二.源代码 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>Tlias智能学习辅助系统</title> <style> /* 导航栏样…

NLP自然语言处理通识

目录 ELMO 一、ELMo的核心设计理念 1. 静态词向量的局限性 2. 动态上下文嵌入的核心思想 3. 层次化特征提取 二、ELMo的模型结构与技术逻辑 1. 双向语言模型&#xff08;BiLM&#xff09; 2. 多层LSTM的层次化表示 三、ELMo的运行过程 1. 预训练阶段 2. 下游任务微调 四、ELMo的…

Eureka 服务注册和服务发现的使用

1. 父子工程的搭建 首先创建一个 Maven 项目&#xff0c;删除 src &#xff0c;只保留 pom.xml 然后来进行 pom.xml 的相关配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xs…

OpenCV:二值化与自适应阈值

目录 简述 1. 什么是二值化 2. 二值化接口 2.1 参数说明​​​​​ 2.2 示例代码 2.3 运行结果 3. 自适应阈值 3.1 参数说明 3.2 示例代码 3.3 运行结果 4. 总结 4.1 二值化 4.2 自适应阈值 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 简述 图像二值…

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…

Win11下帝国时代2无法启动解决方法

鼠标右键点图标&#xff0c;选择属性 点开始&#xff0c;输入启用和关闭

JAVA实战开源项目:在线文档管理系统(Vue+SpringBoot) 附源码

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

Python设计模式 - 组合模式

定义 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象&#xff0c;从而简化了客户端代码。 组合模式有透明组合…

算法每日双题精讲 —— 前缀和(【模板】一维前缀和,【模板】二维前缀和)

在算法竞赛与日常编程中&#xff0c;前缀和是一种极为实用的预处理技巧&#xff0c;能显著提升处理区间和问题的效率。今天&#xff0c;我们就来深入剖析一维前缀和与二维前缀和这两个经典模板。 一、【模板】一维前缀和 题目描述 给定一个长度为 n n n 的整数数组 a a a&…

VLLM性能调优

1. 抢占 显存不够的时候&#xff0c;某些request会被抢占。其KV cache被清除&#xff0c;腾退给其他request&#xff0c;下次调度到它&#xff0c;重新计算KV cache。 报这条消息&#xff0c;说明已被抢占&#xff1a; WARNING 05-09 00:49:33 scheduler.py:1057 Sequence gr…

知识管理系统塑造企业文化与学习型组织的变革之路

内容概要 知识管理系统&#xff08;Knowledge Management System, KMS&#xff09;是指组织内部为有效获取、存储、共享和应用知识而建立的结构和技术体系。这一系统不仅是信息技术的运用&#xff0c;更是推动企业文化和学习型组织发展的重要工具。在当今快速变化的商业环境中…

智能汽车网络安全威胁报告

近年来随着智能汽车技术的快速发展&#xff0c;针对智能汽车的攻击也逐渐从传统的针对单一车辆控制器的攻击转变为针对整车智能化服务的攻击&#xff0c;包括但不限于对远程控制应用程序的操控、云服务的渗透、智能座舱系统的破解以及对第三方应用和智能服务的攻击。随着WP.29 …

Python练习(2)

今日题单 吃鱼还是吃肉 PTA | 程序设计类实验辅助教学平台 降价提醒机器人PTA | 程序设计类实验辅助教学平台 幸运彩票 PTA | 程序设计类实验辅助教学平台 猜帽子游戏 PTA | 程序设计类实验辅助教学平台 谁管谁叫爹 PTA | 程序设计类实验辅助教学平台 就不告诉你 PTA | 程…