<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Mehrfache_Deallokation</id>
	<title>Mehrfache Deallokation - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Mehrfache_Deallokation"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Mehrfache_Deallokation&amp;action=history"/>
	<updated>2026-06-09T18:27:35Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Mehrfache_Deallokation&amp;diff=414577&amp;oldid=prev</id>
		<title>imported&gt;Siegbert v2: Einzelnachweise hinzugefügt / https bei Weblinks / Kleinigkeiten</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Mehrfache_Deallokation&amp;diff=414577&amp;oldid=prev"/>
		<updated>2023-09-17T16:20:11Z</updated>

		<summary type="html">&lt;p&gt;Einzelnachweise hinzugefügt / https bei Weblinks / Kleinigkeiten&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Double free()&amp;#039;&amp;#039;&amp;#039; (doppelter Aufruf der [[Funktion (Programmierung)|Funktion]] &amp;#039;&amp;#039;free&amp;#039;&amp;#039;) bezeichnet einen Fehler in [[Computerprogramm]]en, wenn diese versuchen den gleichen Speicherbereich mehrmals freizugeben. Double free ist eine potentielle [[Sicherheitslücke (Software)|Sicherheitslücke]].&amp;lt;ref name=&amp;quot;owasp&amp;quot;&amp;gt;{{Internetquelle |url=https://owasp.org/www-community/vulnerabilities/Doubly_freeing_memory |titel=Doubly freeing memory |werk=owasp.org |hrsg=[[Open Web Application Security Project]] |sprache=en |abruf=2023-09-17}}&amp;lt;/ref&amp;gt; Der Name leitet sich von der Funktion zur Speicherfreigabe ab, die in vielen Programmiersprachen wie z.&amp;amp;nbsp;B. [[C (Programmiersprache)|C]] &amp;#039;&amp;#039;free&amp;#039;&amp;#039; heißt.&lt;br /&gt;
