Skip to content
Latchkey

O que é um Stack Overflow? Quando o call stack acaba

Um stack overflow é o erro que você recebe quando um programa excede o tamanho fixo de seu call stack, quase sempre porque chamadas de função aninhadas se acumulam demais.

O call stack tem um limite de tamanho rígido, e toda chamada de função usa um pouco dele. Um stack overflow significa que esse limite foi ultrapassado: o programa tentou empilhar um frame a mais do que cabia. A causa esmagadoramente comum é recursão sem um caso base adequado, então a função continua chamando a si mesma para sempre.

Por que o stack transborda

Cada chamada de função empilha um frame e só um retorno o desempilha. Se as chamadas continuam aninhando (especialmente recursão descontrolada), os frames se acumulam até exceder o limite do stack. Nesse ponto o runtime levanta um stack overflow e normalmente trava o programa.

Causas comuns

  • Recursão com um caso base ausente ou inalcançável.
  • Recursão mútua entre funções que nunca termina.
  • Recursão extremamente profunda mas finita sobre uma entrada muito grande.
  • Loops infinitos acidentais de chamadas de função via callbacks.

Como corrigir

Garanta que todo caminho recursivo tenha um caso base que seja de fato alcançado. Para recursão muito profunda, reescreva o algoritmo de forma iterativa ou use uma estrutura de dados explícita no heap, que tem muito mais espaço que o stack.

Stack overflow vs out of memory

Um stack overflow esgota o pequeno call stack fixo, geralmente por recursão. Um erro de out-of-memory esgota o heap muito maior, geralmente por alocar dados demais. Eles parecem semelhantes (o programa morre), mas têm causas e correções diferentes.

Um exemplo rápido

Uma função de fatorial escrita como factorial(n) => n * factorial(n - 1) sem um caso base if (n <= 1) vai recorrer para sempre e transbordar o stack em vez de retornar um resultado.

Stack overflows no CI

Um stack overflow em um teste é um bug determinístico: falha da mesma forma toda vez, então dar retry é inútil. A Latchkey trata crashes determinísticos de forma diferente de falhas transitórias de infraestrutura, dando retry automático apenas nas últimas para que um bug de recursão genuíno não seja mascarado.

Principais conclusões

  • Um stack overflow significa que o call stack excedeu seu tamanho fixo, geralmente por recursão descontrolada.
  • Difere de out-of-memory, que esgota o heap em vez do stack.
  • É um bug determinístico, então dar retry não ajuda; corrija a recursão.

Guias relacionados