A Learning-Based Approach to Static Program Slicing —— 论文笔记

news2024/12/26 14:39:21

A Learning-Based Approach to Static Program Slicing

OOPLSA’2024

文章目录

  • A Learning-Based Approach to Static Program Slicing
    • 1. Abstract
    • 2. Motivation
      • (1) 为什么需要能处理不完整代码
      • (2) 现有方法局限性
      • (3) 验证局限性: 初步实验研究
        • 实验设计
        • 何为不完整代码
        • 实验结果
      • (4) 为什么这个工作可以处理不完整代码
    • 3. Method
      • 训练集构造
      • 训练:
    • 4. Empirical Evaluation
      • RQ1: NS-Slicer在完整代码上的有效性
        • 1. 训练集构造:
          • 数据集: IBM CodeNet(Puri et.al 2021) 4053
        • 2. 训练:
        • 3. 指标
        • 4. 结果
      • RQ2: 在不完整代码上的有效性
        • 1. 数据集构造
        • 2. 结果
      • RQ3: 消融实验
      • RQ4: 探究PLM对变量别名对理解
        • 1. 实验方法
      • RQ5: 在漏洞检测任务上的性能
        • 数据集构造
          • 数据集: CrossVul跨语言漏洞数据集
    • 5. Limitations

1. Abstract

  • 背景: 程序切片: 传统程序切片技术在漏洞检测中很关键, 但是处理不完整代码表现不佳

  • 方法: 提出NS- Slicer, 一种基于学习的新颖方法能够预测完整代码和不完整代码的静态程序切片.
    使用预训练的大模型(PLM), 利用模型对源代码中细粒度依赖(Token级别的依赖?)的理解对每个token生成富含上下文信息的向量, 利用这些向量, NS-Slicer会分别确定语句是属于向后切片还是向前切片

  • 结果:

    • 在完整代码上, 后向切片和前向切片分别达到97.41%和95.82%的F1分数,
      并且在85.2%的例子中, NS-Slicer精确预测了整个切片
    • 在部分代码上, 达到了94.66%-96.62%(实验摘掉了不同数量的代码)的F1分数
    • 在漏洞检测的任务上, 检测Java代码达到了73.38%的F1分数
    • 实验证明能同时处理完整/不完整代码, 对任何切片起点进行切片, 对能容忍少部分不精确结果的任务比较有效, 能获得规模, 时间和对不完整代码的处理能力为权衡

2. Motivation

(1) 为什么需要能处理不完整代码

比如这样一个第13行有漏洞的, 来自StackOverflow #16180130回答的不完整代码, 被用在了Hadoop中产生了一个CVE, 类型CWE-395 Null Pointer Exception

在这里插入图片描述

顺便解释一下工作中所说的“不完整”指的是什么, 看这个代码片段, 没有被函数包裹, 中间的一些变量也没有声明, 整个代码片段都是没有上下文的

所以尽早检测类似stackoverflow这样的不完整代码漏洞是有必要的.

但是, 整个stackoverflow回答就这15行, 没有变量定义也没有外部库的信息, 没有任何上下文

(2) 现有方法局限性

而现有的方法需代码是带有完整依赖的, 至少是在函数层面上是完整的

  1. 比如基于程序分析的: SDG的javaslicer和基于CPG的joern都不行

  2. 基于深度学习的PDG生成方法NeuralPDA, 提供的依赖是语句级别的, 粒度不够细, 不能提供生成切片必要的变量和语句之间的依赖(因为切片起点是个变量)

所以这些方法在stackoverflow上检测代码小片段的能力有限,

(3) 验证局限性: 初步实验研究

做了一个小实验来说明现有基于程序分析的sota(joern)解决不了不完整代码

实验设计

从stackoverflow上找99个不完整的代码小片段(没有说是随机挑的), 输入给joern, 人工检查joern生成的CFG/PDG看是否正确

何为不完整代码

有几种类型

  • 有未知类型的数据
  • 缺少头文件的外部API/方法/类/类型
  • 引用的变量无变量定义
  • 缺少类的层次结构

举例:

