Я использую 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 был из справочных страниц.)
Помимо вывода текста на консоль:
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
Вы на правильном пути, но чтобы получить полную трассировку, ведущую к ошибке, вам дополнительно нужно попросить clang для вывода в текстовом формате (не спрашивайте почему). Так как вам, вероятно, нужно будет настроить, например, Включите пути или определения для вашего проекта, так или иначе, я бы предложил вам использовать clang-check
который действует как обертка вокруг прохода анализатора Clang. Он также может подключаться к инструментам статического анализатора, например, scan-build
, Вы можете тогда
$ clang-check -analyze -extra-arg -Xclang -extra-arg -analyzer-output=text
Как вы написали, документация для этих очень хороших инструментов ужасна. Я булыжник выше созвать вместе из кусочков Обсуждение Чендлера Каррута GoingNative2013.
Вы должны использовать scanbuild: http://clang-analyzer.llvm.org/scan-build.html
Вы вводите команды, которые генерируют вашу сборку, но вы предварительно ожидаете их с помощью scan-build.
Пример:
вместо
make
тип
scan-build make
вместо
./configure
make
тип
scan-build ./configure
scan-build make
Очистите сборку перед запуском анализатора, иначе make сообщит, что все уже собрано и анализатор не запустится.