深度学习框架测试论文阅读速记

[TOC]

深度学习框架测试论文阅读速记

没有任何逻辑地,以最小的心理代价记录读过的论文。

等到有一定积累后,会把论文进行分类总结。

FeatureFuzz(2026)

  • 来源:2026年 arXiv,论文链接
  • 测试对象:C/C++ 编译器(GCC 与 LLVM)
  • 痛点:现有模糊测试方法存在“语义坍缩”问题,难以有效保存并重组触发深层漏洞所需的复杂语义逻辑(如数据依赖和内存约束)。
  • 方法:提出一种基于特征组合的测试框架,通过重组语义特征生成高质量测试程序。
    • 特征提取:利用 ExtractLLM 从历史漏洞报告中提取抽象语义特征(输入:漏洞报告与代码;输出:特征自然语言描述与代码见证)。
    • 特征组合成:利用 GroupLLM 将离散特征与“胶水语义”合成为逻辑自洽的特征组(输入:采样特征;输出:连贯特征组)。
    • 程序实例化:利用 InstanLLM 将抽象特征组转化为语法正确且满足约束的可执行程序(输入:特征组;输出:C/C++ 代码)。
    • 覆盖率反馈:通过迭代循环优先奖励并复用能触发新代码路径的高价值特征(输入:执行结果;输出:优化的特征池)。
void func() {} // 目标函数 

int main() {
    void *p = (void*)&func;    // 特征 F3: 获取函数地址 
    double w_1[2] = {1, 2};    // 定义一个长度为 2 的数组
    int i = 2;                 // 特征 F2: 索引变量 i 的值超过数组边界

    if (w_1[i] < 1.8) {        // 特征 F1: 在 if 条件中使用越界数组访问
        goto *p;               // 特征 F4: 在 if 分支中使用计算跳转 (Computed Goto) 
    }
    return 0; 
} 

-o3 下会崩溃。

OATest(2026)

  • 来源:2026年ICSE,论文链接
  • 测试对象:深度学习编译器(如 TVM 和 ONNXRuntime)
  • 痛点:现有技术生成的测试用例缺乏对优化Pass匹配结构的感知,难以触发深度优化漏洞,且基于LLM的方法生成有效性低
  • 方法:通过从文档测试中提取优化感知模式并将其整合到多样化的计算图上下文中。
    • 模式提取:通过代码插桩从文档测试中动态捕获与优化Pass粒度一致的块级或子图级模式(输入:文档测试;输出:优化模式)。
    • 计算图合成:采用重用上下文兼容节点或创建桥接节点的策略,将模式插入种子图中生成有效的新用例(输入:模式与种子图;输出:合成计算图)。
    • 测试执行:利用崩溃(Crash)和差分测试(Inconsistency)检测并去重编译器漏洞(输入:合成图;输出:漏洞反馈)。

Reborn2 (2025)

  • 来源:2025年硕士学位论文
  • 测试对象:PyTorch 深度学习框架
  • 痛点:现有测试方法高度依赖人工复杂约束自动化适配性差,难以合成结构多样化的用例,且缺乏处理逻辑错误的有效测试预言。
  • 方法:
    1. 程序框架合成:基于弱约束策略,通过 6 种规则渐进式改写“程序空间”占位符,由初始简单算子输出多样化的抽象计算图结构,仅保证算子连接时数据类型对的上,不考虑具体形状限制。这些规则有的是为了获得更复杂的结构,有的是为了在时间用完之前尽快得到一个合法的收敛的模型结构。
    2. 参数搜索:将符号变量映射至 FuzzTest 域,通过覆盖率反馈指导参数取值,由抽象结构输出完整的具体测试用例。可以简单理解为,生成大量参数的取值,从垃圾里挑宝贝(使得覆盖率增加的参数),基于宝贝参数进行进一步的变异,直到一个模型结构的覆盖率一段时间内提升不了了。
    3. 差分测试:对比同一用例在急迫模式、编译模式及不同硬件后端(x86/ARM)下的输出,通过结果不一致性发现隐蔽逻辑缺陷。
  • 前序工作:基于 Google 的 FuzzTest 框架实现参数自动化求解。
  • 结果:整体的测试效率比那些“深思熟虑但极其缓慢”的传统方法更高。

