Algo deu errado. Use um navegador moderno.

Visão da floresta

Caçando bugs em

Python

do olho humano à IA

Daniel Diniz

Quem sou

Um paralelo

Biologia : Programação
Animais : Bugs

⬇️

Descobertas

Observação Direta

Método mais básico

Capivara

Registro de indícios

Evidências indiretas da presença de animais

Armadilhas Fotográficas

Câmeras automáticas com iscas diversas

Paralelo

Simples Observação: Revisão Manual

Registro de Indícios: Análise Estática

Armadilhas Fotográficas (Iscas): Fuzzing

A Equipe de Pessoas Biólogas

Especialistas em diversos grupos

Equipe de pessoas biólogas

Relatórios de Campo

SPOILERS!

Técnicas

Revisão Manual

Análise Estática

Fuzzing

Análise Baseada em IA

Revisão Manual

Olho humano

Depende da experiência

Não escala bem

Desenvolvimento Guiado por Uai

Capivara

Análise Estática

Não executa, procura padrões

Regras pré-definidas, configuráveis

Diagrama: análise estática de código Python

Análise Estática

Não executa, procura padrões

Regras pré-definidas, configuráveis

Funciona bem em larga escala

Tende a gerar falsos positivos

Fuzzing

Fornece inputs problemáticos

Executa, análise dinâmica

Fuzzing Aleatoriedade e Feedback

Fuzzing

Fornece inputs problemáticos

Executa, análise dinâmica

Alcança bugs profundos

Escala bem, exige muita CPU

Análise Baseada em IA

Estruturada, com agentes especializados

Revisão direta do código

Procura por padrões

Testa inputs problemáticos

Diagrama: IA encontra código semelhante

Análise Baseada em IA

Especialização

Colaboração

Verificação

Ferramentas

Para cada técnica vista

Para Revisão Manual

def max_power(a, b):
    """Maior número na exponenciação de um par."""
    if a > b:
        result = b ** a
        if b < 0 and a % 2 == 0:
            result = abs(result)
        return result
    else:
        result = a ** b
        if a < 0 and b % 2 == 0:
            result = abs(result)

Para Análise Estática

Diversidade de ferramentas

Integradas a IDEs

Abstrações e profundidades diferentes

Exemplos

ruff
mypy

Para Análise Estática

Padrões locais: Ruff, Pylint
Tipos e fluxo: mypy, Pyright
Fluxo de dados: Pysa, CodeQL
Contratos: CrossHair

Para Fuzzing

Atheris: cobertura
Hypothesis: propriedades
HypoFuzz: cobertura
OSS-Fuzz: campanhas contínuas
fusil / lafleur: fuzzers especializados

lafleur

Diagrama do ciclo do lafleur

Seleção

Mutação

Execução

Análise

Introspecção

class Silly:
    def __iter__(self):
        raise RuntimeError("ninguém espera a Inquisição Espanhola")

def generator():
    yield from Silly()

next(generator())

Esperado: RuntimeError

Observado: crash

Para Análise Baseada em IA

Revisão de PR
Copilot · CodeRabbit · Qodo

Análise + IA
Semgrep · Snyk · CodeQL

Auditoria de repositório
RepoAudit · toolkits

Família -review-toolkit:

Um bug corrigido... quase


groupby_next: ✅ referência protegida


_grouper_next: ❌ bug permaneceu

O agente examinou o histórico e procurou a variante.

Um bug corrigido... quase


class Key:
    __hash__ = None
    counter = 0

    def __eq__(self, other):  # <- AQUI
        if not self.counter:
            self.counter += 1
            try: next(grouper_iter)  # <- E AQUI!
            except StopIteration: pass
            return NotImplemented
        return True
from itertools import groupby

it = groupby(range(4), lambda x: Key())
key, grouper_iter = next(it)
items = list(grouper_iter)

Da pegada à descoberta


Achados candidatos
        ↓
Reproduzir + cruzar + deduplicar
        ↓
Evidência priorizada
                

Do achado à contribuição

achado
    ↓
reproducer
    ↓
deduplicação
    ↓
comunicação + validação
    ↓
correção

Respeito às pessoas mantenedoras

Capivárias

 

Jogo: too many capybaras... can you handle them all?

As Campanhas

2008: primeiros bugs, no olho

2024-2025: fuzzing do CPython

2026: IA no CPython e nas extensões

Olho → fuzzing → IA

Publicações

Artigo na LWN.net: Using LLMs to find Python C-extension bugs

Publicações

Dissertação de Hameed Sahib sobre fuzzing guiado por cobertura do JIT do CPython

Recursos

Requisito

Como obtenho

CPU

Máquinas próprias e nuvem

IA

Assinatura e apoio recebido

Tempo

Trabalho voluntário

Resultados: Fuzzing

fusil: 146 bugs distintos

52 issues em 2024-2025, release blockers

lafleur: 28 bugs no JIT

Falta de memória: 31 bugs numa issue

Resultados: IA

Extensões: ~690 achados, 215+ reproduzidos

138+ bugs em extensões, 55+ no CPython

No total (julho/2026): 464 bugs, 321 resolvidos

Achado não é bug


~690 achados
        ↓
    revisão + reprodução
        ↓
215+ reproduzidos
        ↓
deduplicação + comunicação
        ↓
138 bugs distintos
                

Importância das Campanhas

Bugs corrigidos

Padrões recorrentes aparecem

APIs e práticas podem melhorar

Projetos passam a caçar melhor

Importância das Ferramentas

Ampliam o olhar

Trazem perspectivas diferentes

Ensinam a pensar como caça-bugs

"Como isso pode dar errado?"

Futuro

Modelos mais capazes

Ferramentas + verificação melhores

Mais gente caçando

Outras matas

As ferramentas funcionaram com:

Também podem funcionar para você!

Contato


devdanzin@gmail.com

https://t.me/devdanzin

https://github.com/devdanzin

https://mastodon.social/@danzin

https://discuss.python.org/u/devdanzin

Capivara usando o computador

Um Convite

Vamos caçar bugs?

Capivara programando