Zwei Fälle beim Versuch, NULL zu drucken, funktioniert, andere SegFaults

8

Im Folgenden:

%Vor%

Ich bekomme die Ausgabe als:

%Vor%

Wenn ich in der GDB backtrace probiert habe, wird printf() in puts() umgewandelt. Aber ich verstehe nicht, warum das passiert.

BTW Ich fand diesen Artikel, aber er scheint immer noch keinen Sinn zu ergeben.

    
noMAD 10.04.2012, 21:09
quelle

1 Antwort

15

Der Standard besagt, dass die Übergabe eines NULL -Zeigers als Argument an ein printf mit %s -Spezifikator ein undefiniertes Verhalten 1 ist (dh alles kann passieren), also sind beide Verhaltensweisen zulässig.

Im ersten Fall tut dir die Standardbibliothek (insbesondere printf code) einen Gefallen, indem du (null) druckst.

Im zweiten Fall versteht der Optimierer stattdessen, dass Ihr printf durch ein puts ersetzt werden kann (was effizienter ist), ohne dass sich das "beobachtbare Verhalten" des Programms ändert, und ersetzt es . Aber, puts enthält nicht den NULL -Überprüfungscode von printf , und daher erhalten Sie einen Segmentierungsfehler.

  1. C99, §7.19.6.1, ¶8:

      

    Das Argument soll ein Zeiger auf das Anfangselement eines Arrays von Zeichentypen sein.

    ¶9:

      

    Wenn ein Argument nicht der richtige Typ für die entsprechende Konvertierungsspezifikation ist, ist das Verhalten nicht definiert.

    Sie fallen in diesen letzten Fall, weil NULL nicht "ein Zeiger auf das Anfangselement eines Arrays von Zeichentypen ist.

Matteo Italia 10.04.2012, 21:13
quelle

Tags und Links