DEV Community

Cover image for IA para Detecção Proativa de Bugs: Promessa, Ruído e Responsabilidade Humana
Vinicius Cardoso Garcia
Vinicius Cardoso Garcia

Posted on

IA para Detecção Proativa de Bugs: Promessa, Ruído e Responsabilidade Humana

Na engenharia de software tradicional, bugs são descobertos predominantemente de forma reativa: um usuário reporta comportamento inesperado, um teste de integração falha em staging, ou pior, um sistema crítico colapsa em produção. Esta abordagem reativa carrega um custo exponencial bem documentado: corrigir um bug em produção custa entre 30 a 100 vezes mais do que corrigi-lo durante o desenvolvimento inicial.

A detecção automática de bugs com IA está saindo do laboratório e entrando no pipeline de CI/CD de empresas como Microsoft, grandes bancos e provedores de SaaS, com impactos reais em custo, tempo e qualidade de software [1]. Ao mesmo tempo, estudos empíricos mostram que esses modelos são poderosos, mas longe de perfeitos: muitas vezes melhoram recall às custas de mais false positives, exigindo julgamento humano maduro para separar "sinais" de "ruído".

Este debate se insere nesse contexto: conectar desenvolvimento, testes e deploy com manutenção proativa, usando machine learning e deep learning não apenas para encontrar bugs que já existem, mas para prever onde eles provavelmente vão surgir. A capacidade preditiva transforma fundamentalmente o papel da manutenção: de bombeiros apagando incêndios para engenheiros prevenindo que o fogo comece.

ML e DL para Detecção Automática de Bugs

A detecção de bugs com IA opera em três grandes famílias de abordagens: classificadores tradicionais, modelos de deep learning para código e abordagens híbridas que combinam análise estática com aprendizado de máquina.

