2015-07-04 7 views
12

Per curiosità, stavo giocando con traboccante la lo stack con questo codice:quattro diversi risultati quando traboccante pila principale

fn main() { 
    let my_array: [i32; 3000000000] = [3; 3000000000]; 
    println!("{}", my_array[0]); 
} 

e con mia sorpresa ho finito con tre diversi esiti:

1) Questo è quello che mi aspettavo:

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

2) Sorprendentemente vago:

Illegal instruction (core dumped) 

3) totalmente sconcertante:

208333333 

Affinché natura stocastica di presentarsi ho dovuto riavviare la shell, altrimenti i risultati sono stati deterministico (vorrei avere lo stesso messaggio di errore più e più volte).

ho compilato con solo:

rustc my_file.rs 

e excuted con:

./my_file 

La mia versione rustc:

rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14) 

La mia versione di Ubuntu:

Distributor ID: Ubuntu 
Description: Ubuntu 14.04 LTS 
Release: 14.04 
Codename: trusty 

Anche la dimensione della matrice che sto cercando di creare è di 12 concerti, sono su un laptop piccolo che non ha quella quantità di RAM.

Qualche idea su cosa potrebbe succedere qui?

Edit:

stavo giocando con la dimensione della matrice (che credo possa essere la ragione di diversi errori, ma perché?), Ed ha ottenuto un altro:

4) ha perfettamente senso.

error: the type `[i32; 300000000000000]` is too big for the current architecture 

e la mia architettura del sistema è x86_64.

+0

Quindi, stai testando un comportamento indefinito e ti stai chiedendo perché non puoi definire cosa ottieni;)? –

+2

Hm, Rust specifica da qualche parte che questo comportamento non è definito? –

+2

Il comportamento non definito dovrebbe verificarsi solo in un blocco 'non sicuro'. Questo comportamento sembra un bug. –

risposta

1

Sembra che al di sopra della casualità sia correlata alla mia macchina.

Ho controllato lo stesso codice su un'altra macchina, che ha la stessa versione rustc, la versione ubuntu e la stessa architettura. E i miei risultati di un molto più prevedibile:

Se dimensione dell'array 536870871 o maggiore (senza ottenere per caso 4) ottengo:

Illegal instruction (core dumped) 

Se la dimensione della matrice è 536870870 o più piccolo (senza essere abbastanza piccolo effettivamente lavorare) ottengo:

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

Non una sola volta hanno ho ottenuto un caso 3) dove avevo spazzatura restituito.