Как заставить 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, который показывает шаги работы, просматриваемые в веб-браузере:

screenshot

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

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

(Я заметил, что документация GCC очень отличная, но документация Clang/LLVM очень плохая. Я пробовал "clang -analyze -Xanalyzer" -v "как удар в темноте, чтобы сообщить анализатору быть более подробным - переключатель -Xanalyzer был с man-страниц.)

Ответ 1

В дополнение к текстовому выводу на консоли:

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

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

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

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

-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 < Название опции >= <Value>

например.

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

make

тип

scan-build make

вместо

./configure
make

тип

scan-build ./configure
scan-build make

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