在这里插入图片描述
实验就是直接输入这么一小段, 没有inclue包含std::string, std::transform的头文件, 所以这里都是未知的数据类型和API


另一个例子
工作中还用了没有函数签名的stackoverflow的代码小片段
比如, 这是一个来自stackoverflow上, 没有函数签名的代码片段, 实验会给其加上没有参数的的函数签名, 再输入给joern, 排除由于没有函数签名导致joern无法输入
在这里插入图片描述

本文里没有给具体例子, 我觉得应该是这个意思, 图也是在这个作者另一篇针对不完整代码的文章里找的

void DUMMY_METHOD_SIGNATURES(){
  std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose);
  if (!pipe) return "ERROR";
  char buffer[128];
  std::string result = "";
  while (!feof(pipe.get())) {
    if (fgets(buffer, 128, pipe.get()) != NULL)
      result += buffer;
  }
}
实验结果
  • 47/99个例子: 缺少或预测不正确的数据/控制依赖

  • 30/99个例子: joern报错, 比如“Could not find type member, type = XYZ, member = abc”

  • 7/99: joern生成了一个空CFG/PDG

Joern生成不好CFG/PDG的主要原因是

  • 未知数据类型的变量的依赖会全部被Joern忽略
  • 各种原因导致的(比如缺少头文件导致的)对unresolved的外部API/方法/类/类型的引用和对象构造会报错, 或者直接跳过
  • 缺少变量的声明, 变量类型/类的声明
  • 缺少类的层级(继承)结构
  • 不能处理template和typedef

(4) 为什么这个工作可以处理不完整代码

所以要利用预训练大模型(PLM)的优势
为什么可以处理不完整代码, 是PLM输入的序列性: 一个Token只要被输入都会被考虑上下文和数据流关系, 而不会像传统工具一样限制变量一定要声明过才会追溯数据流信息


并且PLM能捕捉到代码的语义信息, 适合切片任务, 这源于预训练任务的性质

  • 掩码语言建模(Masked Lang Modeling: Feng et.al 2020. CodeBERT: A Pre-Trained Model for Programming and Natural Languages. In EMNLP),
  • 边预测(Edge Prediction: Guo et.al 2021. GraphCode{BERT}: Pre-training Code Representations with Data Flow. In International Conference on Learning Representations.)和节点对齐(Node Align), 这两个预训练在GraphCodeBERT中也叫学习数据流知识
  • 一些工作已经证明有助于PLM学习代码中的语法结构和数据流信息, 他说PLM在语句捕捉依赖性级别有好表现

由于GraphCodeBERT的预训练目标有编码变量来自何处, 因此适合处理部分代码, 在其上做静态切片

3. Method

后面有五个实验方法有小差异, 这里简单概述共通的
在这里插入图片描述

训练集构造

用传统的基于程序分析的切片方法切出来的切片作为ground truth

<源程序, 切片起点, 前/后向切片集合(现有的切片方法)>

训练:

给定一个源程序

  1. tokenize: 把源程序语句切成文本形式的token序列

  2. Variable-statement Dependency Learning(用PLM模拟PDG的生成):

    1. 嵌入: 把文本形式的token序列送入预训练的大模型(CodeBERT/GraphCodeBERT), 大模型捕捉token序列间的依赖关系, 对每一个token生成含有上下文信息的向量表示
    2. 池化: 将属于同一语句的token向量表示应用平均值池化, 计算每一条语句的向量表示, 特别的, 将切片起点的变量单独池化
  3. 切片: (用学习方法模拟对PDG的遍历)

    对每一条语句, 将这条语句的向量表示 和切片起点变量的向量表示输入到预测前/后向切片的二分类MLP里(这条语句在切片起点前就输入到前向切片分类器, 在后面同理), 预测这条语句是否是切片起点的前/后向切片

    最后计算预测的前/后向切片集合与数据集的ground truth的前/后向切片交叉熵损失之和 训练

    为什么要训练两个因为前后向不一样

4. Empirical Evaluation

RQ1: NS-Slicer在完整代码上的有效性

1. 训练集构造:

CodeNet, 有大约75,000个Java代码样本

使用JavaSlicer(Galindo et.al 2022)对每个样本中的每一个变量作为起点切片, 剔除掉空的切片

