Was bedeutet “doppelt kostenlos”?

Lesezeit: 5 Minuten

Benutzeravatar von Chris Edwards
Chris Edwards

Wie der Titel schon sagt, bin ich neu in C und habe in Kürze eine Zwischenprüfung. Ich überarbeite derzeit vergangene Artikel und ein wiederkehrendes Thema ist das Doppelfrei-Problem. Ich verstehe, dass es der Prozess des Anrufens ist free() zweimal am selben Speicherplatz, aber ich habe ein paar Fragen, bei denen ich nicht 100% sicher bin, wie ich sie beantworten soll:

Frage 1: Was ist das Ergebnis eines Double Free in C und warum ist es so ein Problem?

Dies führt zu einem doppelten Freigang:

char* ptr = malloc(sizeof(char));

*ptr="a";
free(ptr);
free(ptr);

Meine Antwort darauf wäre, dass es eine 0x0-Speicheradresse zurückgeben und eine Systeminstabilität / einen Systemabsturz verursachen würde. Auch wenn ich mich recht erinnere, kann ein Double Free eigentlich callen malloc zweimal, was zu einem Pufferüberlauf führt und das System angreifbar macht.

Wie könnte man diese Frage am besten kurz zusammenfassen?

Frage 2: Beschreiben Sie eine Situation, in der es besonders einfach ist, ein doppeltes Freizeichen in C einzuführen?

Ich dachte, wenn Sie Zeiger herumreichen, könnten Sie sie versehentlich in einer Funktion freigeben und sie auch wieder freigeben, ohne es zu merken?

Nochmal, was ist der “beste” Weg, dies zusammenzufassen?

  • "...would it return a 0x0 memory address..." – Um was geht es hierbei? Möchten was eine 0x0-Speicheradresse zurückgeben? Funktion free gibt nichts zurück.

    – AnT steht zu Russland

    11. Januar 2014 um 1:51 Uhr

  • Double-Free-Bugs können mitunter extrem schwerwiegende Sicherheitslücken sein – hier ein Beispiel: wakened1712.github.io/hacking/hacking-whatsapp-gif-rce

    – Sachin Josef

    3. Oktober 2019 um 0:08 Uhr

Ein Double Free in C führt technisch gesehen zu undefiniertes Verhalten. Das bedeutet, dass sich das Programm völlig willkürlich verhalten kann und alle Wetten darauf geschlossen sind, was passiert. Das ist sicherlich eine schlimme Sache! In der Praxis wird das doppelte Freigeben eines Speicherblocks den Zustand des Speichermanagers beschädigen, was dazu führen kann, dass vorhandene Speicherblöcke beschädigt werden oder dass zukünftige Zuweisungen auf bizarre Weise fehlschlagen (z. B. wenn derselbe Speicher an zwei verteilt wird verschiedene aufeinanderfolgende Aufrufe von malloc).

Double Frees können in allen möglichen Fällen vorkommen. Ein ziemlich häufiger Fall ist, wenn mehrere verschiedene Objekte alle Zeiger aufeinander haben und beginnen, durch Aufrufe von to aufgeräumt zu werden free. Wenn dies passiert, könnten Sie es tun, wenn Sie nicht aufpassen free denselben Mauszeiger mehrmals, wenn Sie die Objekte bereinigen. Es gibt aber auch viele andere Fälle.

Hoffe das hilft!

  • Ich finde eine Reihe von undefinierten Verhaltensweisen in C, also habe ich etwas in dieser Richtung erwartet. Ich wollte die Möglichkeit vorschlagen, dass eine einfach/doppelt verknüpfte Liste aus diesem Grund sehr anfällig für die Doppelfreiheit ist, danke für Ihre Antwort.

    – Chris Edwards

    11. Januar 2014 um 1:57 Uhr

  • Was macht free() unter der Haube? Mir scheint, dass der Speichermanager sagen sollte, dass der Zeiger nicht existiert, wenn Sie versuchen, ihn erneut freizugeben, und die CPU einen Interrupt verursacht. Und das Gleiche gilt für die Verwendung nach kostenlosen Sicherheitslücken, aber das passiert nicht.

    – Deoxal

    19. September um 17:53 Uhr


  • @Deoxal Die meisten Speichermanager arbeiten, indem sie regelmäßig einen großen Speicherblock vom Betriebssystem abrufen und ihn so unterteilen, dass kleine Teile des großen Blocks ausgegeben werden können, wenn malloc wird genannt. Infolgedessen geben Speichermanager im Allgemeinen keinen Speicher an das Betriebssystem zurück, wenn free wird aufgerufen, da auf derselben Seite, aus der der freigegebene Block stammt, möglicherweise anderer zugewiesener Speicher vorhanden ist.

    – Vorlagentypdef

    Vor 2 Tagen

  • Ich verstehe, das macht Sinn, aber gibt der Speichermanager die Daten eines Zeigers zurück, wenn ich unmittelbar nach der Freigabe danach frage?

    – Deoxal

    gestern

  • @Deoxal Es hängt von der Implementierung des Speichermanagers ab. Einige MMs überschreiben freigegebene Blöcke mit anderen Daten, die für die interne Buchhaltung benötigt werden. Andere werden die Dinge aus Sicherheitsgründen räumen. Andere tun beides nicht.

    – Vorlagentypdef

    gestern

Benutzeravatar von zero_yu
null_yu

Weil free() benachbarte Regionen konsolidiert, indem es die Informationen verwaltet, die in den Tags vor jeder Region gespeichert sind. Es ist so etwas wie das Verwalten der doppelt verknüpften Liste. Es wäre also gefährlich, wenn der Puffer wo wäre ptr zeigt, wurde durch einen Angriffsstring überschrieben, in den gefälschte Tags eingefügt werden können.

Diese Frage wurde gut beantwortet, aber ich füge eine späte Antwort aufgrund eines Links “Doppelte Frage” hinzu, der fragte: “Wie kann man das vermeiden?”

Dem geposteten Beispielcode wird eine Zeile hinzugefügt.

char* ptr = malloc(sizeof(char));

*ptr="a";
free(ptr);
ptr = NULL;         // add this
free(ptr);

Funktion free macht nichts mit a NULL Zeiger.

  • Dies ist nur in dem trivialen Fall nützlich, in dem es nur einen Zeiger auf ein Stück Speicher gibt. In der häufigeren Situation, in der es mehrere Zeiger auf denselben Speicher gibt, ist es viel komplizierter.

    – Schlitten

    24. Januar 2019 um 18:28 Uhr

Benutzeravatar von ankurgupta7
ankurgupta7

Gemäß veröffentlichtem C11-Standard, Anrufen free schon an free Speicherort führt zu undefiniertem Verhalten. Es kann zu bizarren Situationen führen, z. B. dass Speicher nicht zugewiesen wird, selbst wenn er verfügbar ist, Heap beschädigt wird, derselbe Speicherort verschiedenen Mallocs zugewiesen wird usw. Grundsätzlich ist er undefiniert und kann alles sein.

ANSI C11 std finden Sie hier. https://www.iso.org/obp/ui/#iso:std:iso-iec:9899:ed-3:v1:en

EDIT: NULL in bereits geändert freed, basierend auf Kommentaren. außerdem verweist der Link jetzt auf ISO/IEC 9899:2011(en)

1409490cookie-checkWas bedeutet “doppelt kostenlos”?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy