Hi
Ich benutze den pycparser zum analysieren von c code. Das ganze geht auch schon sehr gut und ich kann auch schon sehr gut Funktionen im Code suchen. Allerdings habe ich das bisher nur mit kleinen Dateien gemacht. Als ich jetzt mal über eine komplexeres Projekt drüber parsen wollte gab es Probleme mit den Header Dateien. Ich verwende die Fake Headers die beim pycparser dabei sind. Von Projektspezifischen header dateien habe ich auch Fakes erstellt und das geht auch aber wenn systemspezisfische Headerdateien drinnen sind dann versucht er die zu parsen und stürzt ab. Vielleicht kennt ja jemand diesen Parser und dieses Problem? Mein Ziele ist es einfach nur speziele Funktionsaufrufe im Code zu finden und zu ersetzen.
Möglichkeit wäre auch einen anderen Parser zu nehmen aber ich habe derzeit noch keinen gefunden aber vielleicht kennts ihr ja einen?!
mfg Harald
pycparser Header Problem
Hi
Also ich konnte mein Problem leider immer noch nicht lösen bin aber jetzt an einer anderen Variante dran. Man kann den Parser auch sagen das er den Preprocessor (cpp) nicht selber verwenden sollen sondern das man ihn schon den Code nach den Preprocessor übergibt. Das habe ich nun mal bei meinen einfachen Beispiel getestet und es geht. Mein Problem jetzt ist das der Code den ich eigentlich analysieren soll mittels cmake gebuildet wird. Mein Idee wäre es nun den cmake Process zu starten und und mir die Sourcen nach den Preprocessor ausgeben zu lassen sofern das möglich ist?! Bin leider neu im Thema cMake und muss mir das nun erst anschauen ob das so einfach geht. Vielleicht hat ja jemand schon mal einen Tipp ob das funktionieren kann oder nicht?!
mfg Harald
Also ich konnte mein Problem leider immer noch nicht lösen bin aber jetzt an einer anderen Variante dran. Man kann den Parser auch sagen das er den Preprocessor (cpp) nicht selber verwenden sollen sondern das man ihn schon den Code nach den Preprocessor übergibt. Das habe ich nun mal bei meinen einfachen Beispiel getestet und es geht. Mein Problem jetzt ist das der Code den ich eigentlich analysieren soll mittels cmake gebuildet wird. Mein Idee wäre es nun den cmake Process zu starten und und mir die Sourcen nach den Preprocessor ausgeben zu lassen sofern das möglich ist?! Bin leider neu im Thema cMake und muss mir das nun erst anschauen ob das so einfach geht. Vielleicht hat ja jemand schon mal einen Tipp ob das funktionieren kann oder nicht?!
mfg Harald
So habe nun den Weg gewählt das ich den make Prozess nach den Preprozessor abdreh und diese Files dann mit den Parser analysiere damit sollten ja eigentlich keine Probleme mehr auftreten. Das hat wieder meiner kleinen Testdatei funktioniert aber bei einer größeren Datei aus einen echten Projekt bekomme ich erneut einen Fehler.
Wie kann er diesen Fehler noch erhalten nach den Preprozessor sollte er ja keine Header Dateien mehr brauchen oder?
mfg Harald
Code: Alles auswählen
File "/usr/local/lib/python2.7/dist-packages/pycparser/plyparser.py", line 54, in _parse_error
raise ParseError("%s: %s" % (coord, msg))
pycparser.plyparser.ParseError: /usr/include/stdint.h:58:1: before: __extension__
mfg Harald
@harald: Falls bei deinem aktuellen Problem keine Lösung rauskommen sollte, dann würde ich an deiner Stelle mal dort einen neuen Issue erstellen. Auch wenn es nicht zwangsläufig ein Fehler im Code des Parser-Moduls ist, so sollte dies trotzdem die beste Möglichkeit sein, um mit dem Autoren in Kontakt zu treten. Ich lese in dessen Blog mit und er macht nen ganz netten Eindruck auf mich. Ich bin daher recht zuversichtlich, dass er dich bei der Lösungsfindung unterstützen wird.
-
lunar
@harald Bist Du sicher, dass Du da wirklich Dateien analysierst, die der Präprozessor erzeugt hat? Wie “drehst” Du den Make-Prozess ab? Erzeugt der Make-Prozess überhaupt Dateien für die Ausgabe des Präprozessors? Das wäre zumindest eher ungewöhnlich, den normalerweise erfolgt die Übergabe zwischen Präprozessor und Compiler über Pipes.
HI
Ja es sollten die richtigen Daten sein. Ich habe ein kleines Hellorworld Beispiel verwendet um es zu testen. Den Output nach den Präprozessor habe ich einmal mit den cpp und einmal mit gcc -E erstellt und beide sind identisch und funktionieren. Das File das ich vom cmake Prozess bekomme schaut sehr ähnlich aus (natürlich länger aber es sind auch die ganze Inhalte der Header dateien drinnen usw).
mfg Harald
Ja es sollten die richtigen Daten sein. Ich habe ein kleines Hellorworld Beispiel verwendet um es zu testen. Den Output nach den Präprozessor habe ich einmal mit den cpp und einmal mit gcc -E erstellt und beide sind identisch und funktionieren. Das File das ich vom cmake Prozess bekomme schaut sehr ähnlich aus (natürlich länger aber es sind auch die ganze Inhalte der Header dateien drinnen usw).
mfg Harald
Hi
Also ich kann zwar derzeit meinen Code mit pycparser Parsen aber dazu muss ich fake Headerdateien erstellen. Dies ist ein Problem wenn ich das ganze für ein anderes Projekt anwenden will da ich dann wieder alles neu erstellen muss. Wenn ich die normalen Header Files verwende hat er Probleme mit __cdecl und ähnlichen sachen. Habe eben auch schon versucht den Code direkt nach den Präprzessor zu nehmen aber auch da habe ich das Problem mit __cdecl und co. Gibt es eine Möglichtkeit beim Präprocessor dies zu deaktivieren oder gibt es eine Möglichkeit pycparser zu überreden es doch zu nehmen. Vielleicht hatte ja schon mal jemand ein ähnliches Problem und kann mit einen Tipp geben.
Danke im Vorhinein für alle Antworten.
mfg Harald
Also ich kann zwar derzeit meinen Code mit pycparser Parsen aber dazu muss ich fake Headerdateien erstellen. Dies ist ein Problem wenn ich das ganze für ein anderes Projekt anwenden will da ich dann wieder alles neu erstellen muss. Wenn ich die normalen Header Files verwende hat er Probleme mit __cdecl und ähnlichen sachen. Habe eben auch schon versucht den Code direkt nach den Präprzessor zu nehmen aber auch da habe ich das Problem mit __cdecl und co. Gibt es eine Möglichtkeit beim Präprocessor dies zu deaktivieren oder gibt es eine Möglichkeit pycparser zu überreden es doch zu nehmen. Vielleicht hatte ja schon mal jemand ein ähnliches Problem und kann mit einen Tipp geben.
Danke im Vorhinein für alle Antworten.
mfg Harald