因为定义为二分类问题, 还做了一个样本均衡的筛选, 就是挑选切出来的语句数量是原代码的0.3-0.7的样本

最后保留了43,000个Java样本, 每个样本5-69个切片

8:1:1划分

数据集: IBM CodeNet(Puri et.al 2021) 4053

https://developer.ibm.com/exchanges/data/all/project-codenet/

简介: CodeNet提供了一个oj, 有4,053个问题,代码都是使用者提交并通过IBM审核后加入数据库的, 14,000,000个代码样本, 五十多种语言, 样本不光包括代码, 还包括runtime和报错

2. 训练:

首先,选择现成的 GraphCodeBERT 预训练版本。在 NS-Slicer 的训练阶段,分PLM 中的参数是固定的和微调两种,PLM 中的标记/语句表示原封不动地用于训练前后向切分 MLP 头. 对CodeBERT 模型[Feng 等人,2020],做同样的事情。

两个PLM总共128M个参数, 每个epoch 32min

3. 指标

在语句级别计数TP, FP啥的

  • Accuracy(A-S), Precision, Recall, F1

  • A-EM(Accuracy-ExactlyMatched): 预测出的切片和GroundTruth一摸一样的比例

  • A-D(Accuracy-D):

    ​ Finally, we report Dependence Accuracy (i.e., Accuracy-D) to assess how accurately the interstatement dependencies are predicted, causing a particular statement to be included in the slice.
    ​ Accordingly, we define Accuracy-D for a particular program as the ratio of the correctly predicted dependencies to the actual dependencies across all slicing criteria for that program, finally reporting the mean across all programs in the dataset.

文章里没说具体怎么衡量是否找对了Dependency, 代码找了个遍也没找到

4. 结果

Table1:

在这里插入图片描述

可能由于工作缺乏切片的数据集, groundtruth是JavaSlicer, 这个结果只能表示有多接近JavaSlicer的性能, 可以看到最好的情况下, 有百分之85.20的例子生成的切片是和JavaSlicer一摸一样的, F1是96.77%

可以看出用GraphCodeBERT比CodeBERT效果好, 作者说是因为GraphCodeBERT考虑到了代码的数据流信息

还探究了模型对切片在整个程序中占比的敏感程度

在这里插入图片描述

RQ2: 在不完整代码上的有效性

1. 数据集构造

和RQ1相同的数据集, 先用完整代码生成切片

同时摘掉前后百分之P的来模拟部分代码, 和切片有关的语句

PLM方面只使用GraphCodeBERT, 其余和RQ1一样

2. 结果

在这里插入图片描述

RQ3: 消融实验

B1: 探究在源代码上预训练对结果的影响: 使用在自然语言——英语上预训练的模型RoBERTa-base作为PLM

B2: 探究数据流预训练(GraphCodeBERT进行了边预测和节点对齐的额外预训练, 即数据流预训练)对结果的影响: 使用CodeBERT作为PLM

B3: 把平均值池化换成最大值池化

结果:

在这里插入图片描述

对比B1, B2可以看出在源代码上预训练比在数据流上预训练更重要, 对部分代码影响更大(是文章中直接说的, 没有表)

RQ4: 探究PLM对变量别名对理解

variabe aliasing指的是, 多个引用用来表示同一个对象并且只想同一块内存

1. 实验方法

在切片起点变量所在的那条语句后面插入一条赋值语句来给切片起点变量起一个别名, 后续所有语句中的切片起点变量全部都改成别名

平均只有42.86的语句含有变量别名

在这里插入图片描述

然后作者对, 不同变量别名占切片比例的样本进行分层观察, 发现这个比例和NS-Slicer的预测能力没有直接关联

推测这可能是由于在源代码上预训练的PLM在内存级别缺乏对源代码的理解,因为当前的预训练任务主要只关注源代码的词法方面。因此,对特定源代码的预训练还能进一步提高 PLM 的程序切片性能。

RQ5: 在漏洞检测任务上的性能

数据集构造

