Page 193 - 《软件学报》2026年第7期
P. 193
2878 软件学报 2026 年第 37 卷第 7 期
请根据下列对程序的功能描述, 以及测试用例输入, 为程序生成预期输出.
程序功能描述:
该函数名为log_message, 包含两个字符串参数: char*user_message以及
char*error_code, 用于在软件运行过程中记录不同类型的日志信息. 当用户
消息 (user_message) 不等于错误码 (error_code) 时, 系统将该消息视为普通
信息并记录. 当用户消息等于错误码时, 程序会进一步判断其内容以确定是
否记录错误日志: 若用户消息的第2个字符 (下标为1) 为 'E',表明该消息为程
序错误 (Program error) 信息, 此时程序会记录错误日志, 并注明该错误是由
程序错误导致的.若用户消息的第3个与第4个字符的ASCII码之和等于65,
则表示系统在运行过程中已累计产生65条警告信息, 此时程序也会记录错
误日志, 并注明该错误是由过多警告 (Too many warnings) 导致的. 在每次日
志记录时, 程序应当仅记录一种错误原因, 即在 “程序错误” 与 “过多警告”
这两种情形中选择其一: 若存在程序错误,则优先记录 “程序错误” 作为错
误原因; 仅在不存在程序错误的前提下, 且警告计数达到特定阈值时, 记录
“过多警告” 作为错误原因.
测试用例输入:
user_message=''ABCD'', error_code=''ABCE''
user_message=''ABCD'', error_code=''ABCD''
user_message=''AECD'', error_code=''AECD''
user_message=''AE D'', error_code=''AE D''
user_message=''AB !'', error_code=''AB !''
user_message=''AE !'', error_code=''AE !''
程序预期输出:
图 5 GPT 生成图 1 预期输出的提示词示例
为了提高生成的预期输出的准确性, 我们使用 GPT 多次生成输出, 并选择出现频率最高的输出作为预期输出:
GPTCompute(desc,in i ) = out i1 ,out i2 ,... (4)
exp_out = max_freq(out i1 ,out i2 ,...) (5)
i
GPT 通过图 5 中的提示词, 为图 1 的 6 条测试用例输入生成的预期输出分别为: (1) Info: ABCD; (2) 无输出;
(3) Error: Program error; (4) Error: Program error; (5) Error: Too many warnings; (6) Error: Program error.
接下来, 我们将 GPT 生成的预期输出提取出来, 每个测试输入 in i 及其对应的预期输出 exp_out i 都会被组合
成一个测试用例对 (in i , exp_out i ), 最终所有测试用例对会形成一个完整的测试用例集 T:
T = {(in 1 ,exp_out ),(in 2 ,exp_out ),...} (6)
1
2
从缺陷检测的角度来看, 如果程序 P 可以在所有测试用例对上都通过测试 (如公式 (7) 所示), 我们就认为它
通过了缺陷检测. 通过检测的程序片段可被用于构造各类智能化基础软件. 本文方法使用公式 (7) 对 LLM 生成的
p = c/n 计算程序集的测试通过率 (其中, c 为通过检测
程序进行功能性测试, 检测生成代码中的缺陷, 并根据公式
的程序数量, n 为 LLM 生成的程序总数):
∀(in,exp_out) ∈ T, P(in) = exp_out (7)
2.5 方法复杂性分析
我们对方法的时间复杂度与空间复杂度进行分析. 设 LLM 生成的程序为 P, 其函数参数数量为 n, 程序 P 中
包含 k 个依赖于符号输入的条件分支, 变异方法生成的测试用例数量为 m.
● 时间复杂度. 本文方法的时间复杂度可表示为:
k
k
T = O(m·C mut_seed +2 ·C sym +(m+2 )·C run_test ) (8)
其中, C mut_see 表示阶段 2 通过变异生成单个测试输入的时间开销. C sy 表示阶段 3 符号执行过程中收集并求解
d
m
一组路径约束所需的时间开销, 越复杂的约束求解时间越长. 2 表示在 k 个条件分支下符号执行可能探索的路径
k
数上界. C run_tes 表示阶段 4 执行单个测试用例的时间开销.
t
● 空间复杂度. 本文方法的空间复杂度可表示为:
k
k
S = O(m·S mut_seed +2 ·S sym +(m+2 )·S run_test ) (9)
其中, S mut_see 表示阶段 2 通过变异生成单个测试输入的空间开销. S sy 表示阶段 3 符号执行过程中收集路径约束
m
d
并进行求解所需的空间开销. S run_tes 表示阶段 4 执行单个测试用例的空间开销.
t

