TL;DR : Ich brauche Tools, um problematischen Code in einer 32- auf 64-Bit-C++-Linux-Migration zu finden (Tools können unter Linux oder Widows laufen).
Hier ist es also, ich habe eine riesige C++-Anwendung (wir sprechen von mehr als 8 Millionen Codezeilen), die ich von einer 32-Bit-Plattform auf eine 64-Bit-Plattform (unter Linux) portieren möchte. Der Grund für die Portierung des Codes ist nicht fraglich, meine Aufgabe ist es, dies zu tun. Die App ist auf 32 Bit voll funktionsfähig, aber der Code kann teilweise sehr alt sein und ist eindeutig nicht mit den neuesten Standards und bewährten Verfahren codiert. Um erfolgreich zu sein, muss ich alle Codefragmente lokalisieren, die problematisch sind, wenn sie in 64-Bit kompiliert werden, ohne zu viele Fehlalarme zu entdecken, da wir über Millionen in Zeilen sprechen und ich nicht über die Ressourcen verfüge, um den gesamten Code umzugestalten, um ihn sauber und hübsch zu machen. Abschließend meine Frage, welche Tools können mir bei dieser Aufgabe helfen?
Ich habe PVS-Studio in Betracht gezogen, aber es scheint für Windows-Apps konzipiert zu sein. Ich habe auch überlegt, Compiler-Meldungen wie Gcc und Clang-Warnung zu verwenden, aber es gibt viel zu viele Fehlalarme, da es im 32-Bit-Fall bereits viele davon gibt. Ich habe auch statische Analysetools wie Cppchack, Klowork, Gimpel Pc-Lint und FlexeLint oder "Parasoft C++ test" in Betracht gezogen, aber ich kenne diese Tools nicht wirklich und ob sie mir wirklich helfen können.
Kurz gesagt, die Muster, die ich lokalisieren muss, sind (fragen Sie mich, wenn Sie mehr Details benötigen):
- problematische Verwendung von Typen mit unterschiedlicher Größe in 32 und 64 Bit
- durch die Migration verursachte Überläufe
- problematische magische Werte
- Änderung der Speicherausrichtung in der Struktur, Union und so
- schlechte Verwendung des Formatbezeichners (wie in printf(“%u”, val); wenn val ein Long ist) - problematische implizite Umwandlung
- Methoden und Funktionen, die nicht mehr übereinstimmen (virtuelle und überladene Methode)
Die 4 wichtigsten Punkte sind:
- Ich muss alle durch die Migration verursachten Probleme finden oder wissen, welche Arten von Problemen ich übersehen habe, wenn ich sie nicht finden kann.
- Ich brauche wenige Fehlalarme oder eine Möglichkeit, sie schnell zu eliminieren (Automatisierung erforderlich)
. - Die Lösung muss industriell sein (dh skriptfähig oder automatisch). Es ist eine riesige Codebasis, Handarbeit ist nicht möglich.
- Die Lösung kann ein Tool oder eine Reihe von Tools sein, kostenlos oder nicht, Linux oder Windows.
Es wäre ein Plus, wenn das Tool mit einer schönen und übersichtlichen Dokumentation geliefert wird.
Wenn Sie jemals ein solches Problem hatten, danke ich Ihnen für jeden Rat, den Sie mir geben können.
Ja, ich habe Aufgaben mit umfangreicher Analyse und Modifikation von Code, einschließlich C++, erledigt. Ich baue Tools, die explizit dafür ausgelegt sind.
Unser DMS Software Reengineering Toolkit mit seinem C++ Frontend könnte hilfreich sein.
(Da dies keine Standardlösung für das Problem des OP ist, kann ich hier keine Empfehlung aussprechen, sondern nur auf seine Existenz hinweisen. Ich werde behaupten, dass es sich um eine praktikable Lösung für sein Problem handelt, wie angegeben).
Was DMS bietet, ist die Möglichkeit, ein benutzerdefiniertes ("skriptbasiertes") Analysetool zu konfigurieren, das sich auf die spezifischen Anforderungen einer bestimmten Codebasis konzentriert. Sein C++-Parser kann C++14-Quellcode im GCC- oder MSVS-Stil lesen, vollständige ASTs, Compiler-genaue Symboltabellen und lokale Steuerungs- und Datenflussanalysen für Methoden/Funktionen erstellen. Es verfügt über eine integrierte Unterstützung zum Analysieren von Wertebereichen, die eine Variable sein kann. Mit diesen Grundlagen ist es oft praktisch, einen fokussierten Analysator zu bauen, der bestimmte interessierende Probleme erkennt.
In dem Maße, in dem ein Problem erkannt wird und eine bekannte Lösung hat (stellen Sie sich vor, Sie kopieren einen 32-Bit-Zeiger in ein 32-Bit-Int; auf einem 64-Bit-Computer muss das 32-Bit-Int auf 64 Bit umdeklariert werden), DMS kann Source anwenden -to-Source-Programmtransformationen , um die ASTs zu modifizieren und dann den Quellcode aus den modifizierten Bäumen neu zu generieren. Dies kann eine große Hilfe bei der Verwaltung der Änderungskosten nach der Erkennung sein. DMS wurde für andere Massenänderungsaufgaben verwendet, die auf C++-Quellcode angewendet wurden.
In Bezug auf benutzerdefinierte Analysatoren, die für die Aufgaben von OP benötigt werden:
Keines davon ist wahrscheinlich so einfach, wie ich vorgeschlagen habe. Alle zusammen sind wahrscheinlich immer noch viel weniger Arbeit als der Versuch, Probleme über 8M SLOC von Hand zu erkennen/zu patchen.
Ihre Eckdaten:
DMS kann unter Windows oder unter Linux unter Wine ausgeführt werden.
Ira Baxter
Rbtnk
phuclv