从563个Java的commit中只有574个有漏洞函数的文件, 为了保证样本平衡从13, 565个无漏洞的文件中抽了574个, 用NS-Slicer生成了1476个代码小工具, 由于数据有限, 先在BigVul上Joern+VulDeePecker训练, 然后把Joern换掉, 数据集也换成CrossVul继续训练

数据集: CrossVul跨语言漏洞数据集

结果:

在这里插入图片描述

5. Limitations

模型的输入限制在了512个tokens, 然而LongCoder(Guo et.al 2023, 最多4096个token的限制)可以很容易的嵌入NS-Slicer

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

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

相关文章

【Vite】项目中scss 保存后 文件编译成了wxss,已解决

文章目录 前言一、在 vscode 中安装 easy sass 扩展二、在微信开发者工具导入 vscode 安装的 easy sass 扩展三、修改 easy sass 配置 前言 最近学习使用vite,在vite中使用sass 的时候每次保存都把scss文件编译成wxss文件。众所周知&#xff0c;wxss文件是微信小程序的样式。当…

开放式蓝牙耳机推荐性价比?开放式耳机性价比排行榜!

耳机在日常生活中几乎成了大多数人的必备伴侣&#xff0c;无论是听音乐、玩游戏还是追剧&#xff0c;都扮演着不可或缺的角色。但是&#xff0c;面对市场上众多的耳机品牌和款式&#xff0c;要找到一款真正符合个人需求的产品并不容易。尤其是考虑到传统入耳式耳机可能在长时间…

PN8035非隔离12V450mA开关电源芯片SOP8/DIP8封装

PN8035 高性能非隔离交直流转换芯片 PN8035SEC-R1 SOP8 12V 0.45A PN8035NE-A1 DIP8 12V 0.45A PN8035集成PFM控制器及650V高雪崩能力智能功率MOSFET&#xff0c;用于外围元器件极精简的小功率非隔离开关电源。PN8035内置高压启动模块&#xff0c;实现系统快速启动、…

Arthas tt(方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测)

文章目录 二、命令列表2.3 monitor/watch/trace/stack/tt 相关2.3.4 tt&#xff08;方法执行数据的时空隧道&#xff0c;记录下指定方法每次调用的入参和返回信息&#xff0c;并能对这些不同的时间下调用进行观测&#xff09;举例1&#xff1a;记录调用举例2&#xff1a;显示所…

Apriori算法介绍(Python实现)

1.Apriori算法简介 Apriori算法是经典的挖掘频繁项集和关联规则的数据挖掘算法。A priori在拉丁语中指"来自以前"。当定义问题时&#xff0c;通常会使用先验知识或者假设&#xff0c;这被称作"一个先验"&#xff08;a priori&#xff09;。Apriori算法的名…

数据结构 ——— 顺序表oj题:编写函数,删除有序数组中的重复项

目录 题目要求 代码实现 题目要求 一个升序排列的数组 nums &#xff0c;要求原地删除重复出现的元素&#xff0c;使每个元素只出现一次&#xff0c;并返回删除后数组的新长度&#xff0c;元素的相对顺序应该保持一致 代码实现 代码演示&#xff1a; int removeDuplicate…

Unity3D 创建一个人物,实现人物的移动

1&#xff0c;创建项目 首先打开我们的Unity Hub 在我们的编译器下面新建项目&#xff0c;选择3D模板&#xff0c;更改一下我们的项目名称&#xff0c;选择一下路径&#xff0c;然后点击创建项目 等待项目创建。。。。。。 我们在项目里先创建一个plane&#xff0c;这样有点视…

大数据处理从零开始————8.基于Java构建WordCount项目

1.配置项目环境 1.1 配置ide工具 下载IntelliJ IDEA。 Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com.cn) 全部下一步&#xff0c;中途遇到需要勾选的全部勾选即可。 安装可以参考下面文章&#xff1a; 【附安装包】IDEA下载、安装、配置与使用&…

Chris,36岁勇辞管理,重回开发:一场高龄远程工作者有违常理的自我追寻。

