2017-06-03 4 views
-1

Nach meinem Verständnis unten könnte das Programm abgestürzt sein, da es bereits freigegebenen Speicher freigibt, aber es ist nicht. Läuft auf meinem Linux-Rechner.Warum stürzt ein Double Free() das Programm nicht ab?

#include <stdio.h> 
#include <malloc.h> 
int main(void) { 
     int *ptr1 = NULL; 
     ptr1 = malloc(100); 
     free(ptr1); 
     free(ptr1); 
     printf("%d\n", *ptr1); 
     return 0; 
} 
+10

Wo heißt es, dass ein Programm * abstürzen * muss? –

+2

Eine bessere Frage ist warum dies jemals * kompiliert werden würde. – EOF

+2

Nicht definiertes Verhalten ist nicht definiert. – melpomene

Antwort

0

Nach der Definition von free erreicht eine doppeltes free undefiniertes Verhalten:

7.20.3.2 Die freie Funktion

Die freie Funktion bewirkt, dass der Raum auf den ptr zeigte ausgeplant werden das heißt, zur weiteren Zuordnung zur Verfügung gestellt. Wenn ptr ein Nullzeiger ist, tritt keine Aktion auf. Wenn das Argument nicht mit einem Zeiger übereinstimmt, der früher vom Calloc zurückgegeben wurde, malloc oder realloc function, oder wenn das Leerzeichen durch einen Aufruf zum Freigeben oder Realloc freigegeben wurde, ist das Verhalten nicht definiert.

und undefiniertes Verhalten selbst wird in dem gleichen Standard wie folgt definiert:

3.4.3 (1) undefiniertes Verhalten

Verhalten bei der Verwendung eines nonportable oder fehlerhaften Programmkonstrukts oder von fehlerhaften Daten, für die diese Internationale Norm keine Anforderungen vorschreibt ANMERKUNG Mögliches undefiniertes Verhalten reicht von der Ignorierung der Situation vollständig mit unvorhersehbaren Ergebnissen bis zum Verhalten während translat Ion oder die Programmausführung in einer dokumentierten charakteristische Weise der Umgebung (mit oder ohne die Ausgabe einer Diagnose message), um eine Übersetzung oder die Ausführung beendet wird (mit der Ausgabe einer diagnostischen Nachricht)

So ein Programm mit undefiniertem Verhalten kann "abstürzen", aber auch nicht. Es ist undefined ...

+0

Das Dokument verlinkt ist nicht der C-Standard und war nie.Wenn Sie angeben, verwenden Sie bitte die gültige Version! – Olaf

Verwandte Themen