clang静态分析器(scan-build)能与cmake --build一起使用吗?

13
我希望您能使用clang静态分析器命令行工具scan-build,并且方便地使用cmake --build。大多数我在网上找到的资源似乎都表明您需要进行两个步骤:首先
scan-build cmake .
scan-build make

例如,对于这个有错误的小程序,scan-build 可以捕获到它:
#include <iostream>

int fun() {
    int x;
    return x; # main.cpp:5:5: warning: Undefined or garbage value returned to caller

}

int main() {
    int a = fun();

    std::cout << "Hello, World! " << a << std::endl;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project(test_program)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
add_executable(test_program ${SOURCE_FILES})

如果我运行scan-build cmake --build cmake-build-release/,即使已经构建了二进制文件,也无法找到错误。有没有办法让scan-build在与CMake的一步处理中工作?

你可以通过使用自定义目标和 clang --build <dir> --target <tgt> 命令来达到你想要的效果。但为什么浪费时间呢?只需在两个 scan-build 步骤周围加上包装器即可。 - nega
我也喜欢使用 cmake --build,因为它可以将所有生成的文件都整齐地放在一个文件夹中,而不是把它们全部放在项目的根目录下。 - phoenix
你也可以在不使用 --build 的情况下控制它。我将源代码和构建目录放在一起。这样,你只需要执行 cd myproj/build; cmake ../src/ 即可。 - nega
你应该使用源代码外构建。在源代码目录中拥有文件并不是一个好的理由。 - usr1234567
1个回答

7
如果您想使用Clang静态分析程序,只需设置CMAKE_EXPORT_COMPILE_COMMANDS=YES。这将创建一个编译数据库,供CSA读取。您甚至不需要构建项目。该文件位于:/path/to/build/compile_commands.jsonscan-build是为无法自行创建编译数据库的项目设计的。
然后,您可以运行:
analyze-build --cdb /path/to/build/compile_commands.json \
              --use-analyzer /path/to/clang \
              --output /path/to/output

值得注意的是,clang-tidy 现在拥有所有的 CSA 检查。您可以使用相同的编译数据库技术来对您的代码库运行 clang-tidy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接