这是《开发者说》的第18期&#xff0c;本期我们邀请的优秀远程开发者是Chris&#xff0c;同时他也是位知名博主&#xff1a;高龄程序员。 36岁&#xff0c;从世人艳羡的高管回到开发。诧异、不解、质疑……充斥不绝。是自绝后路&#xff0c;还是东山再起&#xff1f; 07年本科…

RocksDB Compaction的常见问题

1 概述 TiKV 底层存储引擎使用 RocksDB &#xff0c;RocksDB 是一个基于 LSM tree 的单机嵌入式数据库&#xff0c; 对于LSM Tree 来说compaction是个非常重要的操作&#xff0c;本文对TiKV中涉及的compaction相关内容进行了整理总结。 2 为什么需要 compaction ? LSM Tree 通…

Oracle数据恢复—异常断电导致Oracle数据库报错的数据恢复案例

Oracle数据库故障&#xff1a; 机房异常断电后&#xff0c;Oracle数据库启库报错&#xff1a;“system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。数据库没有备份&#xff0c;归档日志不连续。用户方提供了Oracle数据库的在线文件&#xff0c;需要恢复zxf…

嵌入式linux系统中库函数如何提高效率

工作中总是会用到各种库,比如本地使用静态库,下载源上的动态库;面试时也会经常性的问到,下面我做了一系列的总结,希望大家可以快速掌握各种库,以及库的制作和使用。 一、什么是库及其作用 库(英文为library)是一组预先编写好的代码、函数、类和其他程序组件的集合…

“迷雾深渊”炮击图设计

python尝试C题目&#xff0c;ai查错审码还写“代码解读”和学习总结。 (笔记模板由python脚本于2024年09月29日 10:51:58创建&#xff0c;本篇笔记适合喜欢python&#xff0c;鼓捣算法的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/…

OpenWrt学习(四)

分区、外网、OPKG 了解分区 在Linux系统中对闪存类存储器是采用MTD(内存技术设备)类设备驱动实现的,MTD是用于访问内存类设备(ROM、Flash)的Linux驱动子系统。它的主要目的是使Flash闪存类设备更容易被访问,为此它在硬件和上层提供了一个抽象的接口使得在操作系统下我们…

基于 ESP-AT 固件从外部服务器获取文件,使用分段续传的方式

**可使用 ATHTTPCGET 指令获取 HTTP\HTTPS 的资源&#xff0c;将返回资源的 Size 和 Data ** AT 指令序列如下&#xff1a; ATRESTOREATCWMODE1 //设置 WiFi Station 模式ATCWJAP"cc2.4","12345678" //连接 WiFi ATHTTPCHEAD…

前端 vue3 对接科大讯飞的语音在线合成API

主要的功能就是将文本转为语音&#xff0c;可以播放。 看了看官方提供的demo&#xff0c;嗯....没看懂。最后还是去网上找的。 网上提供的案例&#xff0c;很多都是有局限性的&#xff0c;我找的那个他只能读取第一段数据&#xff0c;剩下的不读取。 科大讯飞的接口&#xf…

中国一定赞!北京华联BHGMall献礼祖国75周年华诞,创新践行促消费体验再升级

北京华联BHGMall [华联股份(000882)] 作为零售行业核心力量&#xff0c;以广大消费者为核心&#xff0c;不断提升自身竞争力、优化服务、以实惠的价格优质的品牌组合创新的营销活动&#xff0c;带来全新的购物消费体验。 让利于民&#xff0c;以缤纷活动点燃国庆热烈氛围 金秋…

OpenAI创始成员Andrej Karpathy:这才是技术之美

来源 | 机器之心 技术应该是什么样子&#xff1f; 我们知道乔布斯有「为改变混乱繁杂而生的现代简约主义」的设计理念。所以苹果提供的科技产品都是简洁的。可斯人已逝&#xff0c;如今我们身边的科技产品似乎又进入了复杂与不实用的怪圈之中。 近日&#xff0c;知名 AI 领域学…

【教程】57帧! Mac电脑流畅运行黑神话悟空

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、先安装CrossOver。网上有许多和谐版&#xff0c;可自行搜索。&#xff08;pd虚拟机里运行黑神话估计够呛的&#xff09; 2、运行CrossOver&#xf…

VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布

VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布 VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版&#xff0c;Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco …