补丁差异分析功能
功能概述
当使用 --use-llm 参数时(默认行为),系统会自动分析 LLM 修复后的补丁与原始补丁的差异,并向开发者展示智能摘要。
工作原理
1. 补丁解析
系统会解析 unified diff 格式的补丁文件,提取:
- 文件路径
- Hunk 信息(行号、上下文)
- 代码变更(新增、删除、修改)
2. 差异对比
对比原始补丁和修复后补丁,识别:
- 行号变化 - 适应目标版本的代码位置
- 上下文变化 - 周围代码的调整
- 逻辑变化 - 实质性代码修改(需要警惕)
3. 智能摘要
根据差异类型生成易读的摘要信息。
显示效果示例
场景 1:仅行号调整(最常见)
================================================================================
LLM 生成的补丁内容如下,请确认是否应用:
================================================================================
【补丁变更摘要】
✓ 补丁仅调整了行号,核心修改与原始补丁一致
--------------------------------------------------------------------------------
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -336,12 +336,12 @@ void blk_mq_quiesce_tagset(struct blk_mq_tag_set *set)
{
struct request_queue *q;
- mutex_lock(&set->tag_list_lock);
+ rcu_read_lock();
...
================================================================================
是否应用此补丁?(y/n/edit):
场景 2:上下文调整
【补丁变更摘要】
ℹ️ 上下文调整:3 处(已适配目标版本代码)
ℹ️ 行号调整:已适应目标版本的代码位置
--------------------------------------------------------------------------------
[补丁内容]
...
场景 3:发现实质性修改(警告)
【补丁变更摘要】
⚠️ 警告:发现以下实质性修改(可能影响行为):
Hunk 1: 新增代码 'if (unlikely(copied < 0))...'
Hunk 2: 新增代码 'WARN_ON_ONCE(...)...'
ℹ️ 上下文调整:2 处(已适配目标版本代码)
ℹ️ 行号调整:已适应目标版本的代码位置
--------------------------------------------------------------------------------
[补丁内容]
...
技术实现
核心组件
-
patch_diff_analyzer.py - 补丁差异分析器
parse_patch()- 解析 unified diffanalyze_patch_differences()- 对比差异generate_difference_summary()- 生成摘要
-
apply_patch.py - 集成到确认流程
if llm_confirm: # 分析补丁差异 diff_analysis = analyze_patch_differences(patch_content, result.patch_content) diff_summary = generate_difference_summary(diff_analysis) # 显示摘要和完整补丁 logger.info("\n【补丁变更摘要】") logger.info(diff_summary)
差异检测算法
行号变化检测
if original.old_start != resolved.old_start:
line_number_changed = True
上下文变化检测
if set(original.context_lines) != set(resolved.context_lines):
context_changed = True
逻辑变化检测
if set(original.added_lines) != set(resolved.added_lines):
logic_changed = True # 实质性修改
使用建议
✅ 推荐场景
- 生产环境 CVE 修复 - 仔细审查所有修改
- 首次使用 LLM - 了解 LLM 的工作质量
- 复杂补丁 - 涉及多个文件、多处修改的情况
⚠️ 注意事项
-
实质性修改需要特别关注
- 如果看到
⚠️ 警告,务必仔细检查新增的代码 - 确认这些修改是合理的,不是 LLM 的幻觉
- 如果看到
-
上下文调整是正常的
- 因为目标版本的代码上下文不同
- 只要核心修改一致就没问题
-
行号变化无需担心
- 这是正常的适配过程
- LLM 自动完成了这个工作
优势
| 特性 | 传统方式 | 智能摘要 |
|---|---|---|
| 信息呈现 | 完整两个 diff,信息过载 | 提炼关键点,一目了然 |
| 理解成本 | 需要手动对比 | 自动标注重点 |
| 审查效率 | 低,容易遗漏 | 高,重点突出 |
| 信任建立 | 难以评估 LLM 工作 | 透明展示所有修改 |
未来扩展
可能的增强方向:
- 并排对比模式 - 适合宽屏终端
- 颜色高亮 - 用颜色区分变更类型
- 统计信息 - 显示修改行数、文件数等
- 风险评估 - 自动评估修改的风险等级
相关文件
- 分析器:
src/cvekit/utils/patch_diff_analyzer.py - 集成点:
src/cvekit/utils/apply_patch.py(第 870 行左右) - 使用文档:
docs/llm_conflict_confirm.md