Использование сканирования-сборки Clang с помощью scons и C++11

Я добавил все в свой $PATH и настроил свой SConstruct, чтобы установить соответствующие переменные среды в соответствии с этими ответами [ 1, 2, 3 ]. Теперь, когда я бегу

scan-build --use-c++=`which clang++` scons

начинается сборка, и я вижу, что процесс, разветвленный scons,

/path/to/c++-analyzer ... -std=c++11 ...

Объектный файл успешно создается, но затем я получаю сообщение об ошибке:

could not find clang line

Эта ошибка возникает в c++-analyzer, когда разветвленный процесс не содержит строку -cc1. Но если я проверю ps aux, я ясно увижу

/path/to/clang -cc1 ...

Как программа могла собраться правильно, но статический анализатор так не справился?


Для справки, если я вручную запускаю

scan-build clang++ <parameters from scons>

затем сборка завершается успешно, и отчет создается!

Я также могу «обмануть», добавив

env["ENV"]["PATH"] = os.environ["PATH"]

а потом бег

CXX="scan-build clang++" scons

Я просто не могу запустить scan-build на самом scons с немодифицированным SConstruct.


person chrisaycock    schedule 06.12.2012    source источник
comment
Ответ на ваш вопрос дан в первом связанном ответе: SCons обычно очищает среду перед запуском сборки (это функция).   -  person Industrial-antidepressant    schedule 14.03.2013
comment
@Industrial-антидепрессант Я уже использую переменные среды, которые предлагает Грег. Я прекрасно могу сборить через Clang и SCons; Я не могу запустить статический анализатор.   -  person chrisaycock    schedule 14.03.2013
comment
Хм, попробуйте с помощью scan-build --use-analyzer=/path/to/clang   -  person Industrial-antidepressant    schedule 14.03.2013
comment
@Промышленный антидепрессант --use-analyzer не является признанным вариантом для scan-build.   -  person chrisaycock    schedule 16.03.2013
comment
эта опция была добавлена ​​​​в clang в пятницу, 24 августа, 23:08:08 2012 г., с сообщением о коммите. Переработано, как scan-build выбирает версию clang для использования для статического анализа, и выпущен с clang 3.2.   -  person Industrial-antidepressant    schedule 16.03.2013
comment
@Industrial-антидепрессант Наконец-то я получил Clang 3.2 и попробовал --use-analyzer. Я все еще получаю ту же ошибку. Все равно спасибо.   -  person chrisaycock    schedule 26.03.2013
comment
Интересно... Я вручную скомпилировал и установил clang, и у меня такое же сообщение об ошибке, но я использовал не scons, а аналогичный, называемый waf. Я должен использовать --use-analyzer=/path/to/clang, и этот путь должен содержать сам двоичный файл, а не только путь.   -  person Industrial-antidepressant    schedule 26.03.2013


Ответы (2)


Проблема в том, что clang не находится на пути поиска в файле среда выполнения (Wayback Machine). Это объясняет, почему добавление строки env["ENV"]["PATH"] = os.environ["PATH"] решает проблему.

Чтобы запустить scan-build на немодифицированном SConstruct, вы можете поместить исполняемый файл clang (clang++ и, возможно, clang) в путь поиска, используемый средой выполнения, например. создав символическую ссылку с /usr/bin/clang++ на ваш /path/to/clang++ в Linux.

person vitaut    schedule 20.12.2013

У меня была идентичная проблема: объектный файл успешно строится, но потом я получил ошибку:

could not find clang line

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

touch empty.c

scan-build gcc -fdiagnostics-show-caret -c empty.c
scan-build: Using '/usr/bin/clang-8.exe' for static analysis
could not find clang line
...

scan-build --use-cc=clang gcc -fdiagnostics-show-caret -c empty.c
scan-build: Using '/usr/bin/clang-8.exe' for static analysis
clang-8: error: unknown argument: '-fdiagnostics-show-caret'
...

Удаление -fdiagnostics-show-caret устраняет проблему:

scan-build gcc -c empty.c
scan-build: Using '/usr/bin/clang-8.exe' for static analysis
...

Кроме того, чтобы замутить воду, имя clang для этого переключателя - -fcaret-diagnostics, которое gcc не примет.

person Joseph Quinsey    schedule 31.05.2021
comment
Редактировать: я должен отметить, что scan-build -v -v -v здесь показано лишь минимальное количество информации, и это бесполезно. - person Joseph Quinsey; 03.06.2021