如何在 Windows 上使用 Clang 静态分析器?

Flo*_*ers 9 c++ static-analysis clang visual-c++ clang-static-analyzer

我目前正在尝试在 Windows v10.0.18363.720 操作系统上使用 Microsoft Visual C++ 编译器 (MSVC) v19.25.28610.4将Clang Static Analyzer v9.0.1集成到我的CMake v3.16.5 构建系统中。

一切都是为架构 x86_64 构建的。LLVM 和 Clang 是从源代码构建的。

在万维网 (WWW) 上阅读一些内容后,似乎有多种方法可以使用 Clang 静态分析器。遗憾的是,文档很糟糕,而且在 Windows 操作系统上似乎有一些特殊的怪癖(主要与 相关clang-cl),因此集成起来并不简单。IMO,专业程序员将其集成到 C++ 事实标准构建系统中的时间不应超过一小时。

调用 Clang 静态分析器似乎至少有五种可能性:

  1. scan-build 脚本。
    • 需要 Perl 运行时环境。
    • 能够通过一次调用分析多个文件。
    • 能够生成 HTML(比其他可能性更先进)、plist 或 sarif 输出文件。
    • 我的问题:没有检测到任何错误,总是打印scan-build: No bugs found.到 STDOUT。
  2. clang-check 可执行。
    • 需要一个 JSON 编译数据库文件compile_commands.json
    • 能够通过一次调用分析多个文件。
    • 应该能够生成 HTML 报告文件。通过--extra-arg论证。
    • 我的问题:无法使其工作(请参阅下面的第二个脚本)。
  3. clang/clang++可执行文件。
    • 能够通过一次调用分析一个文件。
    • 我的问题:基本上有效,但对我来说似乎是最糟糕的可能性(由于缺少构建信息)。
  4. c++-analyzer.bat/ccc-analyzer.bat批处理脚本。
    • 似乎只支持 Clang 和 GCC。
    • 我的问题:我找不到这些脚本的任何文档。
  5. clang-tidy可执行clang-analyzer-*仅检查。
    • 可以使用 JSON 编译数据库文件compile_commands.json
    • 能够通过一次调用分析多个文件。
    • 我的问题:无法生成 HTML 报告文件,只能生成 YAML。

以下是三个批处理脚本,前三种方法各一个:

  1. scan-build-example.cmd

    @echo off
    setlocal
    cls
    
    rem Configure
    call scan-build.bat^
     -v^
     -v^
     -v^
     -analyze-headers^
     --force-analyze-debug-code^
     -o _scan_build_out^
     --keep-cc^
     --html-title="Scan Build Example"^
     --show-description^
     --use-cc="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64\cl.exe"^
     --use-c++="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64\cl.exe"^
     -stats^
     -maxloop 4^
     -internal-stats^
     --use-analyzer="E:\dev\native\llvm\llvm-9.0.1\Release\static\x64-windows-msvc1924-v142\bin\clang.exe"^
     -analyzer-config stable-report-filename=true^
     -enable-checker core,cplusplus,deadcode,nullability,optin,osx,security,unix,valist^
     cmake^
     -S "D:\cmake\cmake-example-clang-static-analyzer"^
     -B "D:\cmake\cmake-example-clang-static-analyzer\_scan-build"^
     -G "Ninja"^
     -DCMAKE_C_COMPILER:PATH="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64\cl.exe"^
     -DCMAKE_CXX_COMPILER:PATH="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64\cl.exe"^
     -DCMAKE_BUILD_TYPE:STRING=Debug
    
    rem Build
    call scan-build.bat^
     -v^
     -v^
     -v^
     -analyze-headers^
     --force-analyze-debug-code^
     -o _scan_build_out^
     --keep-cc^
     --html-title="Scan Build Example"^
     --show-description^
     --use-cc="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64\cl.exe"^
     --use-c++="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64\cl.exe"^
     -stats^
     -maxloop 4^
     -internal-stats^
     --use-analyzer="E:\dev\native\llvm\llvm-9.0.1\Release\static\x64-windows-msvc1924-v142\bin\clang.exe"^
     -analyzer-config stable-report-filename=true^
     -enable-checker core,cplusplus,deadcode,nullability,optin,osx,security,unix,valist^
     cmake^
     --build "D:\cmake\cmake-example-clang-static-analyzer\_scan-build"^
     --config Debug
    
    Run Code Online (Sandbox Code Playgroud)
  2. clang-check-example.cmd

    @echo off
    setlocal
    cls
    
    set out_dir=%~dp0.\_clang_check_out
    
    mkdir "%out_dir%" > nul 2>&1
    
    rem Issue: "warning: could not create file in 'main.plist': no such file or directory"
    clang-check^
     -analyze^
     -extra-arg=-Xclang^
     -extra-arg=-analyzer-config^
     -extra-arg=-Xclang^
     -extra-arg=add-pop-up-notes=true,mode=deep^
     -extra-arg=-Xclang^
     -extra-arg=-analyzer-checker=core,cplusplus,deadcode,nullability,optin,osx,security,unix,valist^
     -extra-arg=-Xclang^
     -extra-arg=-analyzer-output=html^
     -extra-arg=-o=%out_dir%^
     -p "D:\cmake\cmake-example-clang-static-analyzer\_build"^
     "D:\cmake\cmake-example-clang-static-analyzer\app\main.cpp"
    
    Run Code Online (Sandbox Code Playgroud)
  3. clang_analyze-example.cmd

    @echo off
    setlocal
    cls
    
    set out_dir=%~dp0.\_clang_analyzer_out
    
    mkdir "%out_dir%"
    clang++^
     --analyze^
     -Xanalyzer^
     -analyzer-checker=core,cplusplus,deadcode,nullability,optin,osx,security,unix,valist^
     -Xanalyzer^
     -analyzer-output=html^
     -o "%out_dir%"^
     -I"D:\cmake\cmake-example-clang-static-analyzer\src"^
     "D:\cmake\cmake-example-clang-static-analyzer\app\main.cpp
    
    Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 如何scan-build.bat在 Windows 上工作(我尝试使用 MSVC 和 Clang)?
  2. 如何传递选项以clang-check.exe使其创建 HTML 输出文件并消除warning: could not create file in 'main.plist': no such file or directory警告?
  3. 可以使用clang.exe/clang++.exe一个合适的替代方案(imo,它缺少其他两个非工作替代方案应该可用的构建信息)?

一般而言:在 Windows 上使用 MSVC 使用 Clang 静态分析器生成 HTML 报告的最简单方法是什么?

相关问题:

变更日志:

  • 2020-03-20T12:06Z
    • 更新clang-check-example.cmd脚本。
  • 2020-03-20T08:50Z
    • 添加提及clang-tidy.

归档时间:

查看次数:

2575 次

最近记录:

5 年,4 月 前