Code Change Impact Analyzer
这是一个面向 C 语言项目的 VS Code 代码变更影响分析插件。它会比较当前文件与上一次成功分析时的内容,再让多种分析方法检测并计算综合分并提示更值得检查的代码位置。
当前工作流程
- 插件识别新增、删除和修改的真实代码行。
- 总控用 Tree-sitter 判断变更所在函数以及函数、变量、类型、字段和宏等标识符角色,再用精确文本匹配兜底,在工作区
.c、.h 文件中形成初步候选。
- 当前本地 CodeT5+ 110M 模型和静态启发式规则分别给初步候选评分。
- 克隆检测扫描整个工作区的函数,可以补充初筛没有找到的相似函数入口。
- 历史分析读取当前项目最近 200 次 Git 提交,可以补充过去经常与修改函数一起变化的函数入口。
- 总控按文件路径和行号合并证据,计算综合分、过滤低分结果并排序。
- VS Code 验证文件、工作区边界和行号,再显示结果、高亮代码并允许点击跳转。
五种评分
| 方法 |
权重 |
评分方法 |
| 初步筛选 |
15% |
按函数调用、写入、类型、宏、读取等关系从 0.50~0.78 起分;同一行多命中继续加分,最高 0.90 |
| CodeT5+ 模型 |
35% |
max(0, 余弦相似度),限制在 0~1 |
| 静态分析 |
20% |
基础 0.40;按赋值、调用、返回、控制流、指针、资源、错误处理等可解释规则增减,限制在 0~1 |
| 克隆检测 |
15% |
修改函数与全项目函数的文本序列相似度,达到 0.60 才形成证据 |
| 历史分析 |
15% |
两个函数共同变化次数 ÷ 修改函数总变化次数,达到 0.40 才形成证据 |
综合分只计算实际存在的证据:
综合分 = Σ(单项分 × 权重) ÷ Σ(实际提供证据的方法权重)
- 综合分达到
0.45 时正常保留。
- 普通候选低于
0.45 时删除。
- 克隆检测或历史分析发现的候选即使低于
0.45 也会保留,并在侧边栏标明原因。
- 某个分析方法失败时,该方法不参与本次综合分,其余方法继续运行。
初步筛选详细规则
初筛优先避免漏报。即使修改行只有 return 2;,没有直接出现函数名,也会找到该行所在函数,再寻找调用该函数的位置。Tree-sitter 不可用或代码尚未写完整时,仍使用排除注释和字符串后的精确名称匹配兜底。
| 命中关系 |
初筛基础分 |
| 直接函数调用 |
0.78 |
| 函数声明或定义 |
0.74 |
| 取地址或函数指针引用 |
0.72 |
| 变量写入、更新 |
0.70 |
| 宏使用或条件编译 |
0.68 |
| 类型或结构体字段使用 |
0.66 |
| 变量读取 |
0.60 |
| 包含被修改头文件 |
0.58 |
| 文本兜底命中 |
0.50 |
同一行每多命中一个变更标识符加 0.05,最高 0.90。两字符名称(例如 fd)只在语法结构确认其角色时采用;单字符局部变量不会扩大候选,但语法树确认的一字符函数/宏仍保留。超过 500 条时不再“先到先得”,而是优先保留调用、函数指针等分数更高的结构关系。
静态分析详细规则
静态分从 0.40 开始:赋值 +0.14、自增/自减 +0.10、返回值 +0.14、函数调用 +0.12、条件分支 +0.10、循环 +0.08、指针/成员访问 +0.10、数组访问 +0.08、内存或资源操作 +0.15、并发或外部副作用 +0.12、错误处理 +0.10、static/extern 状态 +0.08、sizeof 或显式类型转换 +0.06、附近上下文风险 +0.05。只有日志输出而没有写入、资源或控制行为时减 0.12。
规则先去除注释、字符串和字符字面量,所以 == 不会被当成赋值,returnValue 不会被当成 return,字符串中的 free(ptr) 也不会被当成资源操作。
当前能力
- 保存 C 文件时自动分析,也可以从侧边栏手动触发。
- 支持修改、插入、删除以及多个分离的文本变化区间。
- 使用真实工作区文件和行号,不让模型虚构位置。
- 使用 Tree-sitter 提取真实 C 函数,并让克隆、历史结果指向函数入口行。
- 初筛使用 Tree-sitter 识别调用、声明、读写、指针、类型、字段和宏;修改头文件时还会查找直接包含它的源码。
- 历史规则按“工作区路径+Git HEAD”缓存在 VS Code 插件全局存储目录;提交未变化时直接复用。
- 结果按综合分排序,显示各方法单项分和强制保留原因。
- 点击结果可以跳转到源码位置,并在编辑器中显示修改行和候选行高亮。
- 校验真实路径,拒绝符号链接或目录联接造成的工作区越界结果。
- 文档再次编辑时取消等待中的旧请求;已经开始的请求完成后丢弃结果,不结束常驻 Python 和已加载模型。
- 对 Python 进程设置超时、输出上限和严格的 schema 3 通信格式校验。
- PyTorch、模型、Tree-sitter 或 Git 中任一部分不可用时安全降级,并在分析说明中显示原因。
重要限制
- 初步筛选虽然增加了语法角色和文本兜底,但仍不是完整的 C 编译器调用图,复杂宏、别名和函数指针目标可能不完整。
- 静态分析是可解释的行级与邻近上下文规则,不是完整的跨函数数据流和控制流证明。
- 克隆检测使用函数文本序列相似度,代码结构相似不代表业务含义一定相同。
- 历史分析依赖当前项目的 Git 提交质量;没有 Git 历史时不会产生历史证据。
- CodeT5+ 相关度是语义相似度,不是真实的受影响概率。
- 插件打开文件时的内容是第一次比较基准,目前不会自动把 Git
HEAD 内容作为编辑基准。
使用方法
- 使用 VS Code 打开一个包含 C 源码的文件夹。
- 打开一个
.c 或 .h 文件,插件会记录此时的内容作为比较基准;被 VS Code 识别为 C++ 模式的 .h 也支持。
- 修改并保存文件,或者点击侧边栏中的“运行真实变更分析”。
- 在“真实变更行”“候选影响位置”和“分析说明”中查看结果。
- 点击候选位置可直接跳转到对应源码行。
安装 Python 与模型依赖
插件的静态、克隆和历史分析需要本机 Python;CodeT5+ 评分还需要 PyTorch、Transformers 和单独下载的可信模型。VSIX 不会修改系统 Python,也不会自动安装大型模型。
先确认终端能够运行 Python:
python --version
CPU 用户可以安装 CPU 版 PyTorch:
python -m pip install torch --index-url https://download.pytorch.org/whl/cpu
python -m pip install -r requirements-base.txt
NVIDIA GPU 用户应先根据 PyTorch 官方安装选择器 安装与本机驱动匹配的 PyTorch,再执行:
python -m pip install -r requirements-base.txt
requirements-model.txt 是本项目开发电脑验证过的 CUDA 12.6 锁定环境,只适合需要复现该环境的开发者,不是所有用户的默认安装命令。
随后在 VS Code 用户或工作区设置中填写自己的真实路径,例如:
{
"codeChangeAnalyzer.pythonPath": "C:\\Path\\To\\Python\\python.exe",
"codeChangeAnalyzer.modelPath": "C:\\Users\\YourName\\Models\\codet5p-change-impact",
"codeChangeAnalyzer.enableModelReranking": false,
"codeChangeAnalyzer.modelDevice": "auto",
"codeChangeAnalyzer.analysisTimeout": 120
}
正式微调模型下载地址和 SHA-256 将在模型仓库公开后写入此处。在此之前,公开安装包只能使用用户自己持有且信任的兼容模型目录;不要从不明网盘或陌生仓库加载模型。
首发版本默认关闭模型评分。用户准备好可信模型后,先运行“选择本地模型文件夹”和“检查本地模型”,再把 enableModelReranking 改为 true。auto 优先使用 CUDA,没有 CUDA 时使用 CPU;cpu 强制使用 CPU;cuda 强制使用显卡。指定设备不可用时,模型评分会被跳过,其他分析继续执行。
性能说明
- 每次分析最多扫描 5000 个
.c、.h 文件。
- 单个扫描文件最大 2 MiB。
- 初筛最多保留 500 个候选;超过上限时优先保留分数更高的结构关系。
- 每个源码快照在初筛中最多进行一次 Tree-sitter 解析;解析失败的文件继续走文本兜底。
- CodeT5+ 沿用当前最多 200 个候选的批量评分限制。
- 历史分析最多读取最近 200 次提交,Git
HEAD 不变时使用缓存。
- Python 后端在第一次分析时按需启动并保持常驻;CodeT5+ 第一次使用时加载约 538 MB 权重,后续分析复用同一个模型实例。
- 分析超时、Python 崩溃或通信格式损坏时,插件会关闭失效进程,并在后续请求时自动启动新进程。
- 修改 Python 路径、分析超时或模型设备设置时,旧进程会退出并释放模型,下一次分析重新启动。
设置
codeChangeAnalyzer.enable:插件总开关。
codeChangeAnalyzer.analysisOnSave:保存时自动分析,默认开启。
codeChangeAnalyzer.pythonPath:运行分析后端的 Python 路径,默认 python。
codeChangeAnalyzer.enableModelReranking:是否使用当前本地 CodeT5+ 模型;首发版本默认关闭,选择并检查可信模型后再开启。
codeChangeAnalyzer.modelPath:本地微调模型文件夹;可通过命令面板的“Code Change Analyzer: 选择本地模型文件夹”设置。
codeChangeAnalyzer.modelDevice:模型设备,可选 auto、cpu、cuda。
codeChangeAnalyzer.analysisTimeout:单次分析最长时间,范围 5~300 秒。
codeChangeAnalyzer.enableHighlight:是否高亮修改行和候选行。
codeChangeAnalyzer.modifiedLineColor:修改行背景色。
codeChangeAnalyzer.affectedLineColor:候选影响行背景色。
开发验证
运行完整普通测试:
npm test
单独验证真实 CodeT5+ 模型:
& "C:\Python313\python.exe" tests_python\smoke_model_ranker.py
运行包含真实 Python 总控的模型冒烟测试:
& "C:\Python313\python.exe" tests_python\smoke_main_controller.py
运行包含临时 Git 历史、五种评分方法和真实模型的联合冒烟测试:
& "C:\Python313\python.exe" tests_python\smoke_multi_engine_git.py
验证一个常驻进程连续处理两次真实模型请求:
& "C:\Python313\python.exe" tests_python\smoke_persistent_worker.py
安装 VSIX 后,先下载或复制完整的模型文件夹,然后在命令面板中依次运行:
Code Change Analyzer: 选择本地模型文件夹
Code Change Analyzer: 检查本地模型
检查命令会验证必需文件、Python 依赖、CPU/CUDA 设备,并真正运行一次小型模型推理。模型不可用时,词法、静态、克隆和历史分析仍会继续。
当前 CodeT5+ 模型格式会执行模型目录内的 Python 定义文件,因此只能选择你信任的模型来源。
当前 .vscodeignore 会排除 model_assets,打包的 VSIX 不会包含约 538 MB 的模型文件;安装后可通过 modelPath 或文件夹选择命令使用电脑上已有的模型。其他根目录 Python 运行模块会随扩展打包。
隐私与安全
- 当前版本在本机读取工作区代码、Git 历史和本地模型,不把源代码发送到远程模型服务。
- 模型目录中的自定义 Python 定义文件会在本机执行,因此只能选择来源可信且经过校验的模型。
- 提交问题或日志前,请删除用户名、私有路径、仓库机密和访问令牌。
- 模型与插件代码分别发布和授权;安装插件不等于自动获得微调模型的再分发许可。
安装包内还提供 SUPPORT.md(支持与问题反馈准备说明)和 THIRD_PARTY_NOTICES.md(第三方模型与依赖说明)。公开代码仓库建立后,再把这两个文件名改成可点击的仓库链接。
后续
- 增加真正的跨文件 C 符号解析、宏处理和调用图。
- 为历史缓存增加后台更新和大型仓库增量索引。
- 增加独立项目测试集,评估跨项目泛化能力和综合分阈值。
- 研究 ONNX、INT8 等轻量化部署方式,并完善 VSIX 模型分发方案。