Ich versuche, ein Programm zu schreiben, mit dem ich überprüfen kann, ob ein C-Quellcode mit einer Variablennamenskonvention übereinstimmt. Zu diesem Zweck muss ich den Quellcode analysieren und den Typ aller lokalen und globalen Variablen identifizieren.
Das Endergebnis wird mit ziemlicher Sicherheit ein Python-Programm sein, aber das Werkzeug zur Analyse des Codes könnte entweder ein Python-Modul oder eine Anwendung sein, die einen leicht zu analysierenden Bericht erstellt. Alternativ (mehr dazu weiter unten) könnte es auch eine Möglichkeit sein, Informationen aus dem Compiler zu extrahieren (in Form eines Berichts oder ähnlichem). Falls das hilfreich sein sollte, wird es aller Wahrscheinlichkeit nach der Keil ARM-Compiler.
Ich habe experimentiert mit ctags und das ist sehr nützlich, um alle Typedefs und Makrodefinitionen usw. zu finden, aber es bietet keine direkte Möglichkeit, den Typ von Variablen zu finden, besonders wenn die Definition über mehrere Zeilen verteilt ist (was hoffentlich nicht der Fall sein wird!).
Beispiele hierfür könnten sein:
static volatile u8 var1; // should be flagged as static and volatile and a u8 (typedef of unsigned 8-bit integer)
volatile /* comments */
static /* inserted just to make life */
u8 /* difficult! */ var2 =
(u8) 72
; // likewise (nasty syntax, but technically valid C)
const uint_16t *pointer1; // flagged as a pointer to a constant uint_16t
int * const pointer2; // flagged as a constant pointer to an int
const char * const pointer3; // flagged as a constant pointer to a constant char
static MyTypedefTYPE var3; // flagged as a MyTypedefTYPE variable
u8 var4, var5, var6 = 72;
int *array1[SOME_LENGTH]; // flagged as an array of pointers to integers
char array2[FIRST_DIM][72]; // flagged as an array of arrays of type char
usw. usw.
Es muss auch identifizieren, ob sie lokal oder global/Datei-Umfang Variablen (die ctags tun können) und wenn sie lokal sind, würde ich idealerweise wie der Name der Funktion, die sie innerhalb deklariert sind.
Ähnliches möchte ich auch mit Funktionen machen: den Rückgabetyp identifizieren, ob sie statisch sind und den Typ und Namen aller Argumente.
Leider ist dies mit der C-Syntax ziemlich schwierig, da es eine gewisse Flexibilität bei der Reihenfolge der Parameter und viel Flexibilität bei der Menge an Leerzeichen gibt, die zwischen den Parametern erlaubt sind. Ich habe mit der Verwendung einiger ausgefallener regulärer Ausdrücke gespielt, um die Arbeit zu erledigen, aber das ist alles andere als ideal, da es so viele verschiedene Situationen gibt, die angewendet werden können, so dass die regulären Ausdrücke schnell unüberschaubar werden. Ich kann mir nicht helfen, aber ich denke, dass Compiler in der Lage sein müssen, dies zu tun (um zu funktionieren!), also habe ich mich gefragt, ob es möglich ist, diese Informationen zu extrahieren. Der Keil-Compiler scheint eine ".crf"-Datei für jede Quelldatei zu erzeugen, die kompiliert wird, und diese scheint alle in dieser Datei deklarierten Variablen zu enthalten, aber es ist ein binäres Format und ich kann keine Informationen darüber finden, wie man diese Datei parsen kann. Alternativ dazu wäre eine Möglichkeit, die Informationen aus ctags herauszuholen, perfekt.
Für jede Hilfe, die mir jemand anbieten kann, wäre ich dankbar.
Danke,
Al