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
   188   189   190   191   192   193   194   195   196   197   198