Mandelbug: o que é, causas de instabilidade e métodos de busca

Autor: IT Sectr Publicado: 2026-07-29 Tempo de leitura: 9 min

Mandelbug é um tipo de erro de software cujo comportamento é caótico e depende de múltiplos fatores: estado da memória, ordem de execução das threads, condições externas. O nome vem do matemático Benoit Mandelbrot, criador da teoria dos fractais, onde a menor mudança nas condições iniciais leva a um resultado radicalmente diferente. De acordo com Wikipédia (2026), Mandelbug é um dos tipos de defeitos mais difíceis de diagnosticar porque não pode ser reproduzido com um cenário fixo.

Pontos Principais

  • Mandelbug — um erro caótico que se reproduz irregularmente e depende do estado do sistema.
  • O nome está associado aos fractais de Mandelbrot — a menor mudança nos dados de entrada altera o comportamento do bug.
  • O diagnóstico de Mandelbug requer ferramentas especiais: registro, perfilamento e testes de estresse.
  • As principais causas — corridas de threads, condições de corrida, comportamento indefinido e problemas de memória.
  • A prevenção é alcançada através da imutabilidade de dados, bloqueios e design cuidadoso do acesso concorrente.

O que é Mandelbug?

Mandelbug é um bug de software com comportamento não linear e caótico. Ao contrário do Bohrbug, que se reproduz de forma estável com os mesmos dados de entrada, o Mandelbug pode aparecer em uma sessão e estar completamente ausente em outra sob as mesmas condições externas.

O termo foi introduzido por Jim Gray e Andreas Reuter em 1993 como parte de uma classificação de bugs de software. Mandelbug recebeu esse nome em homenagem a Benoit Mandelbrot, o matemático que descobriu os conjuntos fractais, onde o comportamento do sistema depende exponencialmente das condições iniciais.

O principal perigo do Mandelbug reside na sua imprevisibilidade. Um testador pode executar o mesmo cenário cinquenta vezes, e o bug só aparecerá na quinquagésima primeira vez — ou não aparecerá. Isso cria uma falsa sensação de estabilidade do sistema.

Definição por Gray e Reuter

De acordo com a classificação do livro “Transaction Processing: Concepts and Techniques”, Mandelbug é um defeito que não satisfaz a condição de determinismo. Seu comportamento depende de fatores que o desenvolvedor não pode controlar: ordem de escalonamento das threads, fragmentação de memória, cache.

Origem do nome Mandelbug

O nome Mandelbug vem de Benoit Mandelbrot, o matemático que introduziu o conceito de fractais e estudou sistemas caóticos. O conjunto de Mandelbrot demonstra uma propriedade impressionante: mudanças infinitamente pequenas nas condições iniciais levam a resultados fundamentalmente diferentes.

Gray e Reuter traçaram uma analogia direta: assim como o fractal de Mandelbrot é sensível às condições iniciais, o Mandelbug é sensível ao estado do sistema no momento da execução. Uma mudança na ordem de alocação de memória ou no quantum de escalonamento das threads — e o bug desaparece ou aparece.

No jargão profissional, Mandelbug também é chamado de “bug fantasma” ou “bug intermitente”. Ele é o principal inimigo dos engenheiros de QA, pois não se submete à metodologia padrão de “reproduzir — reportar — verificar correção”.

Características do Mandelbug

Mandelbug possui um conjunto único de propriedades que o distinguem de todos os outros tipos de bugs de software. Vamos examinar cada uma delas.

Não linearidade

O comportamento do Mandelbug é não linear. Ele pode não se manifestar milhares de vezes e, de repente, aparecer sob condições aparentemente idênticas. Essa propriedade o torna praticamente indetectável durante os testes funcionais.

Dependência de estado

Mandelbug depende do estado interno do sistema: tamanho do heap, ordem de alocação de objetos, ocupação do cache da CPU. Até mesmo adicionar um printf de depuração pode alterar os tempos e “curar” o bug, transformando-o em Heisenbug.

Efeito borboleta

O termo “Efeito borboleta” se aplica totalmente ao Mandelbug. Alterar uma linha de código em um módulo completamente diferente pode eliminar ou, inversamente, causar Mandelbug em uma parte não relacionada da aplicação devido a mudanças nos padrões de alocação de memória.

Principais causas do Mandelbug

As causas do Mandelbug estão relacionadas à execução concorrente e ao comportamento não determinístico dos sistemas computacionais modernos.

Corridas de threads

Uma condição de corrida clássica — quando duas threads acessam simultaneamente um recurso compartilhado sem sincronização. O resultado depende de qual thread executa primeiro, e a ordem de execução não é garantida pelo sistema operacional.

Problemas de cache

O cache do processador e o cache do navegador podem armazenar dados desatualizados. Se uma aplicação depende de um valor em cache que não é mais relevante, ocorre um Mandelbug — um erro que só se manifesta com cache “frio” ou “quente”.

Comportamento indefinido do compilador

Algumas construções da linguagem (por exemplo, variáveis não inicializadas em C/C++) levam a comportamento indefinido. O compilador pode gerar código diferente dependendo do nível de otimização, flags de compilação e versão do compilador.

Como encontrar Mandelbug em um projeto

Encontrar Mandelbug requer uma abordagem sistemática e ferramentas especializadas. Métodos convencionais de depuração não funcionam aqui porque o bug não é reproduzível sob demanda.