&lt;br /&gt;
== Hintergründe ==&lt;br /&gt;
In einem C-Programm wird [[dynamischer Speicher]] per &amp;#039;&amp;#039;malloc&amp;#039;&amp;#039; (memory allocation) angefordert; nach der Verwendung muss er per &amp;#039;&amp;#039;free&amp;#039;&amp;#039; wieder freigegeben werden. Wenn allerdings versucht wird, einen Speicherbereich mehrfach mittels &amp;#039;&amp;#039;free&amp;#039;&amp;#039; freizugeben, kommt es bei den meisten &amp;#039;&amp;#039;free&amp;#039;&amp;#039;-Implementierungen zu nicht definiertem Verhalten. Es ist möglich, das Programm auf diesem Weg abstürzen zu lassen oder sogar an bestimmten Stellen in den Programm-Speicher zu schreiben, was zur Ausführung von beliebigem Code und Manipulation von Werten in Registern genutzt werden kann.&amp;lt;ref name=&amp;quot;owasp&amp;quot;/&amp;gt; Meist werden solche Situationen erreicht, wenn innerhalb von [[Signal (Computer)|Signalhandlern]] oder anderem Code, der unter bestimmten Bedingungen mehrfach benutzt werden kann, Speicher-Freigaben erfolgen.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen enthält der Artikel zu [[Speicherleck]]s, bei denen die gleichen Mechanismen zu Programmierfehlern führen.&lt;br /&gt;
&lt;br /&gt;
== Abhilfen ==&lt;br /&gt;
{{Belege fehlen|1=|2=Der nachfolgende Satz}}&lt;br /&gt;
Da mehrfache Speicherfreigabe ein Fehler des Programmierers ist, lässt sich das Problem durch aufmerksames Programmieren und alle Vorgehensweisen zum Aufspüren von [[Programmfehler|Bugs]] finden.&lt;br /&gt;
&lt;br /&gt;
Einige Programmierer setzen [[Zeiger (Informatik)|Zeiger]] nach der Speicherfreigabe auf [[Nullwert|null]] und prüfen an anderen Stellen, ob der Pointer der Nullzeiger ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void *ptr;    /* zeigt irgendwann auf Speicher von malloc() */&lt;br /&gt;
&lt;br /&gt;
if (ptr) {&lt;br /&gt;
    free(ptr);&lt;br /&gt;
    ptr = NULL;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings behebt dieses Vorgehen nicht das Problem, wenn zwei Zeiger das gleiche Ziel haben. Wird bei einem der Speicher freigegeben und der Zeiger auf null gesetzt, so zeigt der zweite Zeiger immer noch auf den freigegebenen Speicher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void *ptr;    /* zeigt irgendwann auf Speicher von malloc() */&lt;br /&gt;
&lt;br /&gt;
void *ptr2 = ptr;&lt;br /&gt;
if (ptr2) {&lt;br /&gt;
    free(ptr2);   /* Speicher freigegeben, auf den ptr und ptr2 zeigen */&lt;br /&gt;
    ptr2 = NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Der Speicher wurde freigegeben, ptr ist aber nicht null! */&lt;br /&gt;
if (ptr) {&lt;br /&gt;
    free(ptr);    /* double free trotz Test */&lt;br /&gt;
    ptr = NULL;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus gibt es auch Software wie [[Valgrind]], um Speicheroperationen genauer zu untersuchen und somit bei der manuellen Suche zu unterstützen.&lt;br /&gt;
&lt;br /&gt;
[[Intelligenter Zeiger|Intelligente Zeiger]] ({{enS|smart pointers}}) verhindern, dass Speicher freigegeben wird, der noch durch andere Zeiger referenziert wird. Die Zeiger auf einen Speicherbereich werden gezählt und erst wenn der letzte Zeiger freigegeben wird, erfolgt die tatsächliche Freigabe des Speichers.&amp;lt;ref&amp;gt;{{Internetquelle |autor=Tyler Whitney et al. |url=https://learn.microsoft.com/de-de/cpp/cpp/smart-pointers-modern-cpp |titel=Intelligente Zeiger (Modern C++) |werk=learn.microsoft.com |hrsg=Microsoft |datum=2023-06-16 |sprache=de |abruf=2023-09-17}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Automatische Speicherbereinigung]] ({{enS|garbage collection}}) ist eine weitere Möglichkeit, mehrfache Speicherfreigaben zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
== Andere Programmiersprachen als C ==&lt;br /&gt;
Die Funktion &amp;#039;&amp;#039;free&amp;#039;&amp;#039; ist nur in [[C (Programmiersprache)|C]], [[C++]] (als Operator &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;) und verwandten Sprachen existent, in der Programmiersprache [[Object Pascal]] (Borland Delphi) beispielsweise ist &amp;#039;&amp;#039;GetMem()&amp;#039;&amp;#039; / &amp;#039;&amp;#039;FreeMem()&amp;#039;&amp;#039; die Entsprechung zum Funktionspaar &amp;#039;&amp;#039;malloc()&amp;#039;&amp;#039; / &amp;#039;&amp;#039;free()&amp;#039;&amp;#039;. Zum Freigeben von [[Objekt (Programmierung)|Objekten]] wird dort zur Vermeidung dieses Problems statt des [[Destruktor]]s &amp;#039;&amp;#039;Destroy&amp;#039;&amp;#039; meist die Prozedur &amp;#039;&amp;#039;Free&amp;#039;&amp;#039; genutzt.&lt;br /&gt;
&lt;br /&gt;
Programmiersprachen mit automatischer Speicherbereinigung wie [[Java (Programmiersprache)|Java]] oder [[Python (Programmiersprache)|Python]] kennen keine explizite Speicherfreigaben und haben deshalb auch keine Möglichkeit freigegebenen Speicher erneut freizugeben.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.cert.org/advisories/CA-2003-02.html Double-free] CVS Server Advisory&lt;br /&gt;
* [https://web.mit.edu/kerberos/advisories/MITKRB5-SA-2004-002-dblfree.txt Double-free] MIT Kerberos 5 Advisory&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmfehler]]&lt;br /&gt;
[[Kategorie:Sicherheitslücke]]&lt;br /&gt;
[[Kategorie:Speicherverwaltung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Siegbert v2</name></author>
	</entry>
</feed>