补丁差异分析功能

功能概述

当使用 --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 处(已适配目标版本代码)
ℹ️  行号调整:已适应目标版本的代码位置

--------------------------------------------------------------------------------
[补丁内容]
...

技术实现

核心组件

  1. patch_diff_analyzer.py - 补丁差异分析器

    • parse_patch() - 解析 unified diff
    • analyze_patch_differences() - 对比差异
    • generate_difference_summary() - 生成摘要
  2. 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  # 实质性修改

使用建议

✅ 推荐场景

  1. 生产环境 CVE 修复 - 仔细审查所有修改
  2. 首次使用 LLM - 了解 LLM 的工作质量
  3. 复杂补丁 - 涉及多个文件、多处修改的情况

⚠️ 注意事项

  1. 实质性修改需要特别关注

    • 如果看到 ⚠️ 警告,务必仔细检查新增的代码
    • 确认这些修改是合理的,不是 LLM 的幻觉
  2. 上下文调整是正常的

    • 因为目标版本的代码上下文不同
    • 只要核心修改一致就没问题
  3. 行号变化无需担心

    • 这是正常的适配过程
    • LLM 自动完成了这个工作

优势

特性 传统方式 智能摘要
信息呈现 完整两个 diff,信息过载 提炼关键点,一目了然
理解成本 需要手动对比 自动标注重点
审查效率 低,容易遗漏 高,重点突出
信任建立 难以评估 LLM 工作 透明展示所有修改

未来扩展

可能的增强方向:

  1. 并排对比模式 - 适合宽屏终端
  2. 颜色高亮 - 用颜色区分变更类型
  3. 统计信息 - 显示修改行数、文件数等
  4. 风险评估 - 自动评估修改的风险等级

相关文件

  • 分析器:src/cvekit/utils/patch_diff_analyzer.py
  • 集成点:src/cvekit/utils/apply_patch.py (第 870 行左右)
  • 使用文档:docs/llm_conflict_confirm.md