Bei bestimmten Linux-Boxen scheinen die Variablen im Stack auf 0 initialisiert zu werden - warum?

283
Hennes

Ich habe ein fehlerhaftes Programm, das eine Variable auf den Stapel schiebt und ohne Initialisierung verwenden kann.

Ich nehme dasselbe Binärprogramm und führe es auf verschiedenen Linux-Boxen aus. Diese Boxen haben unterschiedliche CPUs (i5, i7), aber ansonsten laufen sie dieselbe Fedora-Distribution.

Ein Kasten, ich kann das Problem leicht fangen, weil die Variable zufällige Daten hat.

In einer anderen Box werden die Stack-Variablen jedoch immer auf 0 initialisiert (auch wenn sie nicht sein sollten).

Ich versuche, die Ursache für dieses unterschiedliche Verhalten festzulegen. Wohin muss ich schauen? Was kann das bewirken? Gibt es Kernel-Features, die dies beeinflussen können?

3
Ursache ist der Fehler im Programm. David Schwartz vor 10 Jahren 0
Die CPU sollte nichts damit zu tun haben. Ich kann jedoch unterschiedliche Ergebnisse erzielen, wenn ich initialisierten Speicher auf Boxen mit unterschiedlichen RAM-Mengen (sauber, nie verwendet oder alte Daten enthaltend) oder mit verschiedenen Bibliotheken (z. B. einen Aufruf des Speicherplatzes vor dem Zugriff auf das Programm) verwende. Hennes vor 7 Jahren 0

2 Antworten auf die Frage

2
Ecnerwal

Es gibt kein "sollte" oder "sollte nicht" für nicht initialisierte Daten . Es kann sein, was es verdammt gut gefällt. Alle Nullen sind eine Möglichkeit - ebenso alle Einsen und zufälliger Müll. In der Tat sind alle Nullen eine völlig akzeptable Form von zufälligem Müll. Anstatt sich mit den uninitialisierten Daten in verschiedenen Boxen zu beschäftigen, initialisieren Sie sie, und dann (und nur dann) können Sie wissen, was es sein soll.

Vielen Dank, Captain. Die Frage ist, warum zufällig in bestimmten Umgebungen nicht zufällig ist. SELinux-Erweiterungen, einige Stapelschutzfunktionen in glibc usw.? vor 10 Jahren 0
0
Vouze

In C hängt die Initialisierung von Variablen von der Optimierungsstufe ab, zu der das Programm erstellt wurde.

Die Optimierungsstufe 3 initialisiert keine Variablen im Stapel.

gcc -O3 program.c -o program