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

Vorbereiten der Portierung auf 64-Bit-Plattformen

Von Parasoft

30. September 2010

3  min lesen

Indem Sie C / C ++ - Speicherfehler finden und beheben, bevor Sie auf 64-Bit portieren, können Sie das Risiko von Fehlern auf der neuen Plattform und Architektur verringern, den Portierungsprozess optimieren und die ursprüngliche Anwendung robuster und zuverlässiger machen.

Hier ist ein Prozess, den Sie anwenden können, um Ihre Anwendung auf den 64-Bit-Portierungsprozess vorzubereiten:

  1. Ausführen Mutationstests über Laufzeitspeicherfehlererkennung
  2. Verwenden Sie die statische Analyse, um fehleranfälligen und nicht portierbaren Code zu identifizieren
  3. Wiederholen Sie die Erkennung von Laufzeitspeicherfehlern
  4. Unit-Tests durchführen (Optional)

Schritt 1: Führen Sie Mutationstests über die Erkennung von Laufzeitspeicherfehlern durch

Bevor Sie mit der Portierung beginnen, sollten Sie Ihren ursprünglichen Code von Problemen befreien, die Sie auf dem 64-Bit-Prozessor plagen. Zum Beispiel Speicherbeschädigung und Speicherlecks. Eine der effektivsten Möglichkeiten, um die Arten von Zeiger- und Ganzzahlproblemen aufzudecken, die auf 64-Bit-Prozessoren Probleme verursachen, besteht darin, Mutationstests für die Erkennung von Laufzeitspeicherfehlern zu nutzen.

Technologien zur Erkennung von Laufzeitspeicherfehlern wie z Parasoft Insure ++ Mit dieser Methode können Sie Techniken aus herkömmlichen Mutationstests nutzen, um Unklarheiten aufzudecken, die mit anderen Methoden oder Werkzeugen nur schwer zu erkennen sind. Während beim herkömmlichen Mutationstest versucht wird, „fehlerhafte“ Mutanten zu erstellen, um eine effektivere Testsuite zu erstellen, werden beim Mutationstest zur Erkennung von Laufzeitspeicherfehlern funktional äquivalente Mutanten des zu testenden Quellcodes erstellt und ausgeführt.

Wenn eine dieser Mutanten eine andere Leistung als das ursprüngliche Programm erbringt, zeigt dies an, dass die Funktionalität des Codes auf impliziten Annahmen beruht, die während der Ausführung möglicherweise nicht immer erfüllt sind. Wenn eine Mutante das Programm zum Absturz bringt oder auf andere schwerwiegende Probleme stößt, ist dies ein Zeichen dafür, dass zur Laufzeit schwerwiegende Fehler auftreten, wenn die Annahmen nicht erfüllt sind.

In C ++ kann dieser Prozess zum Erstellen und Ausführen äquivalenter Mutanten Folgendes aufdecken:

  • Fehlende Kopierkonstruktoren oder fehlerhafte Kopierkonstruktoren.
  • Fehlende oder falsche Konstruktoren.
  • Falsche Reihenfolge der Initialisierung des Codes.
  • Probleme mit Zeigeroperationen.
  • Abhängigkeit von undefiniertem Verhalten wie Bewertungsreihenfolge.

Schritt 2: Verwenden Sie die statische Analyse, um fehleranfälligen und nicht portierbaren Code zu identifizieren

Nachdem Sie die kritischsten Fehler bereinigt haben, die durch Mutationstests aufgedeckt wurden, Verwenden Sie auch eine statische Analysel um Code zu identifizieren, der wahrscheinlich Probleme verursacht, wenn er auf die neue Plattform/Architektur portiert wird. Statische Codeanalysatoren verwenden ein Compiler-ähnliches Front-End, um ein syntaktisches und semantisches Modell der Software zu erstellen. Das syntaktische Modell wird dann anhand einer Reihe von Regeln oder „Checkern“ analysiert, um festzustellen, ob der Code eine Verletzung darstellt. Diese Prüfer verwenden Mustervergleichsalgorithmen, um Fehler wie die schlechte Verwendung von Sprachkonstrukten, die Verwendung unsicherer Funktionen und schlechte Codierungspraktiken zu erkennen, die die Portabilität behindern (wird in my nächsten Post) und andere Verstöße gegen Kodierungsrichtlinien.

Anspruchsvollere Prüfer verwenden eine semantische Analyse, bei der Daten und Kontrollfluss verwendet werden, um komplexe Fehler und Sicherheitslücken zu erkennen. Zu diesem Zweck erstellt der statische Analysator ein Ausführungsmodell der Software, berücksichtigt mögliche Pfade durch den Code und bewertet die Verwendung von Daten, wenn diese von der Quelle (z. B. Benutzereingaben) zu ihrem Ziel (z. B. einem API-Aufruf wie einem Systemaufruf) fließen ). Die Analyse aller möglichen Zustände und Pfade wäre zu zeitaufwändig. Daher verwendet der Analysator Heuristiken, um die wahrscheinlichsten Pfade für die Bewertung zu ermitteln. Zu den von diesen Prüfern erkannten Fehlertypen gehören Nullzeiger-Rücksichtnahme, Pufferüberläufe und Sicherheitslücken wie Befehls- und SQL-Injektionen.

Bei der Durchführung der statischen Analyse müssen zwei Hauptaufgaben behandelt werden:

  1. Identifizieren und korrigieren Sie Code, der auf jeder Plattform oder Architektur zu einem Fehler führen kann.
  2. Identifizieren und korrigieren Sie Code, der möglicherweise nicht gut portiert werden kann.

Überprüfen Sie zunächst die branchenweit anerkannten C / C ++ - Codierungsstandards, die Codierungskonstrukte identifizieren, die wahrscheinlich zu Problemen auf jeder Plattform oder Architektur führen. Indem Sie sicherstellen, dass der Code diesen Codierungsstandards entspricht, vermeiden Sie Fehler. Dies führt zu weniger Debugging auf der neuen Plattform oder Architektur und verringert die Wahrscheinlichkeit von Fehlern, die sich dem Testen entziehen und in die Version gelangen.

Schritt 3: Wiederholen Sie die Erkennung von Laufzeitspeicherfehlern

Wiederholen Sie die Erkennung von Laufzeitspeicherfehlern, um zu überprüfen, ob die während der Korrektur vorgenommenen Änderungen vorgenommen wurden statische Analyse Verstöße führten zu keinen Laufzeitfehlern.

Schritt 4: Unit-Test durchführen (optional)

An dieser Stelle möchten Sie möglicherweise einen weiteren Schritt ausführen, um sicherzustellen, dass Ihr Code so fehlerfrei wie möglich ist, bevor Sie ihn portieren. Dieser zusätzliche Schritt ist Unit-Tests. Unit-Tests werden traditionell verwendet, um Fehler zu finden, sobald jede Anwendungseinheit abgeschlossen ist. Dies kann auch später im Entwicklungsprozess von Vorteil sein, da es auf Einheitenebene einfacher ist, Eingaben zu entwerfen, die alle Funktionen erreichen. Dies wiederum hilft Ihnen, Fehler schneller zu finden und Fehler aufzudecken, die Sie mit Tests auf Anwendungsebene möglicherweise nicht aufdecken.

In den nächsten Post Ich beschreibe die Verwendung statischer Analysen, um Code für die Portierung auf 64-Bit-Plattformen vorzubereiten.

Holen Sie sich den ultimativen Speicher-Debugger für C und C ++

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.