Четыре разных результата при переполнении основного стека
Из любопытства я играл с переполнением стека с помощью этого кода:
fn main() {
let my_array: [i32; 3000000000] = [3; 3000000000];
println!("{}", my_array[0]);
}
И к моему удивлению, я закончил три разных результата:
1) Это то, что я ожидал:
thread '<main>' has overflowed its stack
Illegal instruction (core dumped)
2) Неожиданно неопределенно:
Illegal instruction (core dumped)
3) Полностью озадачивает:
208333333
Чтобы показать стохастический характер, мне пришлось перезапустить оболочку, в противном случае результаты были детерминированными (я получал бы одно и то же сообщение об ошибке снова и снова).
Я скомпилировал только:
rustc my_file.rs
и вызывается с помощью:
./my_file
Моя версия rustc:
rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)
Моя версия ubuntu:
Distributor ID: Ubuntu
Description: Ubuntu 14.04 LTS
Release: 14.04
Codename: trusty
Также размер массива, который я пытаюсь создать, - 12 гигабайт, я на крошечном ноутбуке, у которого нет такого объема оперативной памяти.
Любые идеи, что здесь можно сделать?
Edit:
Я играл с размером массива (который, я думаю, может быть причиной разных ошибок, но почему?), и получил еще одно:
4) Делает совершенный смысл.
error: the type `[i32; 300000000000000]` is too big for the current architecture
и моя системная архитектура x86_64
.
Ответы
Ответ 1
Кажется, что выше случайности связано с моей машиной.
Я проверил тот же код на другом компьютере, который имеет ту же версию rustc
, ubuntu
и ту же архитектуру. И мои результаты намного более предсказуемы:
Если размер массива 536870871
или больше (без перехода к случаю 4), я получаю:
Illegal instruction (core dumped)
Если размер массива равен 536870870
или меньше (не будучи достаточно маленьким, чтобы на самом деле работать), я получаю:
thread '<main>' has overflowed its stack
Illegal instruction (core dumped)
Я не получил ни одного случая 3)
, где я возвращал мусор.