Използване на компилацията за сканиране на 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-antidepressant Вече използвам променливите на средата, които Грег предлага. Мога да изграждам чрез Clang и SCons съвсем добре; Не мога да стартирам статичния анализатор.   -  person chrisaycock    schedule 14.03.2013
comment
Хм, опитайте с scan-build --use-analyzer=/path/to/clang   -  person Industrial-antidepressant    schedule 14.03.2013
comment
@Industrial-antidepressant --use-analyzer не е призната опция за scan-build.   -  person chrisaycock    schedule 16.03.2013
comment
тази опция беше добавена към clang в петък, 24 август 23:08:08 2012 г. с commit msg Преработете как сканирането избира версията на clang, която да се използва за статичен анализ, и пусната с clang 3.2   -  person Industrial-antidepressant    schedule 16.03.2013
comment
@Industrial-antidepressant Най-накрая получих 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