Подтвердить что ты не робот

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

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

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

clang --analyze test.c
4b9b3361

Ответ 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.

Изменить: я нашел еще один, который также обнаруживает распространение памяти стека

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

Это не определяется gcc, open64 или clang с помощью -Wall, а clang с --analyze.