Seien Sie am 30. April dabei: Vorstellung von Parasoft C/C++test CT für kontinuierliche Tests und Compliance-Exzellenz | Registrierung

Suchen eines Speicherverlusts in C oder C ++

Kopfschuss von Arthur Hicken, Evangelist bei Parasoft
2. August 2023
3 min lesen

Aufgrund der Fülle an Daten kann es schwierig sein, Speicherlecks in der Softwareentwicklung zu identifizieren. In diesem Beitrag erfahren Sie, wie Sie mit einem Programm zur Laufzeitfehlererkennung Speicherlecks in C und C++ finden.

Speicherlecks in Programmiersoftware können aufgrund der großen Datenmenge schwer zu lokalisieren sein. In diesem Artikel erfahren Sie, wie Sie mithilfe eines Tools zur Laufzeitfehlererkennung 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.

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 zeigt bisher auf die Zeichenfolge „hello“, die 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.

LeckartBeschreibung
LECK_FREITritt auf, wenn Sie einen Speicherblock freigeben, der Zeiger auf andere Speicherblöcke enthält.
LEAK_RETURNTritt auf, wenn eine Funktion einen Zeiger auf einen zugewiesenen Speicherblock zurückgibt, der zurückgegebene Wert jedoch in der aufrufenden Routine ignoriert wird.
LEAK_SCOPETritt 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 von Speicherlecks suchen,  Erfahren Sie hier mehr über Parasoft Insure++.

Erkennung und Visualisierung von Laufzeit- und Speicherfehlern mit Parasoft Insure ++