Por que os erros de stackoverflow são caóticos?
Esse programa C simples raramente termina na mesma profundidade de chamada:
#include <stdio.h>
#include <stdlib.h>
void recursive(unsigned int rec);
int main(void)
{
recursive(1);
return 0;
}
void recursive(unsigned int rec) {
printf("%u\n", rec);
recursive(rec + 1);
}
Quais poderiam ser as razões por trás desse comportamento caótico?
Eu estou usando o fedora (16GiB de ram, tamanho da pilha de 8192) e compilado usando o cc sem nenhuma opção.
EDITAR
Estou ciente de que este programa lançará um stackoverflowEu sei que a habilitação de algumas otimizações do compilador mudará o comportamento e que o programa atingirá o número inteiro.Estou ciente de que esse é um comportamento indefinido, o objetivo desta pergunta é entender / obter uma visão geral dos comportamentos internos específicos da implementação que podem explicar o que observamos lá.A questão é mais, já que no Linux o tamanho da pilha de threads é fixo e fornecido porulimit -s
, o que influenciaria o tamanho da pilha disponível para que o fluxo de pilha nem sempre ocorra na mesma profundidade de chamada?
EDIT 2 O @BlueMoon sempre vê a mesma saída em seu CentOS, enquanto no meu Fedora, com uma pilha de 8M, vejo saídas diferentes (último número impresso inteiro 261892 ou 261845 ou 261826 ou ...)