enn der Status des Stapels und der Register angegeben wird, können wir das Ergebnis des undefinierten Verhaltens von printf vorhersage

Hier ist ein einfacher C-Code für ein Klassenquiz:

#include <stdio.h>

int main() {
  float a = 2.3;
  printf("%d\n", a);
  return 0;
}

Kompiliert und ausgeführt auf:

Apple LLVM Version 6.1.0 clang-602.0.53) (basierend auf LLVM 3.6.0svn)
Ziel:x86_64 -apple-darwin14.5.0

Die Ausgabe dieses Codes istundefined. Ich versuche die Ausgabe vorherzusagen, indem ich den Speicher in der Nähe von @ inspiziera mit dem Debugger X Befehl in gdb). Zum Beispiel, wenn die Adresse vona ist0x7fff5fbffb98, dann der Kontext in der Nähe von&a ist wie folgt

0x7fff5fbffb98: 1075000115
0x7fff5fbffb9c: 0
0x7fff5fbffba0: 1606417336
0x7fff5fbffba4: 32767
0x7fff5fbffba8: -1754266167
0x7fff5fbffbac: 32767
0x7fff5fbffbb0: -1754266167
0x7fff5fbffbb4: 32767

Dann die Ausgabe vonprintf ist1606417352. Ich weiß, dass die Ausgabe bei Verwendung eines falschen Bezeichners undefiniert ist. Aus Neugier hatte ich erwartet, dass die Ausgabe dieses undefinierten Verhaltens mit einem Speicher aus dem laufenden Stapel oder den Registern zusammenhängt, aber ich habe nicht herausgefunden, wie ich es korrelieren soll.

So welche Adresse oder welches Register verwendet wird, um den Ausgang dieses @ zu setzprintf? Mit anderen Worten, können wir angesichts des Status des laufenden Stacks und aller Werte aus allen Registern die Ausgabe dieses undefinierten Verhaltens vorhersagen (und wenn ja, wie)?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage