Clang 的 'scan-build' 实用程序不适用于 'make'
Clang's 'scan-build' utilite does not work with 'make'
我正在尝试通过 Clang 的静态代码分析器工具 scan-build
静态分析我的代码,当我使用 运行 命令 scan-build g++
代码时,它向我提供了错误报告,但是当我尝试用 CMake 和 scan-build make
命令做同样的事情时,它告诉我没有发现错误。
我已经尝试用 bash 导出命令替换 CC
和 CXX
变量,使用 --use_cc
和 --use_c++
标志并构建单独的目标使用 scan-build make TARGET
。所有这些都没有让我找到正确的解决方案,恐怕 scan-build
无法与 CMake/make.
一起使用
- Clang 版本 8.0.0 (tags/RELEASE_800/final)
- Gcc 版本 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04)
这是一个简单的例子。
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
set(CMAKE_C_COMPILER "usr/bin/clang")
set(CMAKE_CXX_COMPILER "usr/bin/clang++")
set(CMAKE_AR "usr/bin/llvm-ar")
set(CMAKE_LINKER "usr/bin/llvm-ld")
set(CMAKE_NM "usr/bin/llvm-nm")
set(CMAKE_OBJDUMP "usr/bin/llvm-objdump")
set(CMAKE_RANLIB "usr/bin/llvm-ranlib")
project(scan-build-test)
add_executable(${PROJECT_NAME} main.cpp)
main.cpp
#include <iostream>
int main()
{
int *a;
std::cout << a << std::endl;
}
当前行为 g++:
scan-build g++ main.cpp -o main
scan-build: Using 'usr/bin/clang-8' for static analysis main.cpp:6:2: warning: 1st function call argument is an uninitialized value
std::cout << a << std::endl;
^~~~~~~~~~~~~~
1 warning generated.
scan-build: 1 bug found.
scan-build: Run 'scan-view /tmp/scan-build-2019-05-30-134021-30676-1' to examine bug reports.`
当前行为 CMake & make:
cmake .
scan-build make
scan-build: Using 'usr/bin/clang-8' for static analysis
[ 50%] Building CXX object CMakeFiles/scan-build-test.dir/main.cpp.o
[100%] Linking CXX executable scan-build-test
[100%] Built target scan-build-test
scan-build: Removing directory '/tmp/scan-build-2019-05-30-134302-30720-1' because it contains no reports.
scan-build: No bugs found.
C/C++ 的所有静态分析(和其他源代码相关)工具都需要为项目中的每个源文件复制编译过程。为了让一切正确,他们需要拥有在实际编译期间使用的所有编译选项(如宏定义和包含目录)。
有几种方法可以做到。在不深入了解其他方法的情况下,以下是 scan-build
的做法。
它用它的包装器可执行文件替换真正的编译器,从构建系统接收所有编译器命令,完成它的工作并将所有相同的选项转发给真正的编译器。
这就是为什么在您的 CMakeLists.txt
文件中为编译器直接使用 SET 命令会阻止 scan-build
发挥它的作用。它适用于 gcc 和 clang,但你不应该对它们进行硬编码并使用 CC
和 CXX
环境变量相反。
我正在尝试通过 Clang 的静态代码分析器工具 scan-build
静态分析我的代码,当我使用 运行 命令 scan-build g++
代码时,它向我提供了错误报告,但是当我尝试用 CMake 和 scan-build make
命令做同样的事情时,它告诉我没有发现错误。
我已经尝试用 bash 导出命令替换 CC
和 CXX
变量,使用 --use_cc
和 --use_c++
标志并构建单独的目标使用 scan-build make TARGET
。所有这些都没有让我找到正确的解决方案,恐怕 scan-build
无法与 CMake/make.
- Clang 版本 8.0.0 (tags/RELEASE_800/final)
- Gcc 版本 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04)
这是一个简单的例子。
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
set(CMAKE_C_COMPILER "usr/bin/clang")
set(CMAKE_CXX_COMPILER "usr/bin/clang++")
set(CMAKE_AR "usr/bin/llvm-ar")
set(CMAKE_LINKER "usr/bin/llvm-ld")
set(CMAKE_NM "usr/bin/llvm-nm")
set(CMAKE_OBJDUMP "usr/bin/llvm-objdump")
set(CMAKE_RANLIB "usr/bin/llvm-ranlib")
project(scan-build-test)
add_executable(${PROJECT_NAME} main.cpp)
main.cpp
#include <iostream>
int main()
{
int *a;
std::cout << a << std::endl;
}
当前行为 g++:
scan-build g++ main.cpp -o main
scan-build: Using 'usr/bin/clang-8' for static analysis main.cpp:6:2: warning: 1st function call argument is an uninitialized value
std::cout << a << std::endl;
^~~~~~~~~~~~~~
1 warning generated.
scan-build: 1 bug found.
scan-build: Run 'scan-view /tmp/scan-build-2019-05-30-134021-30676-1' to examine bug reports.`
当前行为 CMake & make:
cmake .
scan-build make
scan-build: Using 'usr/bin/clang-8' for static analysis
[ 50%] Building CXX object CMakeFiles/scan-build-test.dir/main.cpp.o
[100%] Linking CXX executable scan-build-test
[100%] Built target scan-build-test
scan-build: Removing directory '/tmp/scan-build-2019-05-30-134302-30720-1' because it contains no reports.
scan-build: No bugs found.
C/C++ 的所有静态分析(和其他源代码相关)工具都需要为项目中的每个源文件复制编译过程。为了让一切正确,他们需要拥有在实际编译期间使用的所有编译选项(如宏定义和包含目录)。
有几种方法可以做到。在不深入了解其他方法的情况下,以下是 scan-build
的做法。
它用它的包装器可执行文件替换真正的编译器,从构建系统接收所有编译器命令,完成它的工作并将所有相同的选项转发给真正的编译器。
这就是为什么在您的 CMakeLists.txt
文件中为编译器直接使用 SET 命令会阻止 scan-build
发挥它的作用。它适用于 gcc 和 clang,但你不应该对它们进行硬编码并使用 CC
和 CXX
环境变量相反。