Пример кода для запуска статического анализатора Clang
Я хотел бы увидеть небольшой, но полный фрагмент кода, который заставит статический анализатор Clang жаловаться. Моя мотивация в основном заключается в том, что я пытаюсь заставить его работать над моим кодом PIC32, и мне нужен способ различать "весь код в порядке" и "на самом деле он ничего не делает". Это также отчасти любопытство, так как я сам не могу придумать простой пример.
C89 / ANSI или C99 в порядке, и в идеале я хотел бы, чтобы он взял простую утечку памяти. Мой использование
clang --analyze test.c
1 ответов
я нашел "ошибку" в моем коде (единственный; -), который срабатывает этим, и это не обнаружено -Wall
. Я сварил его до следующего
struct elem {
struct elem *prev;
struct elem *next;
};
#define ELEM_INITIALIZER(NAME) { .prev = &(NAME), .next = &(NAME), }
struct head {
struct elem header;
};
#define HEAD_INITIALIZER(NAME) { .header = ELEM_INITIALIZER(NAME.header) }
int main(int argc, char ** argv) {
struct head myhead = HEAD_INITIALIZER(myhead);
}
это относительно прямая реализация связанного списка, но здесь это не важно. Переменная myhead
не используется в обычном смысле этого термина, но для компилятора он используется, так как внутри инициализатора берется адрес Поля.
clang
правильно анализирует это как
/tmp 11:58 <722>% clang --analyze test-clang.c
test-clang.c:25:15: warning: Value stored to 'myhead' during its initialization is never read
struct head myhead = HEAD_INITIALIZER(myhead);
^ ~~~~~~~~~~~~~~~~~~~~~~~~
1 diagnostic generated.
Edit: я нашел еще один, который также обнаруживает пролиферацию стековой памяти
char const* myBuggyFunction(void) {
return (char[len + 1]){ 0 };
}
это не обнаружено gcc
, open64
или clang
С -Wall
, а clang
С --analyze
.