ESLint 抓不到的 5 种 AI 代码缺陷 — 我做了一个开源 CI/CD 工具来检测它们

4 阅读3分钟

AI 编码助手正在改变我们写代码的方式,但它们生成的代码有一些传统 Lint 工具完全检测不到的隐患。

背景

你有没有遇到过这种情况:Copilot 生成的代码看起来完美,ESLint 全绿,TypeScript 编译通过,但上线后莫名其妙炸了?

我在审查了上百个 AI 生成的 PR 之后,发现了 5 种反复出现的缺陷模式。这些缺陷的共同特点是:传统 Lint 工具(ESLint、SonarQube、Checkstyle)根本检测不到它们。

5 种 AI 特有的代码缺陷

1. 🤖 幻觉包(Hallucinated Packages)

AI 会生成看起来完全合理的 import 语句,但引用的包在 npm/PyPI 上根本不存在:

import { validateSchema } from 'express-json-validator'
// ❌ 这个包从未在 npm 上发布过

ESLint 说 ✅(语法正确),TypeScript 说 ✅(类型推断),npm install 说 💥。

更危险的是,攻击者可以注册这些"幻觉包名"来进行供应链攻击

2. 📅 过时 API(Stale APIs)

AI 模型的训练数据通常是 2021-2023 年的代码,它们还在生成已经废弃的 API:

过时 API状态替代方案
new Buffer()Node.js 20 已移除Buffer.from()
url.parse()Node.js 11 起已废弃new URL()
app.del()Express 5 已移除app.delete()
moment()官方已停止维护dayjs / date-fns

你的 Lint 工具不知道这些 API 已经「死了」。

3. 🪟 上下文窗口断裂(Context Window Artifacts)

当 AI 跨多个文件生成代码时,会产生矛盾:

// file-a.ts
export function getUser(id: string): User { ... }

// file-b.ts  
const user = getUser(id, { includeRoles: true })
// ❌ 签名不匹配,运行时才会报错

同一个函数,不兼容的签名。通过 Lint,运行时崩溃。

4. 🏗️ 过度工程化(Over-Engineering)

AI 热爱抽象。你要一个邮箱验证函数,它给你一个 ValidatorFactoryBuilder<T> 加 47 行代码。

Factory-of-factory 模式、不必要的泛型、死代码——都是 AI 的「创作」。

5. 🔓 安全反模式(Security Anti-Patterns)

来自训练数据的安全隐患:

  • 硬编码的 API Key(sk-proj-abc123...
  • 禁用 TLS 验证(NODE_TLS_REJECT_UNAUTHORIZED = '0'
  • eval(userInput) 的各种变体

ESLint 能抓到一些常见模式,但 AI 生成的变体往往更「创意」。

解决方案:Open Code Review

我做了一个开源的 CI/CD 质量门,专门检测这些 AI 特有的代码缺陷。

三层检测架构

层级方式说明
L1结构化检测基于 AST 的确定性分析,10 秒内完成,不需要 AI
L2嵌入召回使用 Embedding 模型做向量相似度匹配
L3LLM 深度扫描使用本地 Ollama 或远端 LLM 做跨文件逻辑分析

30 秒接入

npm install -g @opencodereview/cli
ocr scan src/ --sla L1

GitHub Actions 集成

- uses: raye-deng/open-code-review@v1
  with:
    scan-path: src/
    sla-level: L1

GitLab CI 集成

include:
  - component: $CI_SERVER_HOST/fengsen.deng/ai-code-validator/validate@main

关键特性

  • MIT 开源 — 免费,永久免费
  • 100% 本地运行 — 使用 Ollama,数据不出你的机器
  • 10 秒内完成 — L1 扫描极快
  • SARIF 输出 — 标准格式,兼容 GitHub Code Scanning
  • TypeScript/JavaScript — 更多语言即将支持

链接


欢迎 Star ⭐ 和反馈!如果你在 AI 生成的代码中遇到过其他类型的缺陷,也请在评论中分享。