Holen Sie sich die UMFANGREICHSTE Abdeckung für die Einhaltung von MISRA C! Erfahren Sie mehr >>

Suchen eines Speicherverlusts in C oder C ++

Von Arthur Hicken

28. Juni 2018

3  min lesen

Im Gegensatz zum obigen Bild können Speicherlecks in der Programmiersoftware schwer zu lokalisieren sein, da es eine Fülle von Daten gibt. In diesem Artikel erfahren Sie, wie Sie mithilfe eines Tools zur Erkennung von Laufzeitfehlern Speicherlecks in C- und C ++ - Anwendungen finden.

Was ist ein Speicherverlust? C ++ und C Beispiele

Wenn Sie mit einem Speicherverlust konfrontiert sind, verfügen C ++ und C über eine Reihe von Tools zur Laufzeiterkennung, die möglicherweise die Leistung verbessern können. Diejenigen, die Code in C oder C ++ schreiben, sind mit Speicherlecks vertraut. Wikipedia bietet die folgende Definition:

In der Informatik ist ein Speicherverlust eine Art Ressourcenverlust, der auftritt, wenn ein Computerprogramm Speicherzuordnungen falsch so verwaltet, dass nicht mehr benötigter Speicher nicht freigegeben wird. Ein Speicherverlust kann auch auftreten, wenn ein Objekt im Speicher gespeichert ist, auf den der laufende Code jedoch nicht zugreifen kann.

Mit anderen Worten, Lecks bedeuten, dass dynamisch zugewiesener Speicher nicht an das Betriebssystem zurückgegeben werden kann, da das Programm keine Zeiger mehr enthält, die darauf zugreifen können. Sie haben die Kontrolle über dieses Speicherelement unabhängig von der Größe verloren und können nicht mehr darauf zugreifen oder es freigeben.

Holen Sie sich den ultimativen Speicher-Debugger für C und C ++.
Versuchen Sie Parasoft Insure ++

Eines der besten Beispiele für dieses Verhalten ist das Ausführen des unten gezeigten Programms „Hallo Welt“.

   
/ * * Datei: hello.c * / #include #einschließen int main (int argc, char * argv []) {char * string, * string_so_far; int i, Länge; Länge = 0; für (i = 0; i

Wenn wir dieses Programm mit den folgenden Argumenten ausführen:

Hallo, das ist ein Test

Wenn wir den Status des Programms in Zeile 25 untersuchen, bevor wir den Aufruf von malloc zum zweiten Mal ausführen, stellen wir Folgendes fest:

  • Die Variable string_so_far zeigt auf die Zeichenfolge "Hallo", die ihr als Ergebnis der vorherigen Schleifeniteration zugewiesen wurde.
  • Die variable Zeichenfolge zeigt auf die erweiterte Zeichenfolge "Hallo dies", die bei dieser Schleifeniteration zugewiesen wurde.

Diese Zuordnungen sind nachstehend schematisch dargestellt. Beide Variablen zeigen auf Blöcke mit dynamisch zugewiesenem Speicher.

Die nächste Aussage:

string_bisher = string;

erstellt beide Variablen, die auf den längeren Speicherblock zeigen, wie unten gezeigt:

In diesem Fall gibt es jedoch keinen verbleibenden Zeiger mehr, der auf den kürzeren Block zeigt. Selbst wenn Sie wollten, gibt es keine Möglichkeit, den Speicher, auf den zuvor von string_so_far verwiesen wurde, zurückzugewinnen. es ist jetzt dauerhaft zugeordnet. Dies wird als "Speicherverlust" bezeichnet. C ++ und C sind häufig mit diesen häufigen Problemen konfrontiert, daher ist es wichtig, sie frühzeitig zu erkennen.

Wie finden Sie einen Speicherverlust in C ++ und C?

Während es keine Schaltfläche zum Erkennen von Speicherverlusten gibt, verfügen C ++ & c über Tools zur Laufzeiterkennung, die helfen können. Diese Art von Fehler kann mit Tools zur Erkennung von Speicherfehlern wie Parasoft Insure ++ diagnostiziert werden. Dies ist unten gezeigt:

[hello.c: 25] ** LEAK_ASSIGN ** >> string_so_far = string; Speicherverlust aufgrund einer Neuzuweisung des Zeigers: Zeichenfolge Verlorener Block: 0x0804bd68 bis 0x0804bd6f (8 Byte) Zeichenfolge, zugewiesen bei hello.c, 15 malloc () (Schnittstelle) main () hello.c, 15 Stapelverfolgung, bei der der Fehler aufgetreten ist: main ( ) hallo.c, 25

Dieses Beispiel heißt LEAK_ASSIGN, da es verursacht wird, wenn ein Zeiger neu zugewiesen wird. (PS Andere Speicher-Debugger unterscheiden häufig nicht zwischen ausstehendem Speicher und tatsächlich durchgesickertem Speicher, Insure ++ jedoch.) In diesem Fall ist ausstehender Speicher kein fantastischer Speicher, sondern Speicher, den Sie nicht freigegeben haben, im Gegensatz zu Ein tatsächliches Leck, bei dem es sich um Speicher handelt, den Sie nicht freigeben können.

Arten von Speicherlecks

Parasoft Insure ++ kann auch mehrere andere Arten von Lecks automatisch erkennen:

Leckart Infos
LECK_FREI Tritt auf, wenn Sie einen Speicherblock freigeben, der Zeiger auf andere Speicherblöcke enthält.
LEAK_RETURN Tritt auf, wenn eine Funktion einen Zeiger auf einen zugewiesenen Speicherblock zurückgibt, der zurückgegebene Wert jedoch in der aufrufenden Routine ignoriert wird.
LEAK_SCOPE Tritt auf, wenn eine Funktion eine lokale Variable enthält, die auf einen Speicherblock verweist, die Funktion jedoch zurückkehrt, ohne den Zeiger in einer globalen Variablen zu speichern oder an ihren Aufrufer zurückzugeben.

Beachten Sie, dass die Fehlermeldung die genaue Quellzeile angibt, in der das Problem auftritt, und nicht nur, wo der Block zugewiesen wurde. Dies ist ein Schlüsselproblem beim Auffinden und Beheben von Speicherlecks. Dies ist äußerst wichtig, da es leicht ist, subtile Speicherlecks in Ihre Anwendungen einzuführen, diese jedoch nur sehr schwer zu finden sind.

Wenn Sie nach einem C ++ - Tool zum Überprüfen des Speicherverlusts suchen, können Sie Parasoft Insure ++ kostenlos testen.

Von Arthur Hicken

Arthur ist seit über 25 Jahren bei Parasoft im Bereich Software-Sicherheit und Testautomatisierung tätig. Er hilft bei der Erforschung neuer Methoden und Techniken (einschließlich 5 Patente) und hilft Kunden dabei, ihre Software-Praktiken zu verbessern.

Erhalten Sie die neuesten Nachrichten und Ressourcen zum Testen von Software sofort.