Como revisar código escrito por IA com segurança: o checklist real de um desenvolvedor
Ferramentas de IA escrevem código em velocidade vertiginosa, mas velocidade sem escrutínio é só um jeito mais rápido de colocar bugs em produção. Este artigo mostra um processo real, já testado na prática, para auditar código gerado por IA, identificando falhas de segurança, erros de lógica, vulnerabilidades ocultas e dívida técnica invisível antes que qualquer coisa chegue ao seu sistema de produção.
A IA escreve código mais rápido que qualquer humano. Essa é ao mesmo tempo a maior força dela e o que deveria tirar seu sono. Quando um desenvolvedor usa o GitHub Copilot, o ChatGPT ou qualquer outro assistente de programação com IA, o resultado parece bem acabado, compila sem erros e passa nos testes básicos de fumaça. O que muitas vezes falta é o tipo de raciocínio profundo e contextual que pega o bug que você só encontraria na terceira semana em produção.
Revisar código gerado por IA não é o mesmo que revisar código escrito por humanos. Humanos cometem erros previsíveis em lugares previsíveis. A IA comete erros plausíveis em qualquer lugar, com confiança. Este artigo oferece um framework real para revisar código escrito por IA com segurança, cobrindo vulnerabilidades de segurança, armadilhas de lógica, tratamento de erros ruim e as ferramentas que deixam o processo mais rápido sem atalhos.
O que torna o código de IA diferente
Se você revisa código há anos, já sabe que a pessoa que escreveu uma função normalmente entende o que ela deveria fazer, mesmo quando o código está errado. Ela consegue responder perguntas. Ela tem intenção.
A IA não tem intenção nesse sentido. Ela gera código estatisticamente provável com base em um prompt. Ela viu milhões de exemplos de código, inclusive os com bugs. Quando produz um resultado, está reconhecendo padrões, não resolvendo problemas.
A ilusão de correção
O mais perigoso no código gerado por IA é o quanto ele parece correto. Ele segue convenções de nomes. Tem comentários. Usa sintaxe moderna. Muitas vezes tem a estrutura certa. Um desenvolvedor que dá uma olhada rápida aprovaria sem hesitar.
Mas existem modos de falha específicos em que a IA cai repetidamente:
Assume entradas do caminho feliz: o código da IA raramente considera o que acontece quando os dados vêm malformados, nulos ou fora do intervalo esperado.
Copia padrões vulneráveis: se os dados de treinamento continham código inseguro, o modelo pode reproduzir essa insegurança com confiança.
Simplifica demais a concorrência: condições de corrida, deadlocks e problemas de thread-safety quase nunca aparecem na saída da IA por padrão.
Ignora a lógica de negócio: a IA não conhece seu sistema. Ela não tem como saber que user.balance nunca deve ficar abaixo de zero no seu domínio.
Padrões que quebram em silêncio
Os padrões específicos que passam pela revisão de código, mas falham em produção:
Padrão
O que a IA faz
Por que está errado
Engolir erros
catch (e) {} ou except: pass
Esconde falhas reais e torna a depuração impossível
Captura ampla de exceções
Captura Exception quando só ValueError importa
Mascara erros não relacionados
Confiar na entrada do usuário
Passa a entrada bruta direto para consultas ou comandos
Vulnerabilidades de injeção
Timeouts fixos
time.sleep(5) ou número fixo de tentativas
Falha sob carga ou picos de latência
Falta de checagem de autenticação
Lógica de negócio sem verificação de papel
Risco de escalonamento de privilégios
Antes de ler a primeira linha
Uma boa revisão de código não começa no diff. Começa antes de você abrir o arquivo.
Adote a mentalidade certa
Quando você revisa código humano, dá ao autor o benefício da dúvida. Você presume que ele tinha um motivo para as escolhas que fez. Não ofereça essa cortesia à saída da IA. Aborde-a como abordaria o código de um estagiário talentoso no primeiro dia, alguém que leu todos os livros de programação já escritos, mas nunca colocou nada em produção.
Isso não é cinismo. É calibragem. O código gerado por IA costuma ser bom. Mas ele precisa de um revisor com o ceticismo certo.
A pergunta nunca é "isso parece certo?". É sempre "o que precisaria ser verdade para isso falhar?"
Saiba o que foi pedido à IA
Antes de revisar o código, descubra qual prompt o gerou. Nem sempre é possível, mas quando é, leia com atenção. Prompts vagos produzem código vago. Se o prompt foi "escreva uma função de login", a IA não tinha ideia sobre o seu gerenciamento de sessões, seus requisitos de limitação de taxa ou seu padrão de hash de senhas. Tudo o que ela presumiu é uma possível lacuna.
Falhas de segurança para caçar primeiro
A segurança é onde o código de IA causa mais estragos. Os riscos não são teóricos. São específicos e seguem padrões previsíveis.
Vulnerabilidades de injeção
A IA frequentemente gera SQL, comandos de shell ou HTML concatenando strings. Esta é uma das vulnerabilidades mais antigas do desenvolvimento de software, e a IA a reproduz constantemente porque grande parte dos seus dados de treinamento faz o mesmo.
O que procurar:
# Red flag: AI-generated SQL with string concatenation
query = "SELECT * FROM users WHERE name = '" + username + "'"
# What it should look like
query = "SELECT * FROM users WHERE name = %s"
cursor.execute(query, (username,))
Sempre que a entrada do usuário chegar a uma consulta de banco de dados, a um comando de shell, a um caminho de arquivo ou a um template HTML sem sanitização ou parametrização, você tem um risco de injeção. Procure especificamente por concatenação de strings envolvendo variáveis que possam vir da entrada do usuário.
Segredos codificados no código
A IA às vezes gera código de exemplo com chaves de API, senhas ou tokens diretamente no código-fonte. Pior ainda, às vezes gera credenciais realistas, mas falsas, que os desenvolvedores deixam no lugar porque planejam trocá-las depois e não trocam.
Rode um scanner de segredos antes de qualquer código gerado por IA ser mesclado. Ferramentas como truffleHog, detect-secrets ou gitleaks pegam esses casos automaticamente. Adicione-as ao seu pipeline de CI e trate-as como bloqueantes.
Qualquer credencial no código-fonte é uma credencial vazada, seja ela real ou um marcador de posição que alguém esqueceu de substituir.
Dependências inseguras
A IA pode sugerir pacotes desatualizados, sem manutenção ou com CVEs conhecidas. Ela não consegue navegar pelos registros de pacotes em busca de vulnerabilidades. Não sabe qual versão de uma biblioteca recebeu um patch de segurança crítico no mês passado.
Depois de revisar o código gerado por IA, rode suas ferramentas de auditoria de dependências:
npm audit para projetos Node.js
pip-audit ou safety para Python
bundle-audit para Ruby
Qualquer dependência introduzida pela saída da IA deve ser verificada contra as bases de vulnerabilidades atuais antes de ser mesclada.
Verificações de lógica e corretude
A segurança é quem ganha as manchetes, mas são os erros de lógica que mais fazem o código de IA falhar de fato. Esses bugs compilam, passam nos testes e sobrevivem à revisão de código. Eles só aparecem em condições específicas que a IA nunca considerou.
Casos extremos que a IA ignorou
A IA gera código para o caminho feliz. Ela trata a entrada descrita no prompt. Ela não trata:
Coleções vazias ou referências nulas
Entradas exatamente na fronteira de um intervalo válido
Chamadas concorrentes à mesma função
Timeouts de rede ou respostas parciais
Cenários de disco cheio ou esgotamento de memória
Para cada função que você revisar, pergunte: o que acontece se a entrada mais importante for nula? O que acontece se essa função for chamada com uma lista vazia? O que acontece se a chamada de rede retornar um 200 com corpo vazio?
Se a IA não respondeu a essas perguntas no código, você precisa adicionar o tratamento por conta própria ou devolver o código para revisão.
Tratamento de erros que não faz nada
A IA adora gerar blocos try-catch. O problema está no que ela coloca dentro deles. Capturas silenciosas estão em toda parte. Registrar console.log(err) e seguir como se nada tivesse acontecido é comum. Relançar um erro genérico quando quem chamou precisava de um específico é quase universal.
Cada manipulador de exceção no código de IA merece análise individual:
Isso realmente trata o erro ou apenas o esconde?
O código que chamou sabe que algo deu errado?
Esse erro é registrado de um jeito que permita encontrá-lo depois?
A aplicação está em um estado consistente depois que esse bloco de captura roda?
Erros de off-by-one e de fronteira
Os limites de laços são onde a IA erra com uma frequência maior que a dos humanos. O código de IA frequentemente usa < onde <= é necessário, itera um elemento além do fim de um array ou começa um intervalo em 1 quando deveria começar em 0. Esses bugs são invisíveis em testes pequenos e catastróficos quando processam dados reais em escala.
Para qualquer laço ou intervalo no código gerado por IA, percorra manualmente a primeira iteração, a última e um caso com zero elementos.
Ferramentas que aceleram sua revisão
A revisão manual é necessária, mas não é suficiente. Ferramentas automatizadas pegam classes de problemas que humanos deixam passar sob pressão de tempo, e fazem isso de forma consistente.
Análise estática e linters
A análise estática é sua primeira linha de defesa. Ela roda antes de qualquer pessoa olhar o código e pega automaticamente os problemas mais fáceis.
Ferramentas recomendadas por linguagem:
Linguagem
Ferramenta
O que detecta
Python
bandit, pylint, mypy
Problemas de segurança, erros de tipo, estilo
JavaScript / TypeScript
eslint, semgrep
Riscos de XSS, comportamento indefinido
Java
SpotBugs, SonarQube
Ponteiros nulos, concorrência, segurança
Go
staticcheck, gosec
Segurança de memória, padrões de segurança
Ruby
brakeman, rubocop
Vulnerabilidades específicas do Rails
Configure essas ferramentas para rodar automaticamente em cada pull request. Qualquer código gerado por IA que não passe pela análise estática não deve avançar para a revisão humana.
Revisão de código assistida por IA
Há uma ironia interessante aqui: a IA também é uma das melhores ferramentas para revisar código gerado por IA. Um modelo diferente, revisando o código com um prompt focado em segurança, vai pegar padrões que o primeiro modelo gerou de forma incorreta. Isso funciona porque os dois modelos foram treinados de maneiras diferentes e têm pontos cegos diferentes.
Passar a saída da IA por outro revisor de IA não substitui a revisão humana. É um filtro que torna a revisão humana mais rápida e mais direcionada.
Use LLMs no PicassoIA para revisar código
Os modelos de linguagem de grande porte do PicassoIA são feitos sob medida para esse tipo de raciocínio. Você pode colar um trecho de código, dar um prompt focado em revisão e receber uma análise estruturada em segundos, sem trocar de ferramenta nem gerenciar chaves de API.
Como usar o GPT 5 para revisar código
O GPT 5 é um dos modelos mais capazes para análise de código. Seu ponto forte é o contexto amplo: ele consegue manter uma função grande na memória, identificar vários problemas que interagem entre si e explicar cada um com clareza.
Cole a função ou o módulo gerado por IA que você quer revisado
Use esta estrutura de prompt:
Review this code for: (1) security vulnerabilities, (2) unhandled edge cases,
(3) error handling issues, (4) logic errors. For each issue found, explain
the risk and suggest a specific fix. Reference line numbers or variable names.
Analise a saída com senso crítico. Não aceite as sugestões às cegas.
Cole o código revisado de volta e peça que ele verifique novamente os problemas específicos que apontou.
O GPT 5.1 também está disponível para fluxos de trabalho baseados em agentes, caso você queira automatizar pipelines de revisão com várias etapas.
Claude 4.5 Sonnet para auditorias de segurança
O Claude 4.5 Sonnet tem um ponto forte particular na identificação de problemas de segurança sutis. Onde o GPT tende à amplitude, o Claude se sai melhor em profundidade em cenários de segurança específicos.
Para revisões focadas em segurança, o Claude 4.5 Sonnet é especialmente eficaz com prompts que pedem que ele raciocine passo a passo sobre um modelo de ameaças. Algo como: "Assuma que um invasor controla o parâmetro username. Acompanhe cada caminho que esse parâmetro percorre neste código e identifique onde ele poderia ser explorado."
O Claude 4 Sonnet e o Claude Opus 4.7 também estão disponíveis no PicassoIA para tarefas de revisão mais exigentes ou bases de código maiores que exigem raciocínio mais profundo.
DeepSeek R1 para raciocínio profundo
O DeepSeek R1 usa raciocínio em cadeia de pensamento, o que o torna particularmente bom em rastrear a lógica por caminhos complexos de código. Se você tem uma função com vários ramos, condicionais aninhadas ou gerenciamento de estado intrincado, o DeepSeek R1 vai raciocinar sobre cada ramo explicitamente, em vez de resumir em alto nível.
O DeepSeek V3.1 e o Kimi K2 Instruct completam as opções para desenvolvedores que querem passar o mesmo código por vários modelos e comparar os achados. A sobreposição entre o que cada modelo aponta é o que você precisa corrigir. As divergências valem a pena ser examinadas manualmente.
Passar o mesmo código gerado por IA por dois ou três LLMs diferentes é uma das etapas de revisão com maior retorno que você pode fazer. Leva cinco minutos e pega o que um único revisor deixaria passar.
Monte seu fluxo de revisão
Um bom processo de revisão não é algo que você improvisa a cada vez. É uma checklist repetível que vira hábito.
A checklist que você pode reutilizar
Aqui está uma checklist condensada de revisão para código gerado por IA. Use-a sempre, sem pular fases.
Fase 1: Antes de ler
Sei qual prompt gerou este código?
Rodei as ferramentas de análise estática?
Rodei um scanner de segredos?
Verifiquei as novas dependências contra bases de vulnerabilidades?
Fase 2: Segurança
Há concatenação de strings com entrada do usuário indo para SQL, shell ou HTML?
Há credenciais, tokens ou chaves de API no código-fonte?
Há chamadas de rede que não validam nem sanitizam as respostas?
Há operações com arquivos usando caminhos controlados pelo usuário?
Há alguma função que pule verificações de autenticação ou autorização?
Fase 3: Lógica
O que acontece com entradas nulas ou vazias?
O que acontece em valores de fronteira (0, -1, máximo)?
Os manipuladores de exceção realmente tratam os erros ou os escondem?
As fronteiras dos laços estão corretas? Percorra manualmente a primeira e a última iteração.
Esta função tem suposições ocultas sobre a ordem de chamada ou sobre o estado?
Fase 4: Testes
Os testes existentes cobrem os novos caminhos de código?
Há testes para os casos extremos identificados acima?
Os testes cobrem caminhos de falha, e não apenas o caminho feliz?
Quando rejeitar e quando iterar
Nem todo código de IA merece revisão. Parte dele deve ser rejeitada de imediato.
Rejeite quando:
As falhas de segurança são estruturais, não superficiais (por exemplo, toda a abordagem de autenticação está errada)
A lógica não corresponde ao requisito de negócio de um jeito profundo demais para ser corrigido
O código introduz um padrão de arquitetura que conflita com as convenções existentes
Itere quando:
Os problemas estão localizados em funções ou blocos específicos
A estrutura está correta, mas faltam casos extremos pontuais
O tratamento de erros é insuficiente, mas a lógica central é sólida
O objetivo não é consertar o código de IA até ele passar na revisão. O objetivo é enviar código seguro e correto. Às vezes, o caminho mais eficiente é uma reescrita limpa com prompts melhores.
Experimente no PicassoIA
Se este artigo fez você pensar em como os modelos de IA raciocinam sobre código, o melhor próximo passo é testar por conta própria. O PicassoIA dá acesso ao GPT 5, ao Claude 4.5 Sonnet, ao DeepSeek R1, ao Kimi K2 Instruct, ao Gemini 3 Pro e a dezenas de outros modelos, tudo em um só lugar, sem nenhuma configuração.
Pegue um trecho de código gerado por IA que você já tem. Passe-o por dois ou três modelos diferentes usando os prompts de revisão deste artigo. Compare o que cada um encontra. Você vai perceber logo como estilos de raciocínio diferentes pegam problemas diferentes, e terá uma visão mais clara das suas lacunas reais de revisão.
Os modelos disponíveis no PicassoIA não servem apenas para escrever código. Servem para raciocinar sobre ele, auditá-lo e torná-lo mais seguro. É esse ciclo que faz o desenvolvimento assistido por IA funcionar de verdade: gerar com um modelo, revisar com outro e publicar com confiança.