Clang的“ scan-build”工具不适用于“ make”

时间:2019-05-30 11:18:30

标签: gcc cmake clang scan-build

我正在尝试通过Clang的静态代码分析器工具scan-build来静态分析我的代码,当我使用scan-build g++命令运行代码时,它会为我提供一个错误报告,但是当我尝试用CMake和scan-build make命令执行相同的操作,它告诉我没有发现错误。

我已经尝试用bash export命令替换CCCXX变量,使用--use_cc--use_c++标志,并使用scan-build make TARGET建立单独的目标。所有这些都无法引导我找到正确的解决方案,而且我担心scan-build无法与CMake / make配合使用。

  • Clang版本8.0.0(标签/ 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.

1 个答案:

答案 0 :(得分:0)

所有用于C / C ++的静态分析(以及其他与源代码相关的工具)都需要为项目中的每个源文件复制编译过程。为了使一切正确,他们需要拥有在实际编译期间使用的所有编译选项(例如宏定义和包含目录)。

有几种方法可以做到这一点。在不深入了解其他方法的情况下,这里是scan-build的工作方式。 它用包装的可执行文件代替真正的编译器,从构建系统接收所有编译器命令,执行其工作并将所有相同的选项转发给真正的编译器。

这就是为什么CMakeLists.txt文件中用于编译器的直接SET命令阻止scan-build发挥作用的原因。它可以同时用于 gcc clang ,但是您不应该对其进行硬编码,而应使用CCCXX环境变量。