Я пытаюсь написать программу для проверки того, что некоторый исходный код на C соответствует соглашению об именовании переменных. Для этого мне нужно проанализировать исходный код и определить тип всех локальных и глобальных переменных.
Конечным результатом почти наверняка будет программа на Python, но инструментом для анализа кода может быть либо модуль Python, либо приложение, которое выдает отчет, который легко анализировать. В качестве альтернативы (подробнее об этом ниже) это может быть способ извлечения информации из компилятора (в виде отчета или подобного). В случае, если это будет полезно, по всей вероятности, это будет компилятор Keil ARM.
Я экспериментировал с ctags , и это очень полезно для нахождения всех определений типов, определений макросов и т. Д., Но он не дает прямого способа найти тип переменных, особенно когда определение разбито на несколько строк (что, я надеюсь, не будет!).
Примеры могут включать в себя:
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), и если они локальные, в идеале мне бы хотелось, чтобы имя функции, в которой они были объявлены .
Кроме того, я хотел бы сделать то же самое с функциями: определить тип возвращаемого значения, являются ли они статическими, а также тип и имя всех их аргументов.
К сожалению, это довольно сложно с синтаксисом языка Си, поскольку существует определенная гибкость в порядке расположения параметров и большая гибкость в количестве пустого пространства, которое допускается между параметрами. Я поиграл с использованием некоторых причудливых регулярных выражений для выполнения работы, но это далеко от идеала, поскольку существует так много разных ситуаций, которые можно применять, поэтому регулярные выражения быстро становятся неуправляемыми. Я не могу не думать, что компиляторы должны быть в состоянии сделать это (чтобы работать!), Поэтому мне было интересно, можно ли было извлечь эту информацию. Компилятор Keil создает файл «.crf» для каждого скомпилированного исходного файла, и он содержит все переменные, объявленные в этом файле, но это двоичный формат, и я не могу найти никакой информации о том, как это проанализировать. файл. В качестве альтернативы был бы идеален способ получения информации из ctags.
Буду признателен за любую помощь, которую может предложить каждый.
Спасибо
Al