I've added everything to my $PATH
and I've tweaked my SConstruct
to set the appropriate environment variables, as per these answers [ 1, 2, 3 ]. Now when I run
scan-build --use-c++=`which clang++` scons
the build begins, and I can see the process forked by scons
is
/path/to/c++-analyzer ... -std=c++11 ...
The object file successfully builds, but then I get an error:
could not find clang line
This error occurs in c++-analyzer
when the forked process does not contain the string -cc1
. But if I check ps aux
, I clearly see
/path/to/clang -cc1 ...
How could the program build properly but the static analyzer fail like this?
For reference, if I manually run
scan-build clang++ <parameters from scons>
then the build succeeds and the report is generated!
I can also "cheat" by adding
env["ENV"]["PATH"] = os.environ["PATH"]
and then running
CXX="scan-build clang++" scons
I just can't run scan-build
on scons
itself with an unmodified SConstruct
.
The problem is that clang is not on the search path in the execution environment (Wayback Machine). This explains why adding the line env["ENV"]["PATH"] = os.environ["PATH"]
solves the issue.
To run scan-build
on an unmodified SConstruct
you can put the clang executable (clang++
and possibly clang
) on the search path used by the execution environment, e.g. by creating a symbolic link from /usr/bin/clang++
to your /path/to/clang++
on Linux.
I had the identical problem: the object file successfully builds, but then I got the error:
could not find clang line
The problem was that I was using a flag valid for gcc
but invalid for 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'
...
Removing the -fdiagnostics-show-caret
makes the problem go away:
scan-build gcc -c empty.c
scan-build: Using '/usr/bin/clang-8.exe' for static analysis
...
Also, to muddy the waters, clang
's name for this switch is -fcaret-diagnostics
, which gcc
will not accept.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With