Clang статический анализатор не может найти stdio.h
Я пытаюсь использовать статический анализатор Clang в очень простой программе:
#include <stdio.h>
main ()
{
printf("Hello, world !");
}
Когда я делаю
лязг helloworld.c
Он успешно компилирует программу.
Когда я делаю
clang -cc1 -analyze -analyzer-checker=unix helloworld.c
это вызывает ошибку:
helloworld.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
^
1 error generated.
clang --analyze -Xanalyzer -analyzer-checker = unix helloworld.c
ничего не печатает.
В чем проблема и как я могу это исправить? Я предполагаю, что статический анализатор не видит файлы заголовков, хотя компилятор может их использовать. Пожалуйста, помогите мне.
1 ответ
Иногда средство проверки не может прочитать путь включения по умолчанию. Таким образом, вы можете передать это в качестве аргумента. С помощью этой команды вы можете найти точный взгляд на включаемый путь, который просматривает Clang:
clang -E -x c - -v < /dev/null
и тогда ваш последний запрос станет:
clang -I<path to include> --analyze -Xanalyzer -analyzer-checker=unix helloworld.c
Решение с использованием -cc1
флаг:
Посмотрите, что включает в себя пути, которые получает Clang. Флаг -v
это ключевой вариант. Быстрый способ его использования заключается в следующем (как указано @Nishant) вместе с образцами включаемых путей, которые он печатает,
$ clang -E -x c - -v < /dev/null
...
#include <...> search starts here:
/usr/local/include
/home/codeman/.itsoflife/local/packages-live/llvm-clang6/build/lib/clang/6.0.1/include
/usr/include/x86_64-linux-gnu
/usr/include
...
На моей машине простое использование следующей команды работает без проблем,
$ clang --analyze -Xanalyzer -analyzer-checker=debug.DumpCFG main.c
однако следующая форма не работает, как вы указали,
$ clang -cc1 -analyze -analyzer-checker=debug.DumpCFG main.c
Для этой второй команды (с -cc1
) вы можете создать переменную среды скажем MY_INCLUDES
с необходимыми включает. Вставьте приведенный ниже код (с необходимыми путями включения в соответствии с вашей системой) в ~/.bashrc
или же ~/.zshrc
в зависимости от того, если вы используете bash
или же zsh
, (не забудьте source ~/.bashrc
или же source ~/.zshrc
)
export MY_INCLUDES="-I/usr/local/include -I/home/codeman/.itsoflife/local/packages-live/llvm-clang6/build/lib/clang/6.0.1/include -I/usr/include/x86_64-linux-gnu -I/usr/include"
Теперь на bash,
$ clang -cc1 $MY_INCLUDES -analyze -analyzer-checker=debug.DumpCFG main.c
по зш использования,
$ clang -cc1 ${=MY_INCLUDES} -analyze -analyzer-checker=debug.DumpCFG main.c
Обратите внимание на использование MY_INCLUDES
после -cc1
но до main.c
файл. Кроме того, на zsh
нужно использовать =
префикс с переменной env, иначе она считается одной строкой (подробности см. в этом ответе).