Page 190 - 《软件学报》2026年第7期
P. 190
赵祖威 等: 软件供应链安全中 LLM 生成代码逻辑性缺陷检测 2875
测试用例集
提示词: 自然语言描述
+函数模版 GPT 程序预期输出 阶段4:
阶段2:
缺陷检测
EvalPlusҩ൫ൻೆളӮ EvalPlus生成的输入
阶段1:
+模糊测试 SymExGen生成的输入
LLM代码生成 Int sample_11 (input){
Int sample_56 (input){
阶段3:
···
基于符号执行的过程 }
通过验证的程序
Int sample_0 (input){
符号挂载
符号执行
Int sample_1 (input){
Int sample_2 (input){
智能化基础软件
··· 可供符号执行
} 的程序
LLM生成的程序
图 2 软件供应链安全中的 LLM 生成代码逻辑性缺陷检测方法
在阶段 1, LLM 会根据用户提供的自然语言描述和函数模板生成代码, 以构建软件供应链中的不同组件和模
块. 此阶段输出的代码为后续测试流程的输入. 之后, 方法进入阶段 2, 使用 EvalPlus 方法生成大量测试用例输入.
接下来, 流程并行化进入阶段 3, 即基于符号执行的过程, 这是本文方法的核心部分. 在此阶段, 我们设计并实现了
一个符号执行挂载流程, 使符号执行引擎能够自动适配 LLM 生成的程序, 收集程序中的符号约束. 这些约束条件
由符号执行引擎中的 SMT 求解器进行求解, 生成符号执行测试用例输入. 最终, 阶段 2 和阶段 3 生成的所有测试
输入, 与由 GPT 模型推理得到的程序预期输出一同进入阶段 4, 对 LLM 生成的程序进行全面的缺陷检测.
2.1 阶段 1: LLM 代码生成
当用户使用本文框架检测 LLM 生成的程序时, 首先需要由 LLM 生成代码. 在该阶段, LLM 根据用户提供的
提示词生成具体实现代码, 这些代码可被进一步用于构造软件供应链中的各类基础软件, 例如: 日志系统、机器学
习训练框架和推理引擎等. 在本文方法中, 为了保证 LLM 代码生成的全面性, 我们为所有 LLM 设置了统一的代
码生成提示词模板, 如图 3 所示, 使其更准确地描述所有必要的代码逻辑.
请根据注释中的任务描述, 用适当的C++代码补全省略号部分.
/*
你的任务是编写一个函数, 当整数x是n的幂时返回true, 否则返回false.
当存在某个整数k, 使得n的k次幂等于x, 即n^k = x时,称x是n的幂.
例如:
is_simple_power(1, 4) => true
is_simple_power(2, 2) => true
is_simple_power(8, 2) => true
is_simple_power(3, 2) => false
is_simple_power(3, 1) => false
is_simple_power(5, 3) => false
*/
#include <stdio.h>
#include <math.h>
using namespace std;
bool is_simple_power (int x, int n) { ... }
图 3 LLM 代码生成提示词模板
按照该模板, 每个提示词被划分为 3 个部分: 任务说明、需求注释以及代码接口. 任务说明在模板中固定为:
“请根据注释中的任务描述, 用适当的 C++代码补全省略号部分.” 这段文本明确了我们期望 LLM 如何完成代码生
成任务. 需求注释部分以 C++注释的形式, 提供了函数的目标、功能需求、逻辑提示以及输入输出示例, 用以确

