Статический анализатор clang не может найти stdio.h

Я пытаюсь использовать статический анализатор Clang в очень простой программе:

#include <stdio.h>
main ()
{
    printf("Hello, world !");
}

Когда я делаю

clang 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

ничего не печатает.


В чем проблема и как ее исправить? Я предполагаю, что статический анализатор не видит файлы заголовков, хотя компилятор может их использовать. Пожалуйста помогите.


person evocatus    schedule 07.06.2016    source источник
comment
Я использую Debian 8, gcc 4.7.4, clang 3.4.1   -  person evocatus    schedule 07.06.2016
comment
похоже, что последний фрагмент кода (с использованием драйвера clang) работает правильно - я тестировал его на ошибочном коде отсюда: stackoverflow.com/a / 3486939/1301604   -  person evocatus    schedule 07.06.2016


Ответы (2)


Иногда средство проверки не может прочитать путь включения по умолчанию. Так что вы можете передать это как аргумент. Вы можете найти точный путь включения, на который смотрит clang, используя эту команду:

clang -E -x c - -v < /dev/null

и тогда ваш последний запрос станет:

clang -I<path to include> --analyze -Xanalyzer -analyzer-checker=unix helloworld.c
person Nishant Sharma    schedule 13.06.2016

Решение с использованием флага -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

по использованию zsh,

$ clang -cc1 ${=MY_INCLUDES} -analyze -analyzer-checker=debug.DumpCFG main.c

Обратите внимание на использование MY_INCLUDES после -cc1, но перед файлом main.c. Более того, на zsh нужно использовать префикс = с переменной env, иначе он будет считаться одной строкой (подробности см. В этом ответе).

person codeman48    schedule 25.12.2018