Я искал инструменты, помогающие обнаружить ошибки, которые мешают программе работает правильно как 64-битный код. Совсем недавно я играл с Klocwork и его настраиваемой функцией проверки, которая позволяет мне перемещаться по исходному коду в виде дерева с помощью XPath. Это полезно как «более умная» альтернатива регулярным выражениям, но я не смог заставить ее распознавать типы.
Например, допустим, я хотел бы найти каждый экземпляр для
], который использует для подсчета либо int
, либо long
. Следующий код легко найти.
for (int i = 0; i < 10; i++)
// ...
Поиск этого кода тривиален, потому что определение переменной находится прямо внутри цикла. Однако рассмотрим следующий пример.
int i;
// ...
for (i = 0; i < 10; i++)
// ...
Это трудно найти, потому что определение переменной отделено от цикла, а необходимое выражение XPath будет либо громоздким, либо подверженным ошибкам.
Таким образом, пользовательские правила Klocwork могут находить выражения как здесь, где необходимо распознавание типов, включая разрешение операторов typedef
и #define
? Существуют ли другие инструменты, которые могут это сделать?
РЕДАКТИРОВАТЬ 1: Рассмотрим следующий пример.
typedef int myint;
void Foo() {
int i;
for (i = 0; i < 10; i++) {
Bar();
}
myint j;
for (j = 0; j < 10; j++) {
Bar();
}
}
Решение , предоставленное ahmeddirie , находит первый цикл, потому что тип i
явно определяется как int
. Однако второй цикл не обнаружен, потому что определение типа скрыло базовый тип. Какие инструменты отслеживают типы таким образом, чтобы вторая переменная цикла j
действительно была int
?