Wie würden Sie die Erkennung von totem Code in C/C++-Code angehen? Ich habe eine ziemlich große Codebasis, mit der ich arbeiten muss, und mindestens 10-15 % sind toter Code. Gibt es ein Unix-basiertes Werkzeug, um diese Bereiche zu identifizieren? Einige Teile des Codes verwenden immer noch viel Präprozessor, kann ein automatisierter Prozess das bewältigen?
Antworten
Zu viele Anzeigen?G++ 4.01 -Wunreachable-code warnt vor Code, der innerhalb einer Funktion unerreichbar ist, warnt aber nicht vor unbenutzten Funktionen.
int foo() {
return 21; // point a
}
int bar() {
int a = 7;
return a;
a += 9; // point b
return a;
}
int main(int, char **) {
return bar();
}
g++ 4.01 gibt eine Warnung über Punkt b aus, sagt aber nichts über foo() (Punkt a), obwohl dieser in dieser Datei nicht erreichbar ist. Dieses Verhalten ist korrekt, wenn auch enttäuschend, denn ein Compiler kann nicht wissen, dass die Funktion foo() nicht in einer anderen Kompiliereinheit als extern deklariert und von dort aus aufgerufen wurde; nur ein Linker kann sich dessen sicher sein.
Eine solche Analyse des toten Codes erfordert eine globale Analyse Ihres gesamten Projekts. Sie können diese Informationen nicht erhalten, indem Sie einzelne Übersetzungseinheiten analysieren (Sie können zwar tote Elemente erkennen, wenn sie sich vollständig innerhalb einer einzelnen Übersetzungseinheit befinden, aber ich glaube nicht, dass Sie wirklich danach suchen).
Wir haben unser DMS Software Reengineering Toolkit verwendet, um genau dies für Java-Code zu implementieren, indem wir alle beteiligten Kompilierungseinheiten auf einmal geparst, Symboltabellen für alles erstellt und alle Referenzen aufgespürt haben. Eine Top-Level-Definition ohne Referenzen und ohne den Anspruch, ein externes API-Element zu sein, ist tot. Dieses Tool entfernt auch automatisch den toten Code, und am Ende können Sie wählen, was Sie wollen: den Bericht über tote Entitäten oder den von diesen Entitäten befreiten Code.
DMS parst auch C++ in einer Vielzahl von Dialekten (EDIT Feb 2014: einschließlich MS und GCC Versionen von C++14 [EDIT Nov 2017: jetzt C++17] ) und baut alle erforderlichen Symboltabellen auf. Das Aufspüren der toten Verweise wäre von diesem Punkt aus ein Kinderspiel. DMS könnte auch verwendet werden, um sie zu entfernen. Siehe http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html
- See previous answers
- Weitere Antworten anzeigen