识别C项目中所有变量的类型

DrA*_*rAl 7 c python variables code-analysis coding-style

我正在尝试编写一个程序来检查某些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
Run Code Online (Sandbox Code Playgroud)

等等

它还需要确定它们是本地变量还是全局/文件范围变量(ctags可以做什么),如果它们是本地变量,我理想地喜欢它们在其中声明的函数的名称.

另外,我想用函数做类似的事情:确定返回类型,它们是否是静态的以及它们所有参数的类型和名称.

不幸的是,这对于C语法来说相当困难,因为参数顺序具有一定的灵活性,并且参数之间允许的空白量具有很大的灵活性.我已经玩弄了一些花哨的正则表达式来完成这项工作,但它远非理想,因为有很多不同的情况可以应用,所以正则表达式很快变得无法管理.我不禁想到编译器必须能够这样做(为了工作!),所以我想知道是否有可能提取这些信息.Keil编译器似乎为每个编译的源文件生成一个".crf"文件,这似乎包含该文件中声明的所有变量,但它是二进制格式,我找不到任何有关如何解析这个的信息文件.另外,从ctags中获取信息的方法也是完美的.

任何人都可以提供的任何帮助将不胜感激.

谢谢,

Van*_*ale 5

有许多Python解析器包可用于描述语法,然后它将生成Python代码来解析该语法.

Ned Batchelder写了一篇非常好的总结

其中,Ply用于一个名为pycparser的项目,用于解析C源代码.我建议从这开始.

其他一些解析器项目也可能有样本C解析器.

编辑:刚才注意到pycparser甚至有一个示例Python脚本来解析C类型声明,就像旧的cdecl程序一样.