我正在尝试编写一个程序来检查某些 C 源代码是否符合变量命名约定。为此,我需要分析源代码并识别所有局部和全局变量的类型。
最终结果几乎肯定会是一个 python 程序,但分析代码的工具可以是 python 模块,也可以是生成易于解析的报告的应用程序。或者(在下面详细介绍)它可能是从编译器中提取信息的一种方式(通过报告或类似方式)。如果这很有帮助,很可能是Keil ARM 编译器。
我一直在尝试使用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 中获取信息的方法将是完美的。
任何人都可以为此提供任何帮助,我们将不胜感激。
谢谢,
铝