Em classificadores tradicionais, algoritmos como Random Forest, SVM ou regressão logística usam métricas estáticas de código (complexidade ciclomática, linhas de código, profundidade de aninhamento) e métricas de processo (churn, número de autores, histórico de bugs) para classificar módulos como bug-prone ou não. Estudos recentes relatam F1-scores entre 0,70 e 0,85 em datasets como Defects4J (https://github.com/rjust/defects4j) e Bugs.jar (https://github.com/bugs-dot-jar/bugs-dot-jar) quando esses modelos são bem calibrados, com Random Forest frequentemente superando alternativas em precisão global [2].

Com deep learning, a lógica muda: o modelo aprende representações distribucionais de código a partir de grandes corpora de repositórios. Modelos como CodeBERT e variantes específicas para just-in-time defect prediction (JIT-Fine, JIT-BiCC, JIT-CF) combinam embeddings semânticos de mudanças de código com features especializadas para prever se um commit é defeituoso no momento em que é submetido. Trabalhos recentes relatam ganhos de até 10-11 pontos de F1-score sobre abordagens tradicionais ao integrar representações neurais com expert features [3].

Um exemplo particularmente relevante para manutenção é a detecção de bugs concorrentes: modelos que combinam grafos de programas (AST + CFG + PDG) com GNNs e CodeBERT conseguem F1 ≈ 0,86 para detecção de bugs de concorrência [4]. Isso ilustra bem a tese central: quando o problema é complexo demais para regras simples, DL captura padrões sutis que dificilmente seriam codificados à mão.

A análise estática tradicional, quando combinada com ML, produz sistemas híbridos particularmente efetivos. Ferramentas como Snyk Code (https://snyk.io/pt-BR/product/snyk-code/) executam data flow analysis para rastrear como valores propagam através do programa, identificando acessos a referências potencialmente nulas ou recursos não liberados [5]. Pattern mining complementa identificando desvios de padrões comuns: se 98% das funções que chamam database.find() verificam retorno nulo, uma função que não verifica representa anomalia estatística suspeita.

Princípio 1 – Modelos de bug detection são classificadores de risco, não oráculos de verdade. Eles estimam probabilidade de defeito com base em padrões históricos e estrutura de código; a decisão final continua humana.

Padrões Correlacionados com Bugs

Bug prediction models tendem a usar um conjunto recorrente de features que se correlacionam com defeitos: complexidade ciclomática, tamanho, churn, número de autores, intensidade de code smells e contexto de negócio. Na literatura e em ferramentas industriais, é comum ver thresholds como complexidade ciclomática > 10 ou 15 como indicadores de risco elevado [6].

Estudos mostram que componentes com alta intensidade de smells têm probabilidade significativamente maior de conter bugs futuros. Em sistemas Apache como Xerces, Tomcat e Velocity, modelos que consideram severidade de smells apresentam melhor capacidade de distinguir classes realmente críticas [6]. Métricas de churn e número de desenvolvedores envolvidos também se correlacionam com maior bug-proneness, refletindo instabilidade e possível falta de ownership.

/**
 * EXEMPLO 1: NULL POINTER EXCEPTION
 * Técnicas: Data Flow Analysis + Pattern Mining
 * Confidence: 91% baseado em 50k funções similares
 */

interface User {
  id: string;
  email: string;
  profile?: UserProfile;
}

interface UserProfile {
  displayName: string;
  avatarUrl: string;
  preferences: UserPreferences;
}

interface UserPreferences {
  theme: 'light' | 'dark';
  notifications: boolean;
}

// ❌ CÓDIGO COM BUG - IA detecta 3 vulnerabilidades
class UserDashboardService {
  private database: DatabaseClient;

  async renderUserDashboard(userId: string): Promise<DashboardData> {
    const user = await this.database.findUserById(userId);

    // ❌ BUG 1: user pode ser null (ID inexistente)
    // ❌ BUG 2: user.profile é opcional (undefined)
    // ❌ BUG 3: encadeamento sem proteção
    const theme = user.profile.preferences.theme;

    return {
      userName: user.profile.displayName,
      currentTheme: theme,
      avatarUrl: user.profile.avatarUrl
    };
  }
}

/**
 * ANÁLISE DA IA:
 * 
 * 1. Data Flow Analysis:
 *    - findUserById() retorna Promise<User | null>
 *    - Variável 'user' pode ser null no ponto de uso
 *    - Campo 'profile' marcado como opcional no tipo
 * 
 * 2. Pattern Mining:
 *    - 96% das funções similares fazem null check
 *    - Ausência de verificação = anomalia estatística
 * 
 * Alerta gerado (confidence: 91%):
 * "Potential NPE: 'user' may be null at line 24"
 * "Potential TypeError: 'profile' is optional"
 */

// ✅ CORREÇÃO SUGERIDA PELA IA
class UserDashboardServiceFixed {
  private database: DatabaseClient;

  async renderUserDashboard(userId: string): Promise<DashboardData> {
    const user = await this.database.findUserById(userId);

    if (!user) {
      throw new UserNotFoundError(`User ${userId} not found`);
    }

    const profile = user.profile ?? this.getDefaultProfile();

    return {
      userName: profile.displayName,
      currentTheme: profile.preferences?.theme ?? 'light',
      avatarUrl: profile.avatarUrl ?? '/default-avatar.png'
    };
  }

  private getDefaultProfile(): UserProfile {
    return {
      displayName: 'Anonymous User',
      avatarUrl: '/default-avatar.png',
      preferences: { theme: 'light', notifications: true }
    };
  }
}
Enter fullscreen mode Exit fullscreen mode
/**
 * EXEMPLO 2: RESOURCE LEAK
 * Técnica: Control Flow Analysis + Exception Path Analysis
 * Confidence: 89%
 */

import { FileHandle, open } from 'fs/promises';

// ❌ CÓDIGO COM LEAK
async function processTransactionLog(logPath: string): Promise<TransactionSummary> {
  const fileHandle: FileHandle = await open(logPath, 'r');

  const content = await fileHandle.readFile({ encoding: 'utf-8' });
  const transactions = parseTransactions(content);

  // Se parseTransactions() lançar exceção, fileHandle não fecha
  const validated = await validateTransactions(transactions);

  // Se validateTransactions() lançar exceção, fileHandle não fecha
  const summary = computeSummary(validated);

  await fileHandle.close(); // ✅ Fecha apenas no caminho feliz
  return summary;
}

/**
 * CONTROL FLOW GRAPH ANALISADO:
 * 
 *   [open] ───────────────────────────────────────────────┐
 *      │                                                  │
 *      ▼                                                  │
 *   [readFile] ──exception──> [exit] ❌ LEAK              │
 *      │                                                  │
 *      ▼                                                  │
 *   [parseTransactions] ──exception──> [exit] ❌ LEAK     |
 *      │                                                  │
 *      ▼                                                  │
 *   [validateTransactions] ──exception──> [exit] ❌ LEAK  |
 *      │                                                  │
 *      ▼                                                  │
 *   [close] ✅                                            │
 *      │                                                  │
 *      ▼                                                  │
 *   [return] ◄────────────────────────────────────────────┘
 * 
 * IA identifica: 3 caminhos de exceção onde recurso não é liberado
 */

// ✅ CORREÇÃO COM GARANTIA DE CLEANUP
async function processTransactionLogFixed(logPath: string): Promise<TransactionSummary> {
  const fileHandle: FileHandle = await open(logPath, 'r');

  try {
    const content = await fileHandle.readFile({ encoding: 'utf-8' });
    const transactions = parseTransactions(content);
    const validated = await validateTransactions(transactions);
    return computeSummary(validated);
  } finally {
    await fileHandle.close(); // ✅ Executa em TODOS os caminhos
  }
}
Enter fullscreen mode Exit fullscreen mode
/**
 * EXEMPLO 3: RACE CONDITION
 * Técnica: Concurrency Analysis + Historical Bug Patterns
 * Confidence: 67% (difícil, requer contexto)
 */

// ❌ CÓDIGO COM RACE CONDITION
class AccountBalance {
  private balance: number = 0;

  async deposit(amount: number): Promise<void> {
    // ❌ Race condition: read-modify-write não é atômico
    const currentBalance = this.balance;

    // Simula processamento assíncrono (API externa, DB)
    await this.notifyExternalSystem(amount);

    this.balance = currentBalance + amount;
  }

  async withdraw(amount: number): Promise<void> {
    const currentBalance = this.balance;

    if (currentBalance < amount) {
      throw new InsufficientFundsError();
    }

    await this.processWithdrawal(amount);

    this.balance = currentBalance - amount;
  }
}

/**
 * CENÁRIO DE BUG:
 * 
 * T1: deposit(100)  → lê balance=0
 * T2: deposit(50)   → lê balance=0  
 * T1: escreve balance=100
 * T2: escreve balance=50  ❌ Perdeu os 100!
 * 
 * COMO IA DETECTA:
 * 
 * 1. Concurrency Patterns:
 *    - Campo 'balance' modificado por métodos async
 *    - Read-modify-write pattern sem lock
 * 
 * 2. Historical Analysis:
 *    - Padrão similar causou bugs em 23 commits históricos
 * 
 * 3. Static Analysis:
 *    - Detecta await entre read e write (janela de race)
 * 
 * Nota: Modelos baseados em grafos (GNN + CodeBERT) alcançam
 * F1 ≈ 0.86 para este tipo de bug [4]
 */

// ✅ CORREÇÃO COM MUTEX
import { Mutex } from 'async-mutex';

class AccountBalanceFixed {
  private balance: number = 0;
  private mutex = new Mutex();

  async deposit(amount: number): Promise<void> {
    const release = await this.mutex.acquire();
    try {
      const currentBalance = this.balance;
      await this.notifyExternalSystem(amount);
      this.balance = currentBalance + amount;
    } finally {
      release();
    }
  }

  async withdraw(amount: number): Promise<void> {
    const release = await this.mutex.acquire();
    try {
      if (this.balance < amount) {
        throw new InsufficientFundsError();
      }
      await this.processWithdrawal(amount);
      this.balance -= amount;
    } finally {
      release();
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Princípio 2 – Métricas e padrões indicam probabilidade, não causalidade: complexidade alta, churn elevado e smells intensos não "criam" bugs, mas aumentam o risco e justificam atenção antecipada.

Ferramentas de Detecção em Produção

O ecossistema de ferramentas para detecção de bugs assistida por IA amadureceu significativamente. Cada ferramenta apresenta trade-offs distintos em velocidade, profundidade e integração.

Ferramenta Tipo Principal Força Declarada Precision Recall
Snyk Code SAST + IA Autofix com ~80% acurácia [5] 72% 78%
SonarQube AI Regras + ML Quality gates, code smells [8] 68% 82%
GitHub CodeQL Query Language Vulnerabilidades em PRs [9] 85% 45%
Semgrep Pattern Matching Regras customizáveis 78% 55%

Snyk Code (antes DeepCode) integra ML com análise simbólica: modelos treinados em grandes bases de código, mais análise estática tradicional, para detectar vulnerabilidades e bugs com foco em segurança, gerando inclusive correções automáticas. Relatos indicam acurácia média de ~80% nas sugestões de fix após otimizações como CodeReduce, que recorta o contexto relevante para o LLM [5].

SonarQube incorpora camadas de IA para revisar código (inclusive gerado por IA) e reforçar detecção de bugs, vulnerabilidades e code smells. A plataforma integra métricas em quality gates que podem bloquear merges de código abaixo de certo padrão [8]. Em ambientes que adotam intensamente geração de código com IA, SonarQube é posicionado como camada de verificação obrigatória.

GitHub CodeQL representa uma abordagem distinta: em vez de ML, utiliza uma linguagem de query declarativa para buscar padrões de vulnerabilidade no código. O desenvolvedor (ou a comunidade) escreve queries que descrevem padrões problemáticos, e o engine busca ocorrências no codebase. Esta abordagem oferece precision excepcional (85%) porque cada query é explicitamente projetada para um padrão específico, mas recall limitado (45%) já que só detecta padrões para os quais existem queries escritas. CodeQL é particularmente forte em vulnerabilidades de segurança bem caracterizadas (SQL injection, XSS, path traversal) e integra-se nativamente ao GitHub Actions.

Semgrep posiciona-se como meio-termo entre análise estática tradicional e ML: permite definir regras customizadas usando uma sintaxe similar ao código sendo analisado, tornando fácil para desenvolvedores criarem detectores específicos para seu domínio. Com precision de 78% e comunidade ativa contribuindo regras, Semgrep é particularmente útil para organizações que precisam detectar padrões específicos de sua arquitetura ou convenções internas que ferramentas genéricas não cobrem. A ferramenta executa em segundos (não minutos), viabilizando uso em pre-commit hooks.

Entretanto, estudos independentes destacam limitações sérias: avaliações da capacidade de Copilot Code Review em detectar vulnerabilidades conhecidas mostram taxa de sucesso baixa [9]. Há inclusive relatórios sugerindo aumento de bugs quando equipes adotam assistentes de código sem reforçar práticas de revisão [10].

Princípio 3 – IA vê padrões onde humanos se distraem, mas ignora contexto onde humanos são fortes. O ganho real vem da combinação, não da substituição.

Bug Prediction versus Bug Detection

A distinção entre bug detection (reativo) e bug prediction (proativo) é conceitual e prática. Detection foca em apontar defeitos em artefatos existentes. Prediction busca identificar antes quais módulos, commits ou PRs têm maior probabilidade de conter bugs, para priorizar inspeções e revisões humanas [11].

Modelos de Just-In-Time Defect Prediction (JIT-DP) recebem como entrada um commit individual e estimam se aquela mudança tende a introduzir defeito. Estudos recentes com frameworks baseados em CodeBERT e contrastive learning mostram melhorias de mais de 10 pontos de F1-score sobre modelos tradicionais [12].

/**
 * BUG PREDICTION MODEL - Implementação Didática
 * Baseado em features identificadas na literatura [6]
 */

interface CodeMetrics {
  cyclomaticComplexity: number;
  linesOfCode: number;
  nestingDepth: number;
  churnRate: number;
  developerCount: number;
  bugHistory: number;
  testCoverage: number;
  codeAge: number;
  hasLongMethod: boolean;
  hasGodClass: boolean;
  isCriticalPath: boolean;
}

interface PredictionResult {
  probability: number;
  confidence: number;
  riskLevel: 'low' | 'medium' | 'high' | 'critical';
  riskFactors: RiskFactor[];
}

interface RiskFactor {
  name: string;
  contribution: number;
  recommendation: string;
}

class BugPredictionModel {
  // Pesos derivados de estudos empíricos [2][6]
  private readonly weights = {
    bugHistory: 0.28,      // Preditor mais forte
    cyclomaticComplexity: 0.22,
    churnRate: 0.18,
    testCoverage: 0.15,
    linesOfCode: 0.10,
    developerCount: 0.07
  };

  predict(metrics: CodeMetrics): PredictionResult {
    const factors: RiskFactor[] = [];
    let score = 0;

    // Bug history é o preditor mais forte [6]
    if (metrics.bugHistory > 0) {
      const impact = Math.min(metrics.bugHistory * 0.12, 0.35);
      score += impact * this.weights.bugHistory;
      factors.push({
        name: 'Bug History',
        contribution: impact,
        recommendation: `Arquivo teve ${metrics.bugHistory} bugs anteriores. Priorize refatoração.`
      });
    }

    // Complexidade ciclomática [6]
    if (metrics.cyclomaticComplexity > 10) {
      const impact = Math.min((metrics.cyclomaticComplexity - 10) / 25, 1);
      score += impact * this.weights.cyclomaticComplexity;
      factors.push({
        name: 'High Complexity',
        contribution: impact,
        recommendation: `CC=${metrics.cyclomaticComplexity} (threshold: 10). Extraia funções menores.`
      });
    }

    // Churn rate
    if (metrics.churnRate > 5) {
      const impact = Math.min((metrics.churnRate - 5) / 20, 1);
      score += impact * this.weights.churnRate;
      factors.push({
        name: 'High Churn',
        contribution: impact,
        recommendation: `${metrics.churnRate} modificações recentes. Estabilize antes de novas features.`
      });
    }

    // Test coverage (inversamente proporcional)
    if (metrics.testCoverage < 70) {
      const impact = (70 - metrics.testCoverage) / 70;
      score += impact * this.weights.testCoverage;
      factors.push({
        name: 'Low Coverage',
        contribution: impact,
        recommendation: `Cobertura ${metrics.testCoverage}%. Aumente para 70%+.`
      });
    }

    // Critical path multiplier
    if (metrics.isCriticalPath) {
      score *= 1.25;
      factors.push({
        name: 'Critical Path',
        contribution: 0.25,
        recommendation: 'Código de autenticação/pagamento. Revisão sênior obrigatória.'
      });
    }

    const probability = Math.min(score * 1.3, 0.95);
    const confidence = metrics.codeAge > 30 ? 0.85 : 0.65;

    let riskLevel: PredictionResult['riskLevel'] = 'low';
    if (probability > 0.7) riskLevel = 'critical';
    else if (probability > 0.5) riskLevel = 'high';
    else if (probability > 0.3) riskLevel = 'medium';

    return {
      probability,
      confidence,
      riskLevel,
      riskFactors: factors.sort((a, b) => b.contribution - a.contribution)
    };
  }
}
Enter fullscreen mode Exit fullscreen mode

Em termos de ROI, casos industriais indicam redução de 47% em bugs críticos em produção e 62% em tempo de resolução, com economia anual de milhões [13]. Esses ganhos vêm não apenas da acurácia do modelo, mas do ajuste do processo: quem revisa o quê, quando e com base em qual sinal.

Princípio 4 – Bug prediction é sobre priorização: não substitui testes ou review, mas decide onde investir atenção humana limitada.

O Trade-off Fundamental: Precision versus Recall

Nenhum modelo de IA para bugs é perfeito. O principal ponto de fricção na adoção é a taxa de false positives. Há um trade-off entre precision (proporção de alertas que realmente são bugs) e recall (proporção de bugs reais capturados). A métrica F1-score equilibra ambos, mas decisões práticas frequentemente favorecem mais recall à custa de mais ruído [14].

Estudos de modelos de bug prediction relatam F1-scores entre 0,7 e 0,85, com precision em torno de 0,6-0,7 e recall em torno de 0,8-0,9 [11]. Snyk relata experimentos onde ajustes na promptagem elevam recall para próximo de 100% ao custo de introduzir categoria "maybe" [5].

Tipo de Bug Precision Recall F1-Score Observação
Null Pointer 76% 87% 81% Bem detectado, padrões claros
Resource Leak 82% 73% 77% Bom balanço
Race Condition 58% 45% 51% Difícil, muitos falsos
SQL Injection 89% 91% 90% Padrões sintáticos óbvios
Logic Error 42% 38% 40% Requer contexto semântico

Na prática, o impacto em times se traduz em horas de triagem: com precision de 40% e recall de 85%, investigar 500 alertas significa 300 falsos, consumindo muitas horas e gerando desconfiança. Ao mesmo tempo, ignorar o modelo significa aceitar que 15% dos bugs reais não serão sinalizados [13].

O ponto de equilíbrio varia por domínio: sistemas de missão crítica (saúde, financeiro) toleram mais false positives em nome de alta cobertura, enquanto produtos de baixo risco priorizam menos ruído para proteger produtividade.

Princípio 5 – A pergunta prática não é se o modelo é "bom", mas se o ganho de bugs reais encontrados compensa o custo de inspecionar alertas falsos no contexto do seu time.

Integração no Workflow de Desenvolvimento

Integrar IA de bug detection ao workflow exige decisões arquiteturais e organizacionais: onde plugar a ferramenta (IDE, PR, build), quem responde ao alerta e como medir valor [15].

Uma arquitetura comum envolve:

  • IDE: Plugins (VS Code, IntelliJ) com Snyk Code, SonarLint apontando problemas em tempo real
  • Pull Request: Code scanning, SonarQube publicando comentários e bloqueando merges que violem quality gates
  • CI/CD: Modelos JIT calculando scores de risco por commit, priorizando quais PRs recebem revisão sênior

Equipes que relatam melhor ROI tendem a definir políticas explícitas ("PRs com risco > 0,7 exigem revisão de Tech Lead"), monitorar métricas de resultado (bugs em produção, tempo de resolução, esforço em false positives), e tratar o modelo como componente vivo, re-treinando e ajustando thresholds conforme feedback [16].

Essa mentalidade muda o papel da equipe de engenharia: em vez de apenas "apagar incêndios" depois de incidentes, a equipe passa a operar como gestora de risco de defeito, usando sinais de IA para selecionar onde investir refactoring, testes adicionais e revisão especializada.

Princípio 6 – IA para bug detection eficaz exige design de processo: sem políticas claras e métricas de resultado, modelos viram apenas mais uma fonte de ruído no pipeline.

Conclusão: Da Detecção à Predição como Competência de Engenharia

A transição de detecção reativa para predição proativa representa mudança fundamental na engenharia de software. Bugs deixam de ser surpresas desagradáveis para tornarem-se riscos quantificáveis e gerenciáveis. Esta capacidade preditiva exige calibração cuidadosa ao contexto: não existe configuração universalmente ótima para o trade-off precision-recall.

Engenheiros de software contemporâneos precisam desenvolver literacia em métricas de ML (precision, recall, F1) para avaliar criticamente ferramentas e configurá-las apropriadamente. Precisam também cultivar julgamento sobre quando confiar em predições automatizadas e quando investigação humana profunda é insubstituível.

O futuro da manutenção não é humanos versus máquinas, mas humanos com máquinas: sistemas automatizados que amplificam a capacidade de detecção humana, liberando engenheiros para focar em problemas que genuinamente requerem criatividade e julgamento. Dominar esta colaboração é competência essencial para o engenheiro de software do presente.

Princípio 7 – A competência moderna não é usar IA ou não usar IA, mas saber quando e como integrar predições automatizadas com julgamento humano contextualizado.


Referências

[1] PixelSolutionz (2025). "How AI is Changing Software Bug Detection and Fixing."

[2] Shiri Harzevili, N., Boaye Belle, A., Wang, J., Wang, S., Jiang, Z. M., & Nagappan, N. (2024). "A Systematic Literature Review on Automated Software Vulnerability Detection Using Machine Learning." ACM Computing Surveys, 57(3), Article 55.

  • Link: https://dl.acm.org/doi/10.1145/3699711
  • Por que ler: Survey abrangente de 138 estudos (2011-2024) analisando datasets, representações de código, modelos ML/DL, e ferramentas. Mostra que 88.4% dos estudos usam DL, com RNNs e GNNs sendo mais populares. F1-scores típicos de 0.70-0.85.

[3] Ni, C., Wang, W., Yang, K., Xia, X., Liu, K., & Lo, D. (2022). "The best of both worlds: integrating semantic features with expert features for defect prediction and localization." ESEC/FSE '22: Proceedings of the 30th ACM Joint European Software Engineering Conference and Symposium on the Foundations of Software Engineering, pp. 672-683.

  • Link: https://dl.acm.org/doi/10.1145/3540250.3549165
  • Por que ler: Propõe JIT-Fine, modelo unificado que integra features semânticas (CodeBERT) com expert features para predição e localização just-in-time. Melhora F1-score em 14-37 pontos percentuais sobre baselines.

[4] Feng, Z., Zhang, K., Wang, M., Cheng, Y., Cai, Y., Li, X., & Liu, G. (2025). "Deep Learning Based Concurrency Bug Detection and Localization." The Computer Journal, Oxford University Press.

  • Link: https://arxiv.org/abs/2508.20911
  • Por que ler: Propõe Convul com CCPG (Concurrency-Aware Code Property Graph) + RGCN + CodeBERT. Atinge F1 86% em detecção e IoU 15% em localização de bugs de concorrência, superando baselines em 10-26%.

[5] Snyk (2024). "DeepCode AI: AI-Powered Code Security and Autofix."

[6] Palomba, F., Zanoni, M., Arcelli Fontana, F., De Lucia, A., & Oliveto, R. (2016). "Smells like Teen Spirit: Improving Bug Prediction Performance Using the Intensity of Code Smells." IEEE International Conference on Software Maintenance and Evolution (ICSME), pp. 244-255.

  • Link: https://ieeexplore.ieee.org/document/7816471
  • Por que ler: Demonstra que adicionar o índice de intensidade de code smells melhora precisão de bug prediction em até 25%. Estudo em 6 projetos Apache (Xerces, Xalan, Velocity, Tomcat, Lucene, Log4j).

[7] Pascarella, L., Spadini, D., Palomba, F., & Bacchelli, A. (2019). "On The Effect Of Code Review On Code Smells." arXiv preprint arXiv:1912.10098.

[9] Amro, A., & Alalfi, M. H. (2025). "GitHub's Copilot Code Review: Can AI Spot Security Flaws Before You Commit?" arXiv preprint arXiv:2509.13650.

[11] Vasantha et al. (2023). "Software Bug Prediction Using Machine Learning Approach." JAC : A Journal Of Composition Theory.

[12] JU et al. (2024). "Jit-Cf: Integrating Contrastive Learning with Feature Fusion for Enhanced Just-in-Time Defect Prediction." SSRN.

[13] Getmonetizely (2025). "How Can Bug Detection and Fixing with Agentic AI Transform Your Development Process?."

[14] Ravikanth Konda (2023). "AI-Powered Code Review Enhancing Software Quality with Intelligent Agents." IJLRP.

[15] Architecht (2024). "AI-Assisted Code Quality Enhancement: SonarQube and MCP."

[16] Ali M, Mazhar T, Al-Rasheed A, Shahzad T, Yasin Ghadi Y, Amir Khan M. “Enhancing software defect prediction: a framework with improved feature selection and ensemble machine learning”. PeerJ Comput Sci. 2024 Feb 28;10:e1860. doi: 10.7717/peerj-cs.1860. PMID: 39669467; PMCID: PMC11636684.

[17] Kharkar et al. (2022). “Learning to Reduce False Positives in Analytic Bug Detectors.” _arXiv preprint arXiv:2203.09907.

[18] Z. Guo et al., "Mitigating False Positive Static Analysis Warnings: Progress, Challenges, and Opportunities," in IEEE Transactions on Software Engineering, vol. 49, no. 12, pp. 5154-5188, Dec. 2023, doi: 10.1109/TSE.2023.3329667.

[19] Gottam JR (2025). “AI-Driven Quality Assurance: Integrating Generative Models, Predictive Analytics, and
Self-Healing Frameworks in Software Testing”, European Journal of Computer Science and Information Technology,
13(34),1-12

Top comments (0)