首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Clang的“扫描-构建”utilite与“make”不兼容。

Clang的“扫描-构建”utilite与“make”不兼容。
EN

Stack Overflow用户
提问于 2019-05-30 11:18:30
回答 1查看 2K关注 0票数 3

我试图通过Clang的静态代码分析器工具scan-build静态地分析我的代码,当我使用scan-build g++命令运行代码时,它为我提供了一个bug报告,但是当我试图对CMake和scan-build make命令做同样的事情时,它告诉我没有发现任何bug。

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

  • Clang版本8.0.0 (标记/Release800/final)
  • Gcc版本7.4.0 (Ubuntu 7.4.0-1 ubuntu1~18.04)

下面是一个简单的例子。

CMakeLists.txt

代码语言:javascript
复制
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

代码语言:javascript
复制
#include <iostream>

int main()
{
    int *a;
    std::cout << a << std::endl;
}

当前行为g++:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-02 10:46:05

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

有几种方法可以做到。在不深入讨论其他方法的细节的情况下,下面是scan-build如何做到的。它用包装器可执行文件替换真正的编译器,接收来自构建系统的所有编译器命令,完成它的工作,并将所有相同的选项转发给真正的编译器。

这就是为什么CMakeLists.txt文件中用于编译器的直接SET命令阻止了scan-build发挥它的作用。它将与gcc和clang一起工作,但是您不应该硬编码它们,而应该使用CCCXX环境变量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56377277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档