Пример кода для запуска статического анализатора Кланга

Я хотел бы увидеть небольшой, но полный фрагмент кода, который заставит жаловаться статический анализатор Кланга. Моя мотивация в основном состоит в том, что я пытаюсь заставить его работать над моим кодом PIC32, и мне нужен способ различать «все в порядке, код» и «он на самом деле ничего не делает». Это также отчасти любопытство, так как я сам не могу придумать простой пример.

C89 / ANSI или C99 - это хорошо, и в идеале я бы хотел, чтобы они уловили простую утечку памяти. Я использую

clang --analyze test.c
15
задан detly 14 August 2010 в 10:16
поделиться

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: I found another one that also detect stack memory proliferation

char const* myBuggyFunction(void) {
  return (char[len + 1]){ 0 };
}

Это не обнаруживается gcc, open64 или clang с -Wall, но clang с --analyze.

13
ответ дан 1 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: