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

标签 python c variables coding-style code-analysis

我正在尝试编写一个程序来检查某些 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 语法来说相当困难,因为参数顺序有一定的灵 active ,参数之间允许的空白数量也有很大的灵 active 。我尝试过使用一些花哨的正则表达式来完成这项工作,但它远非理想,因为可以应用的情况太多,因此正则表达式很快变得难以管理。我忍不住认为编译器必须能够做到这一点(为了工作!),所以我想知道是否有可能提取这些信息。 Keil 编译器似乎为每个编译的源文件生成一个“.crf”文件,这似乎包含该文件中声明的所有变量,但它是二进制格式,我找不到有关如何解析它的任何信息文件。或者,从 ctags 中获取信息的方法将是完美的。

如能提供任何帮助,我们将不胜感激。

谢谢,

最佳答案

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

Ned Batchelder 写了一个 very nice summary

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

其他一些解析器项目可能也有示例 C 解析器。

编辑:刚刚注意到 pycparser 甚至有一个示例 Python 脚本到 parse C type declarations就像旧的 cdecl 程序一样。

关于python - 识别 C 项目中所有变量的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/778468/

相关文章:

python - 在 C 中嵌入 Python : unable to read python return integer value

ios - 如何在 Swift 中声明全局变量?

python - 如何干净地传递关键字参数?

python - 避免使用 Python 中的全局变量,我有几个函数可以更改一个变量

python - django-admin.py startproject mysite 没有执行任何操作

java 设置变量

javascript - 未初始化值和未定义值之间的区别

python - 比较 DF 中两列的(子)字符串

c - ANSI C 中的字符串处理(内存分配)

c - 从以前的 libc.so.6 库调用访问 errno 值的方法?