vor dem Schreiben lesen ist nicht definiert mit Malloced-Speicher?

8

Laut diesem Reddit-Kommentar-Thread ist es undefiniert, ob ein Versuch unternommen wird Lese den Speicher, bevor er geschrieben wurde. Ich verweise auf normalen Heap-Speicher, der erfolgreich malloc ed.

wurde
  

... beachten Sie, dass dies nicht unbedingt gültig ist C: Das Compiler / Laufzeitsystem darf nicht initialisierten Speicher mit sogenannten Trap-Repräsentationen initialisieren, die beim Zugriff undefiniertes Verhalten verursachen.

Ich finde das schwer zu glauben. Gibt es ein Standardangebot?

Natürlich verstehe ich, dass es keine Garantie gibt, dass der Speicher auf Null gesetzt wurde. Die Werte in diesem nicht initialisierten Speicher sind im Wesentlichen pseudozufällig oder willkürlich. Aber ich kann nicht wirklich glauben, dass der Standard dies als undefiniertes Verhalten bezeichnen würde (in dem Sinne, dass es segfault oder alle Ihre Dateien oder was auch immer löschen könnte). Der Rest des Reddit-Threads hat dieses Problem nicht weiter beleuchtet.

    
Aaron McDaid 09.02.2012, 22:36
quelle

3 Antworten

10

Beim Zugriff über char* ist dies definiert. Aber ansonsten ist dies undefiniertes Verhalten.

  

(C99, 7.20.3.3) "Die malloc-Funktion weist Speicherplatz für ein Objekt zu, dessen Größe durch die Größe bestimmt wird und dessen Wert nicht bestimmt ist."

auf unbestimmten Wert:

  

(C99, 3.17.2p1) "unbestimmter Wert: entweder ein unspezifizierter Wert oder eine Trap-Repräsentation"

beim Lesen von Trap-Repräsentationen durch einen Nicht-Zeichen -Typ, der nicht definiert ist:

  

(C99, 6.2.6.1p5) "Bestimmte Objektdarstellungen müssen keinen Wert des Objekttyps darstellen. Wenn der gespeicherte Wert eines Objekts eine solche Repräsentation hat und von einem Lvalue-Ausdruck gelesen wird, der keinen Zeichentyp hat, Das Verhalten ist nicht definiert. [...] Eine solche Repräsentation wird als Trap-Repräsentation bezeichnet. "

    
ouah 09.02.2012, 22:41
quelle
2

Es muss rational nicht definiert sein. Andernfalls wäre das notwendige Verhalten eines C-Programms, das unter etwas wie Valgrind läuft, das Lesen von nicht initialisiertem Speicher diagnostiziert und entsprechende Fehler beim Auftreten auslöst, unter dem Standard illegal.

Beim Lesen des Standards lautet die Schlüsselfrage, ob die Werte des mallokalisierten Speichers "unspezifizierte Werte" sind (die einen lesbaren Wert haben müssen) oder "unbestimmte Werte" (die Trap-Repräsentationen enthalten können; vgl. Definition 3.17.2 .)

Wie in 7.20.3.3, in den anderen Antworten zitiert, gibt malloc einen Speicherblock zurück, der unbestimmte Werte enthält und deshalb Trap-Repräsentationen enthalten kann. Die relevante Diskussion von Trap-Repräsentationen ist 6.2.6.1, Teil 5:

  

Bestimmte Objektdarstellungen müssen keinen Wert des Objekttyps darstellen. Wenn der gespeicherte Wert eines Objekts eine solche Repräsentation hat und von einem Lvalue-Ausdruck gelesen wird, der keinen Zeichentyp hat, ist das Verhalten nicht definiert. ... Eine solche Repräsentation wird Trap-Repräsentation genannt.

Also, da gehst du hin. Grundsätzlich ist es der C-Implementierung erlaubt, Verweise auf unbestimmte Werte zu erkennen (d. H. "Aufzufangen") und sich mit diesem Fehler zu befassen, wie er dies wählt, einschließlich auf undefinierte Arten.

    
Brooks Moses 09.02.2012 22:42
quelle
1

ISO / IEC 9899: 1999 , 7.20.3.3 malloc-Funktion:

  

Die malloc-Funktion weist Speicherplatz für ein Objekt zu, dessen Größe durch Größe und festgelegt wird   dessen Wert unbestimmt ist.

6.2.6.1 Darstellung von Typen, §5:

  

Bestimmte Objektdarstellungen müssen keinen Wert des Objekttyps darstellen. Wenn das gespeichert ist   Der Wert eines Objekts hat eine solche Repräsentation und wird von einem lvalue-Ausdruck gelesen, der dies tut   Haben Sie keinen Zeichentyp, ist das Verhalten nicht definiert.

Und Fußnote 41 macht es noch expliziter (zumindest für automatische Variablen):

  

Somit kann eine automatische Variable auf eine Trap-Repräsentation initialisiert werden, ohne ein undefiniertes Verhalten zu verursachen, aber der Wert der Variablen kann nicht verwendet werden, bis ein geeigneter Wert darin gespeichert ist.

    
undur_gongor 09.02.2012 22:40
quelle