Pós-Graduação em Ciência da Computação – UFPE
Defesa de Tese de Doutorado Nº 709
Aluno: Rodrigo dos Santos Lima
Orientador: Prof. Leopoldo Motta Teixeira
Coorientador: Prof. Baldoino Fonseca dos Santos Neto (UFAL/Instituto de Computação)
Título: Understanding and Detecting Harmful Code
Data: 12/08/2026
Hora/Local:13h:30m – Virtual – Interessados em assistir entrar em contato com o aluno
Banca Examinadora:
Prof. Vinicius Cardoso Garcia
Prof. Juliana Alves Pereira (PUC-RJ / Departamento de Informática)
Prof. Wesley Klewerton Guez Assunção (North Carolina State University)
Prof. Ivan do Carmo Machado (UFBA / Depto de Ciência da Computação)
Prof. Matheus Henrique Esteves Paixão (UECE / Departamento de Informática)
RESUMO:
Code Smells normalmente indicam decisões e implementações de projeto inadequadas que podem degradar a qualidade do software. Por isso, precisam ser cuidadosamente detectadas para evitar tais consequências negativas. Nesse contexto, alguns estudos buscam compreender o impacto das Code Smells na qualidade do software, enquanto outros propõem técnicas baseadas em regras ou em aprendizado de máquina para detectá-las. No entanto, essas abordagens não se concentram em identificar quais trechos de código são de fato prejudiciais à qualidade do software.
Nesta tese, definimos Código Prejudicial (Harmful Code) como um elemento de código Smelly (contém Code Smell) que também possui um ou mais bugs reportados – corrigidos ou não. A presença de código prejudicial sugere um risco maior de introdução de novos defeitos ou de degradação do projeto durante tarefas de manutenção e evolução. Categorizamos o código em quatro tipos: Clean, Smelly, Buggy e Harmful, e utilizamos essa taxonomia para analisar e detectar a nocividade em projetos de software.
Investigamos as representações sociais do código prejudicial em uma comunidade de desenvolvedores de software composta por estudantes de pós-graduação brasileiros e profissionais da indústria. Realizamos tarefas de associação livre com membros dessa comunidade para capturar suas percepções espontâneas sobre código prejudicial e, em seguida, compilamos as associações para caracterizar suas representações sociais compartilhadas.
Avaliamos também a viabilidade do aprendizado por transferência (transfer learning) em três tarefas comuns de engenharia de software: Code Smells, Mudanças Introdutoras de Defeitos e Harmful Code. Para isso, focamos em projetos de código aberto escritos em linguagens de programação populares: Java, C++ e C#. Avaliamos a eficácia e a eficiência dos modelos de aprendizado por transferência nessas tarefas e analisamos a complexidade de modelo necessária para alcançar desempenho satisfatório.
Em seguida, refinamos a definição de harmful code incorporando sua dimensão temporal. Por meio de uma análise temporal em larga escala de 10 projetos de código aberto em Java e Python (30.637 commits, 269.513 anomalias, 299.221 pares anomalia-bug), reconstruímos linhas do tempo para instâncias propensas a defeitos e classificamos cada uma em quatro padrões temporais: induzido por correção, anomalia-primeiro, bug-primeiro e mesmo-commit. Uma linha de base nula por pareamento aleatório revela que o padrão dominante (induzido por correção) se aproxima da expectativa nula, indicando que ele reflete a estrutura temporal do projeto e não uma associação genuína em nível de arquivo. Em contraste, a co-ocorrência no mesmo commit é 3,1× a taxa aleatória, e instâncias anomalia-primeiro apresentam frequência de mudança significativamente maior (delta de Cliff = 0,39, efeito médio). A análise de sobrevivência de Kaplan-Meier mostra uma mediana de 37 dias entre a introdução da anomalia e o primeiro bug associado. Em granularidade de arquivo, a dispersão de desenvolvedores emerge como o mais forte diferenciador de arquivos prejudiciais (delta de Cliff = -0,57, efeito grande), enquanto arquivos Clean e Smelly são estatisticamente indistinguíveis – estabelecendo que é a conjunção de anomalias e bugs, e não a anomalia isoladamente, que caracteriza uma população distinta.
Por fim, testamos se a nocividade pode ser avaliada diretamente a partir do código-fonte. Avaliamos quatro Modelos de Linguagem de Grande Porte (Large Language Models) pequenos e executáveis localmente (8B-30B parâmetros) em 1.200 trechos de código rotulados extraídos do mesmo conjunto de dados. Os modelos detectam anomalias de código com acurácia variável, porém relevante (F1 médio de 0,21 a 0,67; até 0,88 para God Class), mas todos alcançam Coeficientes de Correlação de Matthews próximos de zero (−0,19 a 0,10) na classificação de nocividade – não melhores que o acaso – e são superados por uma linha de base trivial que ignora completamente o trecho de código.
Em conjunto, estes estudos sustentam uma única conclusão: a nocividade não é uma propriedade estrutural do código, mas uma propriedade de seu histórico e de sua autoria. Frequência de mudança, proximidade temporal e dispersão de desenvolvedores – e não a co-ocorrência estática ou a severidade estrutural – fornecem os sinais acionáveis para identificar código verdadeiramente prejudicial, e ferramentas de detecção que ignoram essa distinção continuarão a reportar em excesso.
Palavras-chave: Anomalias de Código, Código Prejudicial, Aprendizado por Transferência, Análise Temporal, SZZ, LLM, Dispersão de Desenvolvedores, Código Propenso a Defeitos, Qualidade de Software
Comentários desativados