Page 196 - 《软件学报》2026年第7期
P. 196

赵祖威 等: 软件供应链安全中        LLM  生成代码逻辑性缺陷检测                                         2881


                    我们进一步在软件供应链场景中的             Juliet [42] 和  MegaVul [43] 数据集上随机选取了  20  个程序进行了实验评估. 这
                 两个数据集在软件供应链安全研究中被广泛应用, 其中包含大量源自真实开源项目的典型缺陷与安全漏洞. 表                                  4 展
                 示了在这   20  个测试任务上, 不同    LLM  生成程序的平均测试通过率. 实验结果表明, 在供应链数据集上                   SymExGen
                 方法将   HumanEval 和  EvalPlus 方法的平均测试通过率分别从       75.69%  和  64.68%  进一步降低至  47.91%, 这一结果
                 验证了本文方法在真实软件供应链项目中具有有效性.


                                   表 4 各  LLM  在供应链数据集上生成程序的平均测试通过率 (%)

                                      模型            HumanEval      EvalPlus     SymExGen
                                 Claude-3.5-Sonnet    93.22         74.58         57.63
                                     GPT-4o           93.22         79.66         66.10
                                   GPT-4-Turbo        84.75         81.36         62.71
                                 DeepSeek-Coder-V2    83.05         61.02         42.37
                                 DeepSeek-Chat-V2     62.71         57.63         33.90
                                    Yi-Large          64.41         52.54         47.46
                                  Gemini-1.5-Pro      81.36         74.58         59.32
                                  Claude-3-Opus       85.19         75.93         38.89
                                     GLM-4            66.10         57.63         47.46
                                  Gemini-1.5-Flash    61.02         47.46         33.90
                                  Claude-3-Sonnet     57.63         49.15         37.29

                    对于未通过缺陷检测的程序, 我们进一步对其中的缺陷类型进行了分析, 实验结果如表                            5  所示. 从表  5  中可以
                 看出, 本文提出的      SymExGen  方法能够更有效地检测出          LLM  生成代码中的程序崩溃         (crash)、结果不一致
                 (incorrect output) 和运行超时  (timeout) 等缺陷, 相较于  EvalPlus 方法, SymExGen  方法检测出的缺陷总数提升了
                 9.61%. 在这些缺陷中, 结果不一致缺陷占比最高, 约占总数的               75%, 这体现了  LLM  生成程序在功能正确性方面的
                 缺陷较为突出, 而程序崩溃缺陷和运行超时缺陷则分别占比                   17%  和  8%.

                                            表 5 未通过缺陷检测程序的缺陷类型分析

                                                                       缺陷数量
                                  方法       检测出缺陷程序总数
                                                            程序崩溃       结果不一致       运行超时
                                HumanEval        660          153        635         35
                                 EvalPlus        917          185        862         77
                                SymExGen         985          209        925         98

                  3.3   RQ2: 为什么集成了符号执行的方法能更有效地检测出             LLM  生成代码中的缺陷?
                    为了进一步分析为什么         SymExGen  方法能更加有效地检测出        LLM  生成程序中的缺陷, 提升软件供应链的安
                 全性, 本文对代码覆盖率       (code coverage) 这一指标进行了分析. 该指标定义为不同缺陷检测方法所执行的代码数
                 占代码总数的百分比. 表       6  展示了针对不同的代码生成任务, 使用           3  种不同的缺陷检测方法对每个         LLM  生成程序
                 进行测试时的平均代码覆盖率.
                    从表  6  中的数据可以看出, 缺陷检测能力更强的测试方法               (EvalPlus 和  SymExGen) 确实实现了更高的代码覆
                 盖率. 其中, EvalPlus 方法为每个代码生成任务平均生成了            756.6  个测试用例, 而  SymExGen  方法仅生成了   78.9  个.
                 尽管如此, SymExGen    方法的整体平均测试覆盖率达到了              88.07%, 显著高于    HumanEval 方法的   79.88%  和
                 EvalPlus 方法的  84.76%.
                    图  7  展示了所有模型在     166  个代码生成任务上的平均代码覆盖率. 图中较长的黑色柱子表示集成符号执行的
                 方法在提升代码覆盖率方面表现更为突出. 从图中可以看出, 本文方法在其中                        164  个任务上均提升了测试覆盖率.
                 这一覆盖率的显著提升, 使得更多关键路径和边界情况能够被有效执行, 从而增加了缺陷暴露的可能性. 这一结果
                 也进一步验证了集成符号执行的方法能够生成更多具有针对性的边界测试用例, 从而有效提升测试覆盖率, 并增
   191   192   193   194   195   196   197   198   199   200   201