Auflösen von typedefs in C und C ++

8

Ich versuche automatisch typedefs in beliebigen C ++ - oder C Projekten aufzulösen.

Da einige der typedefs in Systemheaderdateien definiert sind (zum Beispiel uint32 ), versuche ich dies zu erreichen, indem ich den gcc-Präprozessor für meine Codedateien ausführe und dann die vorverarbeiteten Dateien nach typedefs scanne. Ich sollte dann in der Lage sein, die Typedefs in den Code-Dateien des Projekts zu ersetzen.

Ich frage mich, ob es eine andere, vielleicht einfachere Art gibt, die ich vermisse. Kannst du an einen denken?

Der Grund, warum ich das machen möchte: Ich extrahiere Code-Metriken aus den C / C ++ - Projekten mit verschiedenen Werkzeugen. Die Metriken sind methodenbasiert. Nach dem Extrahieren der Metriken muss ich die Daten zusammenführen, die von den verschiedenen Tools erzeugt werden. Das Problem ist, dass eines der Tools typedefs auflöst und andere nicht. Wenn typedefs für die Parametertypen von Methoden verwendet wird, werden Metriken verschiedenen Methodennamen zugeordnet, die sich im Quellcode auf dieselbe Methode beziehen.

Stellen Sie sich diese Methode im Quellcode vor: int test(uint32 par1, int par2)
Nachdem ich meine Tools ausgeführt habe, habe ich Metriken, die einer Methode namens int test(uint32 par1, int par2) zugeordnet sind, und einige meiner Metriken werden auf int test(unsigned int par1, int par2) abgebildet.

    
Customizer 30.01.2010, 12:00
quelle

3 Antworten

5

Wenn Sie nicht herausfinden möchten, wo sie definiert sind, können Sie objdump um die C ++ - Symboltabelle auszugeben, die typedefs auflöst.

%Vor%

Dieses Snippet stammt aus der folgenden Strukturdefinition:

%Vor%

Dies erfordert, dass Sie alles kompilieren und es werden nur Symbole in der resultierenden ausführbaren Datei angezeigt, so dass einige Einschränkungen bestehen. Die andere Option besteht darin, dass der Linker eine Symbolzuordnung ablegt. Für GNU-Tools fügen Sie -Wl,-map und -Wl,name hinzu, wobei name der Name der zu erzeugenden Datei ist (siehe Hinweis). Dieser Ansatz macht die Namen nicht überflüssig, aber mit ein wenig Arbeit können Sie die Mangelnde Konventionen des Compilers zurückentwickeln. Die Ausgabe des vorherigen Snippets enthält etwa Folgendes:

%Vor%

Sie können diese mit der C ++ ABI Spezifikation dekodieren. Sobald Sie sich daran gewöhnt haben, wie das funktioniert, wird die Mangeltabelle , die in der ABI enthalten ist, unbezahlbar . Die Herleitung ist in diesem Fall:

%Vor%

Hinweis: Es sieht so aus, als ob GNU die Argumente in ld ändert. Daher sollten Sie in Ihrem lokalen Handbuch ( man ld ) nachsehen, ob die Befehle zur Generierung der Kartendatei -map sind. filename in Ihrer Version. In neueren Versionen verwenden Sie -Wl,-M und leiten stdout in eine Datei um .

    
D.Shawley 30.01.2010, 14:55
quelle
3

Sie können Clang (das LLVM C / C ++ - Compiler-Front-End) verwenden, um Code so zu analysieren, dass Informationen zu typedefs und sogar Makros erhalten bleiben. Es hat eine sehr nette C ++ - API zum Lesen der Daten, nachdem der Quellcode in den AST (Abstract Syntax Tree) eingelesen wurde. Ссылка

Wenn Sie stattdessen nach einem einfachen Programm suchen, das bereits die Auflösung für Sie erledigt (anstelle der Clang-Programmier-API), denke ich, dass Sie Pech haben, da ich noch nie so etwas gesehen habe.

    
Tronic 30.01.2010 12:34
quelle
2

GCC-XML kann helfen, die typedefs aufzulösen, Sie müssten den Typ-IDs von folgen <Typedef> elements, bis Sie sie in ein <FundamentalType> , <Struct> oder <Class> Element aufgelöst haben.

Zum Ersetzen der typedefs in Ihrem Projekt haben Sie jedoch ein grundsätzlicheres Problem: Sie können nicht einfach suchen und ersetzen, da Sie den Geltungsbereich von Namen berücksichtigen müssen - denken Sie an z. function-local typedefs, Namespace-Aliase oder using -Direktiven.

Je nachdem, was Sie eigentlich erreichen wollen, muss es einen besseren Weg geben.

Update: Eigentlich sollte in dem gegebenen Kontext der Korrektur von Metrikdaten die Ersetzung der Typnamen mit gcc-xml funktionieren, wenn sie Ihre Codebasis unterstützt.

    
Georg Fritzsche 30.01.2010 12:13
quelle

Tags und Links