Su certe finestre di Linux, le variabili nello stack sembrano essere inizializzate a 0 - perché?


3

Ho un programma bacato che spinge una variabile sullo stack e può usarlo senza inizializzazione.

Prendo lo stesso binario e lo eseguo su diverse Linux box. Quelle scatole hanno CPU diverse (i5, i7), ma a parte questo eseguono la stessa distribuzione Fedora.

Una scatola, posso facilmente cogliere il problema perché la variabile ha dati casuali.

Su un'altra casella, tuttavia, le variabili dello stack vengono sempre inizializzate su 0 (anche se non dovrebbero essere).

Sto cercando di definire la causa di questo comportamento diverso. Dove dovrei guardare? Cosa può causare questo? Ci sono caratteristiche del kernel che possono influenzare questo?


La causa è l'errore nel programma.
David Schwartz

Le CPU non dovrebbero avere nulla a che fare con questo. Tuttavia, sono in grado di ottenere risultati diversi quando utilizzo la memoria inizializzata su scatole con quantità di RAM diverse (pulite, mai usate prima rispetto ai vecchi dati) o con librerie diverse (ad esempio callocing lo spazio prima di dare accesso al programma).
Hennes

Risposte:


2

Non c'è "dovrebbe" o "non dovrebbe" per dati non inizializzati . Può essere qualunque cosa dannatamente gradisce. Tutti gli zeri sono una possibilità, così come tutti, e anche la spazzatura casuale. Infatti, tutti gli zeri sono una forma perfettamente accettabile di spazzatura casuale. Piuttosto che preoccuparsi di ciò che i dati non inizializzati si trovano su diverse caselle, inizializzalo e poi (e solo allora) puoi sapere che cosa "dovrebbe essere".


Grazie Capitano. La domanda è perché casuale non è casuale in certi ambienti. Estensioni SELinux, alcune funzionalità di protezione dello stack in glibc, ecc.?

0

In C, l'inizializzazione delle variabili dipende dal livello di ottimizzazione quando il programma è stato compilato.

Il livello di ottimizzazione 3 non inizializzerà alcuna variabile nello stack.

gcc -O3 program.c -o program
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.