弱约束弱在哪里?

从论文内容来看,这种“弱约束”是贯穿结构合成与参数求解的整体策略,但其核心着力点在于减少人工预设的硬性语义规则,从而在两个维度上都实现了“约束弱化”。

“弱”的核心是解耦了“结构生成”与“语义验证”

  1. 结构上:弱化了对算子连接关系的先验限制,允许更自由的图结构改写。
  2. 参数上:弱化了对取值范围的静态验证,将约束检查交给了后置的覆盖度反馈搜索。

这种做法解决了现有方法“依赖大量人工规则、无法自动适配框架更新”的痛点。

结构上的“弱约束”:从“规则驱动”转向“改写驱动”

在计算图(结构)生成阶段,弱约束体现为不再强制要求每一步生成的图都必须绝对“合法”或符合复杂的专家规则。

  • 程序空间(Program Space)模型:该工作不直接生成代码,而是先构建一个包含“占位符”(PlaceHolder)的抽象程序空间。
  • 渐进式改写策略:通过 6 种改写规则(如张量占位替换、加权算子选择等)迭代地填充这个空间,而不是依赖大量人工设置的复杂约束规则来确保有效性。为数不多要保证的,是数据类型要对的上。具体的形状能否对的上我们不做严格的约束,交给后续参数求解。
  • 探索异常行为:这种弱化的结构约束允许生成一些处于“边界”甚至“语义冲突”场景下的计算图,旨在探索框架在非正常输入下的处理能力。

参数求解上的“弱约束”:从“静态范围”转向“动态搜索”

在具体的算子参数(标量、形状等)确定阶段,弱约束体现为使用符号化占位符代替具体的数值。

  • 符号变量与占位符:算子参数在初期是未定义的 sym 变量或占位符,并不在合成时就施加严格的取值约束。
  • 覆盖度引导搜索:具体的参数取值并非由硬编码规则生成,而是交给 FuzzTest 机制,在符号取值空间中通过运行时反馈(边覆盖度)动态筛选出能提升覆盖率的组合。
  • 概率平衡:引入参数 pp 来控制是否使用默认参数,这种基于概率的“弱”策略在“复用默认值”和“自由搜索符号取值”之间取得平衡,而非硬性规定取值逻辑。

DLMMM(2025)

  • 来源:2025年ACM,论文链接
  • 测试对象:深度学习框架(TensorFlow、PyTorch、MindSpore)
  • 痛点:现有方法缺乏对算子组合多样性定量度量,且未考虑模型执行时间对测试效率的影响,导致启发式引导不全面。
  • 方法:
    • 多维指标度量:定量计算模型在Bug检测性能、算子组合多样性(基于子图motif计数)及执行时间上的数值。输入:测试模型;输出:各维度度量值。
    • 指标融合:利用CRITIC客观赋权法,基于指标间的对比强度和冲突相关性进行加权融合。输入:多维指标矩阵;输出:综合适应度分数(Fitness)。
    • 启发式生成:基于融合分数通过锦标赛算法选择种子模型,并指导多级变异过程生成新用例。输入:种子模型池与变异规则;输出:生成的测试模型。

LegoFuzz(2025)

  • 来源:2025年OOPSLA,论文链接
  • 测试对象:C/C++ 编译器(如 GCC 和 LLVM)
  • 痛点:现有基于函数合成的方法受限于可用函数库的大小,难以生成包含复杂数据流和控制流的多样化测试程序。
  • 方法:利用大语言模型(LLM)通过语义转换和接口适配,将不合规的真实代码片段转化为可组合的模块。
    • 函数收集与预处理:从开源项目挖掘原始函数并识别其副作用与参数约束(输入:源代码;输出:候选函数库)。
    • LLM 辅助转换:利用 LLM 将非合规函数改造为满足特定合成标准的合规函数(输入:非合规函数;输出:语义等价的合规函数)。
    • 程序合成:通过共享全局变量或嵌套调用,将多个合规函数交织成具有复杂逻辑的测试程序(输入:合规函数集;输出:C/C++ 测试用例)。
    • 反馈驱动优化:根据编译成功率和覆盖率动态调整函数选择策略(输入:测试结果;输出:优化的合成配置)。

