Aka*_*all 12 memory stack rust
出于好奇,我正在玩这个代码溢出堆栈:
fn main() {
let my_array: [i32; 3000000000] = [3; 3000000000];
println!("{}", my_array[0]);
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我结束了三个不同的结果:
1)这是我的预期:
thread '<main>' has overflowed its stack
Illegal instruction (core dumped)
Run Code Online (Sandbox Code Playgroud)
2)令人惊讶的模糊:
Illegal instruction (core dumped)
Run Code Online (Sandbox Code Playgroud)
3)完全令人费解:
208333333
Run Code Online (Sandbox Code Playgroud)
为了显示随机性,我必须重新启动shell,否则结果是确定性的(我会一遍又一遍地得到相同的错误消息).
我编译只是:
rustc my_file.rs
Run Code Online (Sandbox Code Playgroud)
并执行:
./my_file
Run Code Online (Sandbox Code Playgroud)
我的rustc版本:
rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)
Run Code Online (Sandbox Code Playgroud)
我的ubuntu版本:
Distributor ID: Ubuntu
Description: Ubuntu 14.04 LTS
Release: 14.04
Codename: trusty
Run Code Online (Sandbox Code Playgroud)
我试图创建的阵列的大小也是12演出,我在一台没有那么多RAM的笔记本电脑上.
有什么想法可以在这里发生什么?
编辑:
我正在玩数组的大小(我认为这可能是导致不同错误的原因,但为什么?),还有一个:
4)具有完美的感觉.
error: the type `[i32; 300000000000000]` is too big for the current architecture
Run Code Online (Sandbox Code Playgroud)
我的系统架构是x86_64
.
看来上面的随机性和我的机器有关。
我在另一台机器上检查了相同的代码,它具有相同的rustc
版本、ubuntu
版本和相同的架构。我的结果更加可预测:
如果数组的大小536870871
或更大(没有达到情况 4),我得到:
Illegal instruction (core dumped)
Run Code Online (Sandbox Code Playgroud)
如果数组的大小536870870
或更小(没有小到足以实际工作),我得到:
thread '<main>' has overflowed its stack
Illegal instruction (core dumped)
Run Code Online (Sandbox Code Playgroud)
我从来没有遇到过3)
退回垃圾的情况。