Подтвердить что ты не робот

Четыре разных результата при переполнении основного стека

Из любопытства я играл с переполнением стека с помощью этого кода:

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.

4b9b3361

Ответ 1

Кажется, что выше случайности связано с моей машиной.

Я проверил тот же код на другом компьютере, который имеет ту же версию rustc, ubuntu и ту же архитектуру. И мои результаты намного более предсказуемы:

Если размер массива 536870871 или больше (без перехода к случаю 4), я получаю:

Illegal instruction (core dumped)

Если размер массива равен 536870870 или меньше (не будучи достаточно маленьким, чтобы на самом деле работать), я получаю:

thread '<main>' has overflowed its stack
Illegal instruction (core dumped)

Я не получил ни одного случая 3), где я возвращал мусор.