Как сделать так, чтобы Clang Static Analyzer выводил свою работу из командной строки?

Я использую Clang 3.4 на Ubuntu 12.10 (из http://llvm.org/apt/). Я запустил анализатор (clang —analyze) над некоторым кодом, и он обнаружил пару проблем:

Blah.C:429:9: warning: Declared variable-length array (VLA) has zero size
unsigned char separatedData[groupDataLength];
^~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~

Но конкретный вопрос не важен. Я хочу знать, как он пришел к такому выводу (код достаточно сложен, чтобы я не видел его в течение 15 минут).

Я вижу скриншот с сайта Clang, который показывает шаги работы при просмотре в веб-браузере:

Скриншот

Это, вероятно, получено из Xcode.

Вопрос в том, как заставить Clang выводить такие шаги из командной строки? Или даже выводить результаты в браузер, если он этого хочет? Это сделало бы анализатор значительно более полезным и сделало бы исправление намного быстрее.

(Я заметил, что документация GCC очень хорошая, но документация Clang / LLVM очень плохая. Я попробовал «clang —analyze -Xanalyzer ‘-v'» как удар в темноте, чтобы сказать анализатору быть более многословным — переключатель -Xanalyzer был из справочных страниц.)

15

Решение

Помимо вывода текста на консоль:

clang++ --analyze -Xanalyzer -analyzer-output=text main.cpp

Вы можете получить полный вывод HTML:

clang++ --analyze -Xanalyzer -analyzer-output=html -o html-dir main.cpp

Кроме того, вы можете выбрать конкретные шашки для включения. Эта страница перечисляет доступные чеки. Например, вы можете включить все проверки C ++ в альфа-группе, используя флаги:

-Xanalyzer -analyzer-checker=alpha.cplusplus

http://coliru.stacked-crooked.com/a/7746c4004704d4a7

main.cpp:5:1: warning: Potential leak of memory pointed to by 'x'
}
^
main.cpp:4:12: note: Memory is allocated
int *x = new int;
^~~~~~~
main.cpp:5:1: note: Potential leak of memory pointed to by 'x'
}
^

Видимо передний конец выставляет

-analyzer-config <Название варианта>знак равно<Значение>

Например.

-analyzer-config -analyzer-checker=alpha.cplusplus

что может быть лучше, чем -Xanalyzer и может быть расширен для поддержки вариантов для отдельных контролеров: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2014-October/039552.html

20

Другие решения

Вы на правильном пути, но чтобы получить полную трассировку, ведущую к ошибке, вам дополнительно нужно попросить clang для вывода в текстовом формате (не спрашивайте почему). Так как вам, вероятно, нужно будет настроить, например, Включите пути или определения для вашего проекта, так или иначе, я бы предложил вам использовать clang-check который действует как обертка вокруг прохода анализатора Clang. Он также может подключаться к инструментам статического анализатора, например, scan-build, Вы можете тогда

$ clang-check -analyze -extra-arg -Xclang -extra-arg -analyzer-output=text

Как вы написали, документация для этих очень хороших инструментов ужасна. Я булыжник выше созвать вместе из кусочков Обсуждение Чендлера Каррута GoingNative2013.

6

Вы должны использовать scanbuild: http://clang-analyzer.llvm.org/scan-build.html

Вы вводите команды, которые генерируют вашу сборку, но вы предварительно ожидаете их с помощью scan-build.

Пример:
вместо

make

тип

scan-build make

вместо

./configure
make

тип

scan-build ./configure
scan-build make

Очистите сборку перед запуском анализатора, иначе make сообщит, что все уже собрано и анализатор не запустится.

3