Page 11 - 《软件学报》2025年第12期
P. 11
5392 软件学报 2025 年第 36 卷第 12 期
只需要 3 次精度增强转换和编译执行即可定位到 func 4 . 精度提升定位过程为{<func 4 , func 1 , func 2 , func 3 >, √} →
{< func 4 , func 1 >, √} → {< func 4 >, √}.
(3) 缺乏对多问题文件的精化搜索支持. 当前 PLiner 的实现机制中没有很好地支持多文件程序, 其搜索逻辑中
没有设计如何对定位到的多个问题代码文件进行精化定位. 考虑到实际浮点应用往往包含多个源代码文件, 从提
高工具实用性的角度需要扩展支持多问题文件的精化搜索.
3 浮点指令差异性引导的 Delta-Debugging 搜索定位
3.1 方法框架介绍
为了有效应对现有编译优化结果差异性定位工具存在的不足, 本文给出了浮点指令差异性引导的 Delta-
Debugging 搜索定位方法 FI3D. FI3D 的核心思想是使用 Delta-Debugging 中的回溯机制实现对多源问题代码定位
的支持, 使用函数不同编译选项下浮点指令序列差异性系数来引导搜索进而提升定位效率. 图 3 给出了 FI3D 的框
架图; FI3D 的输入包含待分析程序 P (程序输入为了简洁性略去)、编译优化选项 C 1 和 C 2 ; Execute(P, C) 表示基
于选项 C 编译运行程序 P 的执行结果. 编译优化结果不一致性是指 Execute(P, C 1 )≠Execute(P, C 2 ). 需要指出的是
判定浮点结果一致性会评估两种编译优化模式下运行结果的相对误差是否超过给定的相对误差阈值. 首先, FI3D
内部的指令记录优化遍会记录程序 P 中每个函数 func i 基于编译优化选项 C 1 和 C 2 生成的浮点指令序列 trace i 和
trace ; 接着通过指令序列差异性评估模块计算每个函数的浮点指令序列在不同编译选项下的差异性系数, 过滤掉
′
i
那些不存在差异性的函数, 并将函数按照差异性系数从大到小排列; 最后调用 Delta-Debugging 搜索模块对输入的
函数列表进行搜索定位, 获取导致编译优化结果差异性的代码段.
程序 P 指令记录 {func 1 : trace 1 ; func 2 : trace 2 ; …} 指令序列差
优化遍 ′ ′ 异性评估
选项 C 1 &C 2 {func 1 : trace 1 ; func 2 : trace 2 ; …}
过滤&排序
{func i ; …; func k }
Delta-Debugging 精度提升
搜索引擎 P located 优化遍
P enhanced
C 1 和 C 2 结果是否一致
不一致性 编译&运行
定位报告
图 3 FI3D 编译优化结果差异性问题代码定位框架图
在 FI3D 的框架中, 浮点指令记录优化遍和浮点指令序列差异性评估模块能够过滤掉那些浮点计算行为没有
被激进编译优化改变的文件/函数, 并将浮点计算行为改变程度大的文件/函数放置待搜索文件/函数列表的前部,
这会提升 Delta-Debugging 搜索定位效率 (详情参见第 3.2 和 3.3 节); Delta-Debugging 搜索引擎中的回溯机制能够
很好地解决多源问题代码的定位问题, 内部的精化机制能够不断缩小可疑代码的范围 (详情参见第 3.3 节). 需要
特别指出的是 Delta-Debugging 分层搜索引擎中扩展了对多问题文件的精化定位支持 (详情参见第 3.4 节).
3.2 编译优化浮点指令序列差异性评估
激进编译优化导致程序结果发生改变, 根本原因是改变了程序中的浮点计算行为. 浮点指令序列是浮点计算
行为最直接的描述. 浮点计算行为改变程度越大的函数越有可能是导致程序结果发生改变的原因. 无论是二分搜
索还是 Delta-Debugging, 搜索定位效率与文件/函数的排列顺序有直接关系. 为了提升搜索定位效率, 本文对待搜
索文件/函数进行过滤排序.
以函数级为例, 算法 1 给出了过滤排序过程, 输入包括目标程序 P、函数列表 flist、编译优化选项 C 1 和 C 2 ,
输出包括过滤和排序后的新的函数列表 list. 列表 list 和字典 score_dict 初始为空. 首先, 分别基于编译优化选项

