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.