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

Suchen dynamischer Speicherfehler mit Tools zur Erkennung von Speicherfehlern

Von Parasoft

12. Juli 2012

3  min lesen

Die dynamisch zugeordneter Speicher Richtig ist ein heikles Thema. In vielen Fällen laufen Programme weiterhin gut, nachdem ein Programmierfehler schwerwiegende Ursachen hat Speicherbeschädigung;; manchmal stürzen sie überhaupt nicht ab. In diesem Beitrag untersuchen wir, wie dynamische Analysen Speicherbeschädigungsprobleme erkennen können, die in C-Code häufig auftreten.

Ein häufiger Fehler besteht darin, einen Zeiger wiederzuverwenden, nachdem er bereits freigegeben wurde. Betrachten Sie die Zeilen 22-26 im folgenden Programm, in dem die Zuweisung von Speicherblöcken aufgehoben wird, bevor die größeren zugewiesen werden:

 

1: / *
2: * Datei: hello4.c
3: */
4: #include
5: #include
6:
7: main (argc, argv)
8: int argc;
9: char * argv [];
10: {
11: char * string, * string_so_far;
12: int i, Länge;
13:  
14: Länge = 0;
15:  
16: für (i = 0; i
17: Länge + = strlen (argv [i]) + 1;
18: string = malloc (Länge + 1);
19: / *
20: * Kopieren Sie die bisher erstellte Zeichenfolge.
21: * /
22: if (string_so_far! = (Char *) 0) {
23: frei (string_so_far);
24: strcpy (string, string_so_far);
25:}
26: else * string = '\ 0';
27:
28: strcat (string, argv [i]);
29: if (i <argc-1) strcat (string, ”“);
30: string_so_far = string;
31:}
32: printf ("Sie haben eingegeben:% s \ n", string_so_far);
33: return (0);
34:}

Baumelnde Zeiger

Wenn Sie diesen Code durchlaufen Speicherfehlererkennung Werkzeug wie  Parasoft Insure ++In Zeile 24 wird eine Fehlermeldung über einen „baumelnden Zeiger“ angezeigt. In diesem Fall wird der Block, auf den string_so_far zeigt, in Zeile 23 freigegeben und dann in der nächsten Zeile verwendet.

Wikipedia definiert a baumelnder Zeiger als „Zeiger, die nicht auf ein gültiges Objekt des entsprechenden Typs verweisen. Dies sind Sonderfälle von Verstößen gegen die Speichersicherheit. Im Allgemeinen sind baumelnde Referenzen und wilde Referenzen Referenzen, die nicht in ein gültiges Ziel aufgelöst werden. “ Hierbei handelt es sich um eine Fehlerklasse, die sich auf das explizite Löschen eines Objekts aus dem Speicher oder das Zerstören des Stapelrahmens bei der Rückgabe bezieht und die zugehörigen Zeiger nicht ändert. Der Zeiger zeigt immer noch auf dieselbe Stelle im Speicher, obwohl er jetzt für andere Zwecke verwendet werden kann. “ Dies ist ein häufiges Problem, das häufig unbemerkt bleibt, da Programme mit diesen Fehlern häufig ohne Warnungen kompiliert werden und manchmal korrekt ausgeführt werden können.

Im obigen Beispiel wird die Speicherpufferreferenz durch den Zeiger string_so_far explizit freigegeben und anschließend dereferenziert. Die dynamische Analyse erkennt diese Fehler, die beim Testen und sogar während des normalen Betriebs der Anwendung unbemerkt bleiben können, bis auf den falschen Speicher falsch zugegriffen wird.

Welche anderen dynamischen Speicherprobleme können Tools zur Erkennung von Speicherfehlern finden?

Zusätzlich zu dieser Art von baumelndem Zeiger dynamisches Speicherproblem, Speicherfehlererkennung Werkzeug wie Parasoft Insure ++ Erkennen Sie auch die folgenden Fehler:

  • Lesen von oder Schreiben zu "baumelnden Zeigern".
  • Übergeben von "baumelnden Zeigern" als Argumente an Funktionen oder Zurückgeben von Funktionen.
  • Den gleichen Speicherblock mehrmals freigeben.
  • Versuch, statisch zugewiesenen Speicher freizugeben.
  • Freigeben des Stapelspeichers (lokale Variablen).
  • Übergeben eines Zeigers an free, der nicht auf den Anfang eines Speicherblocks zeigt.
  • Aufrufe zum Freigeben mit NULL oder nicht initialisierten Zeigern.
  • Übergeben von unsinnigen Argumenten oder Argumenten des falschen Datentyps an malloc, calloc, realloc oder free.

Analyse zur Kompilierungszeit

Insure ++ erkennt Fehler sowohl zur Kompilierungszeit als auch zur Laufzeit. Zu den erkannten Fehlern bei der Kompilierung gehören:

  • Der Zeigerwurf verliert an Präzision
  • Nicht übereinstimmende Formatspezifikation
  • Nicht übereinstimmender Argumenttyp
  • Code wird nicht ausgewertet, hat keine Auswirkung oder ist nicht erreichbar
  • Undefinierte Bezeichnung
  • Variable deklariert, aber nie verwendet
  • Zeiger auf lokale Variable zurückgeben
  • Die Funktion gibt einen inkonsistenten Wert zurück
  • Nicht verwendete Variablen

Laufzeitberichterstattung

Der Benutzer führt dieses Programm dann im Rahmen von Anwendungsfalltests aus, genau wie Sie das ursprüngliche Programm verwenden würden, und Insure ++ meldet alle gefundenen Probleme. Insure ++ - Berichte enthalten detaillierte Informationen, darunter: über die Art des Fehlers, die Quelldatei und die Zeilennummer, den tatsächlichen Inhalt der Quellcodezeile, den Ausdruck, der das Problem verursacht hat, sowie Berichte, darunter:

  • Die Art des Fehlers (z. B. EXPR_UNRELATED_PTRCMP)
  • Die Quelldatei und die Zeilennummer (z. B. foo.cc:42)
  • Der tatsächliche Inhalt der Quellcodezeile (z. B. "while (p <g) {")
  • Der Ausdruck, der das Problem verursacht hat (z. B. "p <g")
  • Informationen zu allen am Fehler beteiligten Zeigern und Speicherblöcken:
    • Die Zeigerwerte
    • Die Speicherblöcke zeigten auf (falls vorhanden) und einen beliebigen Versatz
    • Die Blockzuordnungsinformationen:
      • Stapelverfolgung bei dynamischer Zuordnung.
      • Blockdeklarationsspeicherort (Quelldatei und Zeilennummer), falls auf dem Stapel oder global zugewiesen.
      • Gegebenenfalls Stapelverfolgung der Freigabe des Blocks.
    • Die Stapelverfolgung zeigt, wie das Programm zum Fehlerort gelangt ist.

Bildquelle: Xithorian

Von Parasoft

Die branchenführenden automatisierten Softwaretest-Tools von Parasoft unterstützen den gesamten Softwareentwicklungsprozess, vom Schreiben der ersten Codezeile über Unit- und Funktionstests bis hin zu Leistungs- und Sicherheitstests, wobei simulierte Testumgebungen genutzt werden.

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