Page 90 - 《软件学报》2025年第4期
P. 90

1496                                                       软件学报  2025  年第  36  卷第  4  期


                 分测试的错误和误报. 然而, 由于有限的           30  个测试输入模型, CRADLE     仅覆盖了    TensorFlow  中的  59  个深度学习
                 库  API.
                    LEMON  [66] 技术在  CRADLE [65] 基础上进一步提出应用模型级别的变异规则对深度学习库进行更深入的测试.
                 然而, 由于  LEMON  模型级别的变异规则受到深度学习库              API 参数以及输入输出形状的严格限制            (如  LEMON  论
                 文中所述, 变异规则中的一个明确限制是插入的               API 的输出形状和输入形状必须相同), 在实际中仅有一小部分具
                 有固定参数的     API 可以满足规则限制用于模型级别变异. 这在很大程度上影响了                     LEMON  挖掘深度学习库缺陷
                 的能力. Wei 等人   [67] 后续的研究表明, LEMON   的各种变异规则只能额外覆盖           5  个深度学习库    API. 2020  年, Guo
                 等人  [68] 提出了测试技术   AUDEE, 其思路和    LEMON  接近, 同样通过添加模型级别的变异规则尝试深入探索深度
                 学习库的漏洞. 与     LEMON  变异规则不同的是, AUDEE       专注于变异层、权重张量和输入张量的参数, 但是这样的
                 变异规则也受到严格的限制, 实际的效果较为有限.
                    为进一步解决深度学习库模型级别变异的约束问题, Muffin                [69] 尝试手动注释  API 约束. 此外, Muffin  使用预定
                 义的代码结构来生成多样化的模型, 以保持测试输入模型的有效性. 为更准确地进行差分测试, Muffin                           将模型训练
                 阶段划分为    3  部分  (即前向计算, 损失计算和梯度计算), 并相应地设计一套在数据跟踪上的度量, 以衡量不同深度
                                                      Python
                 学习库的结果的一致性. 然而         Muffin  需要手动注释   API 约束, 导致其应用成本高昂, 并且该技术在使用大型深度
                 学习模型作为输入时存在运行效率低, 随机误报漏洞等缺点, 限制了该技术的应用场景.

                 2.2.2    API 级别测试
                    与先前的深度学习库模型级别测试技术不同, API 级别测试技术并不使用模型作为测试输入, 而是将调用深
                 度学习库   API 的片段代码作为测试输入, 对深度学习库单个               API 进行更加精细的测试. 但是       API 级别测试技术也
                 同样面临深度学习库        API 的参数复杂和输入输出形状约束的挑战. 为解决这个问题, FreeFuzz                [67] 从文档、开发人
                 员测试代码和     202  个深度学习模型的代码片段中动态跟踪             API 执行信息, 进而构建每个      API 的值空间, 再通过对
                 API 值空间的挖掘构建合法测试输入以进行模糊测试. 实验结果表明, FreeFuzz 可以覆盖                    PyTorch 和  TensorFlow  中
                 1 158  个  API.
                    DocTer [70] 与  FreeFuzz 类似, 同样将注意力集中在单个    API 的测试以及约束信息提取中. 与         FreeFuzz 不同的
                 是, DocTer 更多地利用了深度学习库的文档信息, 通过人工构建提取规则, 从深度学习库                       API 文档中提取    API 特
                 定的输入约束, 并使用这些约束构建用于测试的输入. 然而, 在应用中                   DocTer 需要对  30%  的深度学习库    API 进行
                 手动注释, 高昂的人工成本限制了          DocTer 技术进一步的发展和应用.
                    在  FreeFuzz 的基础上, Deng  等人进一步发现大量深度学习库          API 共享相似的输入输出形状和约束. 因此, 通
                 过合理调用    API 的输出作为其他      API 的输入, 即可测试其他关联的        API. 基于这样的思路, 研究者实现了可以自动
                 化  API 输入关系推断的深度学习库模糊测试技术              DeepREL [71] . 实验结果表明, 在  PyTorch  和  TensorFlow  两个深
                 度学习库上, DeepREL   可以覆盖    2 973  个  API, 达到了  API 级别测试的最优效果.

                 2.2.3    传统技术所面对的关键挑战
                    尽管目前的模型级别和         API 级别的深度学习库测试技术经过了多轮迭代优化和改进, 在变异规则和                        API 约
                 束推断上有显著的进步, 深度学习库           API 约束的复杂性仍然是这两类工具面对的主要挑战.
                    具体来说, 深度学习库       API 是基于动态语言           实现暴露给用户的, 这使得直接获取           API 的输入和输出参
                 数类型非常困难. 此外, 深度学习库          API 大量使用张量    (多维数组) 作为输入, 如果形状不匹配           (例如, 维度不匹配
                 的矩阵乘法) 可能导致运行时错误. 传统的程序合成技术通常局限于程序语言中的部分功能和特性, 并且无法处理
                 具有特定输入输出参数的深度学习库             API. 因此, 目前部分深度学习库测试技术使用预定义的语法规则, 专注于突
                 变部分程序尝试挖掘漏洞. 然而, 这限制了测试输入中代码结构和输入类型的多样性. 例如, FreeFuzz 只能通过挖
                 掘开源代码片段来收集目标          API 的有效参数空间      (例如, 输入张量的类型和形状) 对初始种子进行细微的突变以
                 生成新的测试输入. 这样的方式导致现有的测试技术无法有效探索                      API 输入空间以及挖掘潜在的漏洞.
                    此外, 虽然   API 级别的测试技术在覆盖率和发现漏洞的数量方面显著优于模型级别的测试. 但这些技术所面
                 对的挑战在于, 它们通常仅利用简单突变的代码片段                 (往往仅为单行代码) 作为测试输入, 因而限制了它们在检测
   85   86   87   88   89   90   91   92   93   94   95