Integer Overflow Explicado: O Bug que Derruba
Integer overflow e um dos bugs mais antigos da computacao e continua derrubando sistemas criticos ate hoje. De Ariane 5 ao Gangnam Style, entenda como numeros que transbordam
Carregando
Integer overflow e um dos bugs mais antigos da computacao e continua derrubando sistemas criticos ate hoje. De Ariane 5 ao Gangnam Style, entenda como numeros que transbordam
Em 1996, um foguete de US$ 7 bilhoes explodiu 37 segundos apos o lancamento porque um numero nao cabia dentro de uma variavel. O Ariane 5 foi destruido por integer overflow. Parece brincadeira, mas e exatamente o que aconteceu.
Integer overflow e um daqueles bugs que todo programador ja ouviu falar, poucos realmente entendem a fundo, e quase ninguem testa direito. Neste artigo vou destrinchar tudo: o que e, como funciona em cada linguagem, e os casos historicos onde esse bug causou estrago de verdade.
Se voce quer entender a historia completa do Ariane 5, tem um artigo detalhado aqui: <a href='/2025-3/a-historia-nao-contada-do-desa'>A Historia Nao Contada do Desastre do Ariane 5</a>. Mas aqui vou focar no mecanismo tecnico por tras do desastre.
Antes de falar de overflow, precisa entender como inteiros funcionam em memoria. Computadores guardam tudo em bits: zeros e uns. Um inteiro de 8 bits pode representar 256 valores diferentes (2^8).
Para inteiros sem sinal (unsigned), esses 256 valores vao de 0 a 255. Para inteiros com sinal (signed), metade fica para negativos: -128 a 127. E aqui esta a pegadinha.
Computadores usam um sistema chamado complemento de dois para representar negativos. No bit mais significativo (o da esquerda), 0 significa positivo e 1 significa negativo. O numero 127 em binario de 8 bits e 01111111. Se voce somar 1 a isso, fica 10000000. Sabe qual numero esse padrao representa? -128.
Integer Overflow Explicado: O Bug que Derruba. Integer overflow e um dos bugs mais antigos da computacao e continua derrubando sistemas criticos ate hoje. De Ariane 5 ao Gangnam Style, entenda como numeros que transbordam destroem software real.
Isso nao e bug do hardware. E matematica binaria funcionando exatamente como foi projetada. O problema e quando o software nao espera por esse comportamento.
O sistema de navegacao inercial do Ariane 5 foi reaproveitado do Ariane 4. Funciona, comprovado, por que reescrever? Mas o Ariane 5 era mais rapido. Muito mais rapido.
Ada e a linguagem mais segura do mundo. Entenda por que continua dominando sistemas criticos.
Uma variavel chamada BH (velocidade horizontal relativa) era representada como float de 64 bits. Quando o software tentou converter esse valor para int16 para transmissao, o numero era 32768. Maior que o maximo de um int16 (32767). Overflow.
O software nao tinha protecao para esse caso porque no Ariane 4 esse valor nunca excedia o limite. Ninguem imaginou que um foguete mais potente quebraria uma variavel.
O overflow gerou uma excecao. O sistema de navegacao, sem tratamento para aquela excecao especifica, desligou. O sistema de backup entrou em acao. Mas o backup rodava o mesmo software com o mesmo bug. O segundo sistema tambem falhou. Sem navegacao, o foguete comeou a girar fora de controle. O sistema de autodestruicao ativou. US$ 7 bilhoes viram uma nuvem de fumaca sobre a Guiana Francesa.
O Ariane 5 e o mais dramatico, mas integer overflow aparece em lugares que voce nem imagina.
O classico Pac-Man guarda o numero do nivel em um byte unsigned (uint8). Maximo: 255. Quando o nivel chega em 256, o byte transborda para 0. O codigo que renderiza o mapa usa esse numero diretamente para calcular posicoes. Com 0, metade da tela fica com lixo de memoria, misturando numeros de fase, letras e graficos corrompidos. O nivel 256 e literalmente injogavel.
Em 2014, o contador de visualizacoes do YouTube usava int32 com sinal. Limite: 2.147.483.647 views. Gangnam Style estava quebrando esse limite em tempo real. O Google atualizou o contador para int64 as pressas, mas por algumas horas o numero ficou negativo no codigo interno.
Em 2015, a FAA emitiu uma diretiva sobre o Boeing 787 Dreamliner. Os geradores de energia perdiam potencia se ficassem ligados por mais de 248 dias continuos. A causa: um contador interno de 32 bits contando centesimos de segundo. Em 248 dias, o contador atingia 2^31 e fazia overflow. A solucao temporaria foi rebotar o aviao antes de 248 dias.
248 dias x 24 horas x 60 minutos x 60 segundos x 100 centesimos = 2.143.814.400
Limite do int32 com sinal: 2.147.483.647
Diferenca: apenas 3.669.247 centesimos de segundo (aprox. 10 horas)
Um aviao comercial fica ligado por semanas sem reboot. Era questao de tempo.
Y2K tecnicamente nao e integer overflow classico, mas e o mesmo conceito: guardar ano em 2 digitos (0-99) e esperar que o computador entenda que '00' vem depois de '99'. O mundo gastou US$ 300 bilhoes para corrigir isso antes de 2000.
Cada linguagem trata overflow de um jeito. E importante saber o comportamento da sua linguagem especifica.
A diferenca entre signed e unsigned em C e critica: overflow de unsigned e comportamento definido (wrap-around). Overflow de signed e comportamento indefinido. O compilador pode fazer literalmente o que quiser, incluindo remover loops inteiros que ele julgar 'impossíveis' por assumir que overflow nao ocorre.
Java nao lanca excecao em overflow de inteiros. O valor simplesmente faz wrap-around. Isso e especialmente perigoso porque parece que esta funcionando.
Python faz algo que a maioria das linguagens nao faz: inteiros crescem automaticamente. Um int em Python pode ter qualquer tamanho, limitado apenas pela RAM disponivel.
Python parece resolver o problema, mas tem custo: operacoes com inteiros grandes sao muito mais lentas que operacoes nativas de 64 bits. Por isso numpy usa tipos fixos, e ai o overflow volta.
Conhecer o problema e metade do caminho. A outra metade e saber quando e como se proteger.
Detectar overflow manualmente em bases de codigo grandes e impossivel. Felizmente existem ferramentas para isso.
Para projetos criticos como os da NASA, onde integer overflow pode custar vidas e bilhoes, a abordagem e usar multiplas ferramentas em camadas: analise estatica no CI, sanitizers em testes, e revisao manual em codigo de seguranca.
O desastre do Ariane 5 aconteceu porque ninguem testou o sistema com os valores reais do novo foguete. Uma simples verificacao de range teria evitado tudo. Da pra aprender muito sobre engenharia de software com esses casos historicos, e o artigo sobre <a href='/2025-3/a-historia-nao-contada-do-desa'>o desastre do Ariane 5</a> mergulha fundo em todas as decisoes que levaram ao fracasso.
Integer overflow e simples de entender mas facil de ignorar. Os casos historicos mostram que o custo de ignorar pode ser catastrofico.
Rust e a linguagem mais honesta sobre overflow: em debug, o programa crasha ao inves de silenciosamente produzir valor errado. Em producao, voce escolhe o comportamento que quer de forma explicita.
Nem todo overflow e bug. Checksums, hash functions e geradores de numeros pseudoaleatorios frequentemente dependem de wrap-around intencional. A diferenca e documentacao e intencionalidade: use tipos unsigned quando wrap-around e o comportamento esperado, e documente claramente que o overflow e proposital.