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, иначе она считается одной строкой (подробности см. в этом ответе).

Другие вопросы по тегам