TenFuzz (2023)

  • 来源:2023年 TOSEM (ACM Transactions on Software Engineering and Methodology),论文链接
  • 测试对象:深度学习框架(TensorFlow, PyTorch, MXNet, Deeplearning4J)
  • 痛点:开发者对深度学习框架漏洞的分布、根本原因及症状缺乏系统性认识,导致现有的测试和调试方法难以针对框架本身的复杂特性进行优化。
  • 方法:通过大规模实证研究提炼指导方针,并开发原型测试工具。
    • 漏洞数据挖掘与标注:手动分析四个主流框架中的 1000 个真实漏洞。输入:GitHub 代码仓库与 Issue;输出:包含根因、症状等多维标签的漏洞数据集。
    • 多维特征实证分析:从根因、症状、受影响组件等维度构建分类体系。输入:漏洞数据集;输出:12 项关于框架漏洞特征的实证发现及针对性的测试指导方针。
    • 测试工具 TenFuzz 实现:基于研究总结出的指导方针,设计并实现自动化的测试用例生成原型工具。输入:变异算子与启发式规则;输出:新的测试模型及检测到的漏洞。

NNSmith (2023)

  • 来源:2023年 ASPLOS,论文链接
  • 测试对象:深度学习编译器(如 TVM, TensorRT, ONNXRuntime 等)
  • 痛点:现有工具难以生成既满足算子间复杂语义约束(形状/类型/属性)又具备多样性的深度学习模型,导致编译器优化逻辑覆盖不足。
  • 方法:
    • 符号化模型合成:利用轻量级算子规范和约束求解,自底向上生成满足复杂语义约束的有效模型(输入:算子规范;输出:有效模型结构)。
    • 梯度驱动输入搜索:通过梯度下降寻找能规避执行中浮点异常(如 NaN/Inf)的输入数据,确保测试有效性(输入:生成的模型;输出:安全的模型输入)。先随机一组输入数据和权重,按照顺序执行看第一个报错的地方是哪里,然后根据梯度机制,看往哪边修正能让参数往正确的地方偏移。一直做这个事情,直到整个路径都跑通。
    • 差分测试:对比不同编译器后端或优化前后的输出一致性来定位潜在的语义漏洞(输入:模型与输入数据;输出:Bug 报告)。

大概可以这样表示:

while 还在测试时间内: # 外层循环:追求“模型多样性”
    1. 生成一个“结构合法”的新计算图
    
    # 内层循环:追求“数值有效性”
    while 还没找到不产生 NaN/Inf 的参数 and 没超时:
        a. 运行当前模型,捕获第一个报错的算子
        b. 根据该算子的损失函数计算梯度
        c. 沿着梯度方向微调参数 (X, W)
        
    if 成功找到合法参数:
        2. 编译并运行这个模型 (在待测编译器和参考后端上)
        3. 比较两者的输出
        4. 如果结果不一致或编译器挂了,记录一个 Bug

NEURI (2023)

  • 来源:2023年ICSE,论文链接
  • 测试对象:深度学习框架 (TensorFlow, PyTorch)
  • 痛点:现有模型生成器由于缺乏普遍建模算子约束的能力,仅能支持极少数算子,导致生成的模型多样性严重不足。
  • 方法:
    • 追踪收集:从多源渠道收集API的有效与无效调用序列,输入为API使用数据,输出为API追踪。
    • 约束推断:利用归纳程序合成从追踪序列中自动推断算子的语义约束,输入为API追踪,输出为约束规则。
    • 混合生成:结合符号化搜索与具体算子实例化生成满足约束的多样化模型,输入为推断出的约束,输出为有效的深度学习模型。
赞赏