Sehen Sie, wie die Continuous Quality-Lösung von Parasoft dabei hilft, Testumgebungen zu kontrollieren und zu verwalten, um zuverlässig qualitativ hochwertige Software zu liefern. Für Demo registrieren >>

BLOG

Statische Code-Analyse zum Portieren von Code auf 64-Bit-Plattformen

Statische Code-Analyse zum Portieren von Code auf 64-Bit-Plattformen Lesezeit: 3 Minuten

In meinem previous postIch habe einen Prozess eingeführt, den Sie anwenden können, um die Anwendung für den 64-Bit-Portierungsprozess vorzubereiten:

Führen Sie Mutationstests über die Erkennung von Laufzeitspeicherfehlern durch
Verwenden Sie die statische Analyse, um fehleranfälligen und nicht portierbaren Code zu identifizieren
Wiederholen Sie die Erkennung von Laufzeitspeicherfehlern
Unit-Test durchführen (optional)

In diesem Beitrag werden wir uns einige spezifische genauer ansehen Statische Codeüberprüfung Regeln, die Sie möglicherweise in Schritt 2 überprüfen möchten.

Regeln, die fehleranfälligen Code verfügbar machen

  • Geben Sie niemals einen Verweis auf ein lokales Objekt oder einen dereferenzierten Zeiger zurück, der durch "new" innerhalb der Funktion initialisiert wurde. Das Zurückgeben eines Verweises auf ein lokales Objekt kann zu einer Stapelbeschädigung führen. Das Zurückgeben eines dereferenzierten Zeigers, der durch "new" innerhalb der Funktion initialisiert wurde, kann zu einem Speicherverlust führen.
  • Konvertieren Sie niemals eine Konstante in eine Nicht-Konstante. Dies kann die Datenintegrität untergraben, indem sich Werte ändern, die als konstant angenommen werden. Diese Vorgehensweise verringert auch die Lesbarkeit des Codes, da Sie nicht davon ausgehen können, dass const-Variablen konstant sind.
  • Wenn eine Klasse virtuelle Funktionen hat, muss sie einen virtuellen Destruktor haben. Dieser Standard verhindert Speicherlecks in abgeleiteten Klassen. Eine Klasse mit virtuellen Funktionen soll als Basisklasse verwendet werden. Daher sollte sie über einen virtuellen Destruktor verfügen, um sicherzustellen, dass der Destruktor aufgerufen wird, wenn auf das abgeleitete Objekt über einen Zeiger auf die Basisklasse verwiesen wird.
  • Öffentliche Mitgliedsfunktionen geben const-Handles an Mitgliedsdaten zurück.
  • Wenn Sie Mitgliedsdaten nicht konstante Handles bereitstellen, untergraben Sie die Kapselung, indem Sie Anrufern erlauben, Mitgliedsdaten außerhalb der Mitgliedsfunktionen zu ändern.
  • Ein Zeiger auf eine Klasse darf nicht in einen Zeiger einer zweiten Klasse konvertiert werden, es sei denn, er erbt von der zweiten. Dieses "ungültige" Downcasting kann zu Platzhaltern, Datenbeschädigungsproblemen und anderen Fehlern führen.
  • Greifen Sie nicht direkt von einem Konstruktor auf globale Daten zu.

Die Reihenfolge der Initialisierung von statischen Objekten, die in verschiedenen Kompilierungseinheiten definiert sind, ist in der C ++ - Sprachdefinition nicht definiert. Daher kann der Zugriff auf globale Daten von einem Konstruktor aus zum Lesen von nicht initialisierten Objekten führen.

Weitere Regeln finden Sie in den Werken von Scott Meyers, Martin Klaus und Herb Sutter.

Regeln, die schwer zu portierenden Code verfügbar machen

Nachdem Sie diesen fehleranfälligen Code gefunden und repariert haben, suchen Sie nach Code, der auf Ihrer aktuellen Plattform / Architektur einwandfrei funktioniert, aber möglicherweise nicht gut portiert werden kann. Einige Regeln, die für die meisten 64-Bit-Portierungsprojekte gelten, umfassen:

  • Verwenden Sie gegebenenfalls Standardtypen. Verwenden Sie beispielsweise size_t anstelle von "int". Verwenden Sie uint64_t, wenn Sie eine 64-Bit-Ganzzahl ohne Vorzeichen möchten. Diese Vorgehensweise hilft nicht nur dabei, aktuelle Fehler im Code zu identifizieren und zu verhindern, sondern hilft auch bei der zukünftigen Portierung, wenn der Code auf 128-Bit-Prozessoren portiert wird.
  • Überprüfen Sie alle vorhandenen Verwendungen langer Datentypen im Quellcode. Wenn die Werte, die in solchen Variablen, Feldern und Parametern enthalten sein sollen, in den Bereich von 2Gig-1 bis –2Gig oder 4Gig bis 0 passen, ist es wahrscheinlich am besten, int32_t bzw. uint32_t zu verwenden.
  • Untersuchen Sie alle Fälle der Verengung der Zuordnung. Vermeiden Sie solche Zuweisungen, da die Zuweisung eines langen Werts zu einem int zum Abschneiden des 64-Bit-Werts führt.
  • Finden Sie verengte Abgüsse. Verwenden Sie schmalere Umwandlungen für Ausdrücke, nicht für Operanden.
  • Finde Casts von long * bis int *. In einer 32-Bit-Umgebung wurden diese möglicherweise synonym verwendet. Untersuchen Sie alle Instanzen inkompatibler Zeigerzuweisungen.
  • Finde Casts von int * bis long *. In einer 32-Bit-Umgebung wurden diese möglicherweise synonym verwendet. Untersuchen Sie alle Instanzen inkompatibler Zeigerzuweisungen.
  • Suchen Sie lange Werte, die mit int-Literalen initialisiert werden. Vermeiden Sie solche Initialisierungen, da Integralkonstanten möglicherweise als 32-Bit-Typen dargestellt werden, selbst wenn sie in Ausdrücken mit 64-Bit-Typen verwendet werden.
  • Suchen Sie int-Literale in binären Operationen, für die das Ergebnis einem langen Wert zugewiesen ist. Eine 64-Bit-Multiplikation ist erwünscht, wenn das Ergebnis ein 64-Bit-Wert ist.
  • Suchen Sie nach int-Konstanten, die in 64-Bit-Ausdrücken verwendet werden. Verwenden Sie 64-Bit-Werte in 64-Bit-Ausdrücken.
  • Suchen Sie nach Verwendungen multiplikativer Ausdrücke, die in keinem der Operanden einen 64-Bit-Typ enthalten. Damit integrale Ausdrücke 64-Bit-Ergebnisse erzeugen, muss mindestens einer der Operanden einen 64-Bit-Datentyp mit oder ohne Vorzeichen haben.
  • Verwenden Sie geeignete Suffixe für ganzzahlige und schwebende Literalkonstanten, wenn Ihr Compiler dies zulässt. Zum Beispiel:


        unsigned int j = 123u;

vorzeichenloses langes k = 456UL;

etc

***

Bildnachweis: Quapan

Geschrieben 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.