Home
avatar

.Wang

在提交代码前AI检测

最近是有一个想法,就是在提交代码前,检测暂存区的代码是否存在一些可以优化或者漏洞的地方,使用 AI 让其检测其安全性, 并让其给出一个简单的检测报告,高风险代码有哪些等,如果存在一些风险问题,那么禁止提交。

检测暂存区的代码是否有变动

我们需要node的子进程 child_process 模块,去检测暂存区的代码是否有变动

// checkDiff
import { execSync } from "node:child_process";
const isChange = execSync("git diff --cached --name-only").toString().trim();
if (!isChange) {
	console.log("暂存区没有代码变动");
	process.exit(0);
}

需要获取到暂存区变动的代码内容

我们需要node的子进程 child_process 模块,去获取暂存区的代码内容

// getDiff
import { execSync } from "node:child_process";
const diff = execSync("git diff --cached").toString();
if (!diff) {
	console.log("暂存区没有代码变动");
	process.exit(0);
}
console.log(diff); // diff 就是变动的代码,后期我们需要将其给到Ai

AI 检测代码

这里我使用了免费的AI 接口

// text 就是 diff变动的代码
function codeReview(text: string) {
	return new Promise(resolve => {
		fetch("https://api.siliconflow.cn/v1/chat/completions", {
			method: "POST",
			headers: {
				"Content-Type": "application/json",
				Authorization: "Bearer 这里是你申请的api密钥",
			},
			body: JSON.stringify({
				model: "Qwen/Qwen3-8B", // 模型名称
				messages: [
					{
						role: "user",
						content: text,
					},
				],
			}),
		})
			.then(res => res.json())
			.then((res: any) => {
				// 获取结果
				return resolve(res.choices[0].message.content);
			})
			.catch(error => {
				console.log(error);
			});
	});
}

AI 提示词/规则

export const getPrompt = (diff: string) => {
	return `
    你是一名代码审核员,专门负责识别git差异中代码的安全问题和质量问题。您的任务是分析git 差异,并就代码更改引入的任何潜在安全问题或其他重大问题提供详细报告。
    这里是代码差异内容:
    ${diff}
    请根据以下步骤完成分析: 
      1.安全分析: 
      - 查找由新代码引发的一些潜在的安全漏洞,比如: 
        a)注入缺陷(SQL注入、命令注入等) 
        b)认证和授权问题

    2. 代码逻辑和语法分析:
      -识别任何可能导致运行时错误的逻辑错误或语法问题,比如:
      a)不正确的控制流程或条件语句
      b)循环使用不当,可能导致无限循环

    3. 报告格式:
      对于每个发现的问题,需要按照严重等级分为高/中/低。
      每个问题返回格式如下:
      -[严重等级](高中低)- [问题类型](安全问题/代码质量) - 问题所在文件名称以及所在行数
    - 问题原因 + 解决方案

    4. 总结:
      在列出所有单独的问题之后,简要总结一下这些变化的总体影响,包括:
        -发现的安全问题数量(按严重程度分类)
        -发现的代码质量问题的数量(按严重性分类)

    请现在开始你的分析,并使用指定的格式陈述你的发现。如果没有发现问题,请在报告中明确说明。
    输出应该是一个简单的结论,无论是否提交这些更改,都不应该输出完整的报告。但是要包括文件名。并将每行标识的问题分别列出。

    如果存在高等级的错误,就需要拒绝提交
    回答里的结尾需要单独一行文字 "COMMIT: NO" 或者 "COMMIT: YES" 。这将用来判断是否允许提交
  `;
};

测试用例

async function main() {
	checkDiff(); // 检测代码是否有变化, 第一步
	const diff = getDiff(); // 获取代码变化, 第二步
	const text = getPrompt(diff); // 获取提示, 第三步
	const res = await codeReview(text); // 获取代码审核结果, 第四步
	console.log(res); // 打印结果
}
技术调研