Эта простая программа C редко заканчивается на той же глубине вызова:Почему ошибки stackoverflow хаотичны?
#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);
}
Что может быть причины этого хаотического поведения?
Я использую fedora (16GiB ram, размер стека 8192) и скомпилирован с использованием cc без каких-либо опций.
EDIT
- Я знаю, что эта программа будет бросать StackOverflow
- Я знаю, что позволяет некоторые оптимизации компилятора изменит свое поведение и что программа достигнет целочисленного переполнения.
- Я знаю, что это неопределенное поведение, цель этого вопроса состоит в том, чтобы понять/получить обзор конкретных внутренних правил поведения, которые могут объяснить то, что мы там наблюдаем.
Вопрос более, учитывая, что на Linux нить размер стека фиксирован и определяется ulimit -s
, что будет влиять на доступный размер стека, так что StackOverflow не всегда происходит на той же глубине вызова?
EDIT 2 @BlueMoon всегда видит один и тот же выход на его CentOS, в то время как на моем Fedora, со стеком 8M, я вижу различные выходы (последний напечатанный целочисленные 261892 или 261845, или 261826, или ...)
@moffeltje 1 2 3 4 5 ... бесконечность –
Там нет остановки условие: в конце концов, прн + 1 переполнится – Coconop
@moffeltje Прочитайте название: ** Почему StackOverflow ошибки хаотичным ** –