一部のCソースコードが変数の命名規則に準拠していることを確認するプログラムを作成しようとしています。これを行うには、ソースコードを分析し、すべてのローカル変数とグローバル変数のタイプを特定する必要があります。
最終結果はほぼ確実にPythonプログラムになりますが、コードを分析するためのツールは、Pythonモジュールか、解析しやすいレポートを生成するアプリケーションのいずれかです。あるいは(これについては以下で詳しく説明します)、コンパイラーから情報を抽出する方法(レポートなど)である可能性があります。それが役立つ場合は、おそらく、KeilARMコンパイラになります。
私はctagsを試してきましたが、これはすべてのtypedefやマクロ定義などを見つけるのに非常に便利ですが、特に定義が複数の行にまたがっている場合は、変数のタイプを直接見つける方法はありません(そうならないことを願っています!)。
例としては、次のものがあります。
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
などなどなど
また、それらがローカル変数であるかグローバル/ファイルスコープ変数(ctagsで実行可能)であるかを識別する必要があります。ローカルである場合は、宣言されている関数の名前が理想的です。
また、関数でも同様のことを行いたいと思います。戻り型、静的かどうか、すべての引数の型と名前を識別します。
残念ながら、これはC構文ではかなり困難です。これは、パラメーターの順序にある程度の柔軟性があり、パラメーター間に許可される空白の量に多くの柔軟性があるためです。いくつかの凝った正規表現を使って作業をしましたが、適用できるさまざまな状況が非常に多く、正規表現がすぐに管理できなくなるため、理想からはほど遠いものです。コンパイラーが(動作するために!)これを実行できる必要があると思わずにはいられないので、この情報を抽出できるかどうか疑問に思いました。Keilコンパイラは、コンパイルされたソースファイルごとに「.crf」ファイルを生成するようで、これにはそのファイルで宣言されたすべての変数が含まれているように見えますが、これはバイナリ形式であり、私はできます。このファイルを解析する方法に関する情報を見つけてください。あるいは、ctagsから情報を取得する方法が最適です。
誰もがこれで提供できるどんな助けでもありがたいです。
ありがとう、
アル