如何在 Windows 上使用 Clang Static Analyzer?

How-to use Clang Static Analyzer on Windows?

提问人:Florian Wolters 提问时间:3/20/2020 最后编辑:Florian Wolters 更新时间:6/9/2020 访问量:6027

问:

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

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

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

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

  1. scan-build脚本。
    • 需要 Perl 运行时环境。
    • 能够通过一次调用分析多个文件。
    • 能够生成 HTML(比其他可能性更先进)、plist 或 sarif 输出文件。
    • 我的问题:不检测任何错误,始终打印到 STDOUT。scan-build: No bugs found.
  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
    
  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"
    
  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
    

我的问题是:

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

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

相关问题:

更新日志:

  • 2020-03-20T12:06Z
    • 更新脚本。clang-check-example.cmd
  • 2020-03-20T08:50Z
    • 添加对 的提及。clang-tidy
C clang 静态分析 clang-static-analyzer

评论

0赞 M.M 5/22/2020
如果程序不需要 Windows 标头,则可以从 MSYS2 运行 clang-tidy
1赞 Jetski S-type 8/11/2020
相关新闻: stackoverflow.com/questions/32280717/...与其在 CMake 中启动编译器,不如让它启动 clang-tidy。
0赞 Kargath 11/23/2023
有关如何在 Visual Studio 中使用 llvm 相关软件的潜在有用链接 youtube.com/watch?v=zMrP8heIz3g

答: 暂无答案