Может ли Klocwork (или другие инструменты) знать о типах, typedefs и директивах #define?

Я искал инструменты, помогающие обнаружить ошибки, которые мешают программе работает правильно как 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 ?

6
задан Community 23 May 2017 в 12:00
поделиться