Kaique Mitsuo Silva Yamamoto
IaDesenvolvimento com ia

Revisão de Código Gerado por IA — O Que Verificar

Como revisar código gerado por IA de forma eficiente. Checklist de segurança, padrões de qualidade, normalização de deviance e como evitar confiança cega.

"I'm not reviewing every line of code anymore, even for production stuff. It still feels uncomfortable." — Simon Willison

A maior armadilha do desenvolvimento com IA não é código errado — é código que parece certo mas não é. A cada output correto, o desenvolvedor confia mais na IA. Simon Willison chama isso de "normalização de deviance": a confiança crescente cega o revisor.


O ciclo da confiança cega

Iteração 1: IA gera código → você revisa TUDO → encontra 3 bugs
Iteração 5: IA gera código → você revisa 80% → encontra 1 bug
Iteração 10: IA gera código → você revisa 30% → não encontra nada
Iteração 15: IA gera código → você aceita sem revisar → BUG EM PRODUÇÃO

Cada output correto aumenta a confiança e diminui a revisão. Até que um output errado passa despercebido.


Checklist de revisão

Nível 1: Segurança (sempre)

  • Nenhuma credencial hardcoded (API keys, passwords, tokens)
  • Nenhum eval(), exec(), ou Function() com input do usuário
  • SQL/NoSQL injection prevenido (parameterized queries)
  • XSS prevenido (sanitize de input, escape de output)
  • CSRF tokens em mutations
  • Rate limiting em endpoints públicos
  • Auth middleware em rotas protegidas
  • Nenhum .env ou secret no código

Nível 2: Comportamento (sempre)

  • Implementação bate com a spec
  • Todos os cenários da spec estão cobertos
  • Edge cases tratados (null, vazio, overflow, timeout)
  • Erros retornam códigos HTTP corretos
  • Response não expõe dados sensíveis (password hash, internal IDs)

Nível 3: Qualidade (sempre)

  • Tipos TypeScript corretos (sem any)
  • Funções com ≤ 30 linhas
  • Nomes descritivos (não data2, temp, result)
  • Nenhum código morto (unreachable, commented out)
  • Nenhuma dependência duplicada

Nível 4: Performance (quando relevante)

  • N+1 queries prevenidas
  • Pagination em listas
  • Cache onde apropriado
  • Nenhum loop infinito ou recursão sem base case

Padrões de código suspeitos

Código que "funciona" mas é errado

// ❌ Suspeito: any type
const processData = (data: any) => { ... }

// ❌ Suspeito: error swallowing
try {
  await apiCall();
} catch (e) {
  // silently ignore
}

// ❌ Suspeito: hardcoded values
const timeout = 30000; // por que 30s? documentado na spec?

// ❌ Suspeito: magic numbers
if (status === 418) { ... } // o que é 418?

// ❌ Suspeito: nested ternaries
const result = a ? b ? c : d : e ? f : g;

Código que parece certo mas tem bug

// ❌ Bug sutil: race condition
const user = await db.users.findOne({ id });
if (!user) {
  await db.users.create({ id, name }); // pode duplicar se chamado em paralelo
}

// ❌ Bug sutil: memory leak
const cache = new Map();
setInterval(() => {
  cache.set(key, expensiveComputation()); // nunca limpa o cache
}, 1000);

// ❌ Bug sutil: type coercion
if (input == null) { ... } // aceita undefined E null — intencional?

Como automatizar a revisão

Prompt de review

Review this code for:

1. Security issues (injection, XSS, auth bypass, secrets)
2. Behavioral correctness vs specs/[spec].md
3. TypeScript type safety (no any, no type assertions)
4. Error handling (no swallowed errors, proper HTTP codes)
5. Performance (N+1 queries, missing pagination, memory leaks)

For each issue found, output:
- FILE:LINE — description of the issue
- SEVERITY: critical/high/medium/low
- FIX: suggested correction

Code to review:
@file src/api/[file].ts

Review em PR

git diff main | claude -p "Review this diff for security, correctness,
and code quality. For each issue, output the file, line number,
description, and suggested fix. Use severity levels: critical/high/medium/low."

Referências

On this page