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

2024-04-18 03:53:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个程序来检查一些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

等等等等

它还需要确定它们是局部变量还是全局/文件范围变量(ctag可以这样做),如果它们是局部变量,我最理想的情况是它们在其中声明的函数的名称。在

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

不幸的是,这对于C语法来说相当困难,因为参数顺序有一定的灵活性,参数之间允许的空白量也有很大的灵活性。我曾经尝试过使用一些奇特的正则表达式来完成这项工作,但这远不是理想的,因为有太多不同的情况可以应用,所以正则表达式很快就变得不可管理了。我不禁认为编译器必须能够做到这一点(为了工作!)我想知道这是否可能。Keil编译器似乎为每个编译的源文件生成一个“.crf”文件,它似乎包含该文件中声明的所有变量,但它是二进制格式,我找不到任何有关如何解析该文件的信息。或者,从CTAG中获取信息的方法将是完美的。在

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

谢谢

艾尔


Tags: 文件ofto方法类型编译器asstatic
3条回答

看看ANTLR。它是一个解析器生成器,带有python的绑定。ANTLR站点提供了一大堆通用语言的语法,包括C语言。您可以下载C的语法,并在适当的地方添加操作来收集您感兴趣的信息。甚至有一个简洁的图形工具来创建和调试语法。(我知道这看起来很俗气,但实际上很方便,也不讨厌)

我只是做了一些类似的事情,只是为了得到我的符号信息,我实际上是从GDB中提取出来的。在

从另一边完全接近它怎么样。您已经有了一个完全理解C类型系统的所有细微差别的解析器:编译器本身。因此,在完全调试支持下编译项目,并在调试数据中进行探索。在

对于基于binutils支持的格式的系统,您需要的大部分细节都可以通过BFD库了解。在

微软的调试格式(在某种程度上)得到了MSDN上的库和文档的支持,但我的googlefu现在很弱,我不打算把我知道的文章放在这里链接。在

keil8051编译器(我在这里没有使用他们的ARM编译器)使用Intel OMF或OMF2格式,并说明调试符号是用于调试器或“任何与英特尔兼容的模拟器”的。keilc51使用的OMF规范可以从Keil获得,所以我可以想象类似的规范也可以用于其他编译器。在

快速浏览Keil的网站似乎表明他们放弃了他们的专利ARM编译器,转而使用ARM的RealView编译器,后者似乎使用了带有DWARF格式调试信息的ELF对象。Dwarf应该得到BFD的支持,并且应该为您提供验证类型和名称匹配所需的所有信息。在

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

Ned Batchelder写了一个very nice summary

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

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

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

相关问题 更多 >