Registro em todos os níveis

O registro detalhado é a única maneira de capturar Mandelbug. Cada thread deve registrar seu estado, carimbos de data/hora e ordem das operações. Após uma falha, os registros são analisados para identificar padrões.

Testes de estresse

Testes de carga com operações repetidas aumentam a probabilidade de manifestação do Mandelbug. Quanto mais iterações, maior a chance de que uma combinação rara de condições leve a uma falha.

Ferramentas especializadas

ThreadSanitizer, Helgrind e outros analisadores de corrida de threads podem detectar potenciais Mandelbugs sem realmente reproduzi-los. Eles analisam o código estaticamente e encontram lugares onde condições de corrida podem ocorrer.

cpp
// Potential Mandelbug: race condition on shared counter
int counter = 0;

void increment() {
    // Two threads may read counter at the same time
    counter++;  // race condition here
}

Neste exemplo, Mandelbug pode se manifestar apenas sob uma combinação específica de circunstâncias — quando ambas as threads chamam increment() simultaneamente. Em 99% dos casos, o código funciona corretamente, criando uma falsa sensação de segurança.

Mandelbug vs Heisenbug: qual a diferença

Desenvolvedores iniciantes frequentemente confundem Mandelbug e Heisenbug. Embora ambos os tipos pertençam a bugs instáveis, há uma diferença fundamental entre eles.

CritérioMandelbugHeisenbug
Causa da instabilidadeEstado caótico do sistemaA própria depuração altera o comportamento
Comportamento sem depuradorManifesta-se raramente, mas imprevisivelmenteManifesta-se de forma estável até tentar depurar
Comportamento no depuradorPode desaparecer ou mudarQuase garantido que desaparece
Causa típicaCondição de corrida, temporizaçãoOtimização do compilador, temporizadores
Ferramenta de detecçãoThreadSanitizer, logsAnálise de dumps, desmontador

Mandelbug é caótico por natureza, enquanto Heisenbug é determinístico mas muda de comportamento sob observação. A diferença é importante para escolher uma estratégia de depuração.

Exemplo de Mandelbug em código

Vejamos um Mandelbug típico em uma aplicação Android relacionado a uma corrida de threads ao trabalhar com SharedPreferences.

java
public class UserPreferences {
    private final SharedPreferences prefs;

    public synchronized void updateScore(int delta) {
        int current = prefs.getInt("score", 0);
        current += delta;
        prefs.edit().putInt("score", current).apply();
    }
}

À primeira vista, o código está correto: o método está sincronizado. No entanto, SharedPreferences é um singleton dentro do processo, e a sincronização não protege contra chamadas paralelas de diferentes threads que obtiveram o mesmo valor de current antes que uma delas pudesse escrever um novo valor. Como resultado, um incremento é perdido.

Este Mandelbug pode não se manifestar por semanas até que duas threads acidentalmente chamem updateScore simultaneamente com diferença mínima de tempo. Após a detecção, a correção é trivial — usar uma operação atômica ou um banco de dados com transações.

Perguntas Frequentes

Como o Mandelbug difere de um bug intermitente comum?

Mandelbug é uma subclasse de bugs intermitentes com natureza caótica pronunciada. Um bug intermitente comum pode ter uma causa compreensível mas rara, enquanto Mandelbug exibe uma dependência não linear de muitos fatores difíceis de identificar.

Por que o Mandelbug é difícil de reproduzir?

A dificuldade de reproduzir Mandelbug decorre de sua dependência de detalhes microscópicos do estado do sistema: ordem de alocação de memória, escalonamento de threads pelo sistema operacional, ocupação do cache da CPU. Esses fatores não podem ser controlados a partir do código da aplicação.

Quais ferramentas ajudam a encontrar Mandelbug?

As ferramentas mais eficazes: ThreadSanitizer (TSan), Valgrind Helgrind para C/C++, para Java — utilitários de análise de corrida (Intel Inspector, FindBugs), para código multithread — analisadores estáticos e testes de estresse com randomização de tempo.

O Mandelbug pode estar relacionado à memória?

Sim, problemas de memória são uma das principais causas do Mandelbug. Vazamentos de memória, fragmentação do heap, uso após liberação (use-after-free) e memória não inicializada criam condições onde o comportamento do programa se torna caótico e imprevisível.

Como se proteger contra Mandelbug na fase de design?

A imutabilidade dos dados é a melhor proteção. Se os dados não puderem ser alterados após a criação, as corridas de threads são eliminadas. Também ajudam: contratos explícitos de sincronização, tipos atômicos, isolamento do acesso concorrente atrás de bloqueios e filas de mensagens.

Resumo

  • Mandelbug — um bug de software caótico que não pode ser reproduzido deterministicamente devido à dependência do estado do sistema.
  • O nome vem de Benoit Mandelbrot, cujos fractais ilustram a sensibilidade às condições iniciais.
  • Principais causas — corridas de threads, comportamento indefinido, problemas de cache e fragmentação de memória.
  • O diagnóstico requer registro, testes de estresse e analisadores especializados (ThreadSanitizer).
  • Diferença do Heisenbug: Mandelbug é caótico, Heisenbug desaparece ao tentar depurar.
  • Testes unitários raramente ajudam a detectar Mandelbug — são necessários testes de integração e carga.
  • Recomendação: projete código multithread com dados imutáveis e bloqueios explícitos.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também