Hängender Zeiger - LinkFang.de





Hängender Zeiger


Ein hängender Zeiger (engl. dangling pointer) bezeichnet in der Informatik einen Zeiger, der einen ungültigen Wert enthält und dadurch auf einen nicht vorhandenen oder nicht dem Zeiger zugeordneten dynamischen Speicherbereich (auch Heap genannt) verweist.[1]

Hängende Zeiger kommen oft dadurch zustande, dass sie nicht initialisiert wurden (in dem Fall alternativ wilde Zeiger genannt) – aber auch dadurch, dass sie auf einen Speicherbereich verweisen, der bereits freigegeben wurde.[2]

Hängende Zeiger können für den Programmlauf unvorhersehbare Auswirkungen haben und das Programm zum Absturz bringen.[3][4]

Während Userspace-Programme in der Regel bei einer Dereferenzierung eines Zeigers, der auf einen ungültigen Speicherbereich zeigt, beendet werden, kann ein solcher im Kernel bzw. dessen Modulen schlimmstenfalls das gesamte System beschädigen, ohne dass der Benutzer etwas bemerkt, bevor es zu spät ist, da keine Kontrollinstanz vorhanden ist, die z. B. das Überschreiben von fremdem Code verhindern könnte. Daher ist bei der Kernel- und Treiber-Entwicklung besonders auf die korrekte Verwendung zu achten.

Die Unvorhersehbarkeit rührt daher, dass ein Zugriff auf einen bereits freigegebenen Speicherbereich nicht zwangsläufig sofort einen Laufzeitfehler (Schutzverletzung) auslöst, da zwischen der Speicherfreigabe durch den Programmierer und der tatsächlichen Freigabe durch das Laufzeitsystem noch eine gewisse Zeit vergehen kann. Findet in dieser (unvorhersagbaren) Zwischenzeit noch ein Zugriff auf den freigegebenen Speicher statt (Zeilen (*) im Beispiel), so löst er keinen Fehler aus. Da dies aber nicht reproduzierbar ist, sind diese sporadischen Fehler besonders schwer zu entdecken.

Beispiel

C++

#include <iostream>
 
using namespace std;
 
int main()
{
    int * pPointer = new int; // Pointer vom Typ integer angelegt und Speicher im Heap wird reserviert
    *pPointer = 10;           // 10 in den Heap schreiben, an die Speicheradresse, wohin der Pointer zeigt
    cout << pPointer;         // Das würde die Speicheradresse im Heap anzeigen
    cout << *pPointer;        // Das würde auf die Speicheradresse im Heap zugreifen und dort 10 lesen und dann anzeigen
    delete pPointer;          // Speicher auf dem Heap freigeben
    cout << pPointer;         // Zeigt immer noch die Speicheradresse im Heap an, obwohl er nun freigeben wurde
                              // => Dangling Pointer
    cout << *pPointer;        // (*) Lesender Zugriff über Pointer auf freigegebenen Speicherbereich
                              // => das würde (bzw. kann) einen fatalen Fehler auslösen
    *pPointer = 20;           // (*) Schreibender Zugriff über Pointer auf freigegebenen Speicherbereich
                              // => noch schlimmer: das würde (bzw. kann) andere gültige Daten überschreiben
    pPointer = 0;             // pPointer ist jetzt kein Dangling Pointer mehr, siehe Nullpointer
    return 0;
}

Es zeugt von gutem Programmierstil, nach einem delete den Pointer auf 0 zu setzen, auch wenn auf den Pointer nicht mehr zugegriffen wird.[5]

Einzelnachweise

  1. 12. Dynamische Speicherverwaltung - 12.3. Hinweise für die Verwendung von malloc, calloc und free Abgerufen am 22. August 2014.
  2. Zeiger. In: C++ in 21 Tagen. ISBN 978-3-8272-5624-9. (Vagabundierende Zeiger) Abgerufen am 22. August 2014.
  3. Garbage-Collection in C++ - 2.1 Probleme bei der herkömmlichen Speicherverwaltung - Hängende Zeiger Abgerufen am 22. August 2014.
  4. Security Insider - Webserver durch ungültige Zeiger zum Absturz gebracht Abgerufen am 23. August 2014.
  5. Zeiger. In: C++ in 21 Tagen. ISBN 978-3-8272-5624-9. (Listing 8.9: Einen vagabundierenden Zeiger erzeugen) Abgerufen am 22. August 2014.

Weblinks

Siehe auch


Kategorien: Keine Kategorien vorhanden!

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Hängender Zeiger (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.