标签: clang-tidy

如何在 Windows 上使用和配置 clang-tidy?

我正在尝试使用 clang-tidy 代码分析,以便我可以检查 CppCoreGuidelines。我为 Win 7 64 位下载了 LLVM 7.0.0 预构建二进制文件。我能够用clang成功编译,我做了一个编译这段代码的基本示例,我将源代码命名为test.cpp:

// test.cpp
#include <iostream>

int main(int argc, char const *argv[])
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我在终端运行这个:

clang test.cpp
Run Code Online (Sandbox Code Playgroud)

编译时我得到了这个输出:

test-c4b051.o : warning LNK4217: locally defined symbol __std_terminate imported in function "int `public: static unsigned __int64 __cdecl std::char_traits<char>::length(char const * const)'::`1'::dtor$2" (?dtor$2@?0??length@?$char_traits@D@std@@SA_KQEBD@Z@4HA)
test-c4b051.o : warning LNK4217: locally defined symbol _CxxThrowException imported in function "public: void __cdecl std::ios_base::clear(int,bool)" (?clear@ios_base@std@@QEAAXH_N@Z)
Run Code Online (Sandbox Code Playgroud)

但是它在打印“Hello World”之前运行良好,并且在此之前一切正常,但是当我想运行 clang-tidy 时,我在运行时得到以下输出,我从Extra Clang Tools …

c++ clang clang-tidy

5
推荐指数
1
解决办法
4485
查看次数

clang-tidy 在修复时插入多个“覆盖”说明符

我有这个cmake项目,我想使用clang-tidy. 为了不让同时发生太多事情,我只激活了该modernize-use-override选项。但是,当我应用此方法时:

$> run-clang-tidy  -header-filter='.*'  -checks='-*, modernize-use-override' -fix
Run Code Online (Sandbox Code Playgroud)

到项目中,clang-tidy插入override说明符的多个实例,例如:

void update_sizes() override override override etc.
Run Code Online (Sandbox Code Playgroud)

我尝试遵循此处给出的建议并用于cmake创建 json 编译命令数据库:

$>cmake ../../ -DCMAKE_BUILD_TYPE=debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
Run Code Online (Sandbox Code Playgroud)

我通过将编译器设置为系统范围的默认值(使用)来确保cmake它实际上是在选择clang编译器update-alternative。在这种情况下,cmake生成调用 clang 编译器的 make 文件。

我正在使用 Ubuntu 18.10 和 clang 7。

我也尝试过使用clang-6和设置cmake来生成ninja构建脚本而不是make文件,但结果总是一样的。

在应用修复程序之前,整个项目都可以用gccclang,编译得很好。

请注意,有一个类似的讨论在这里,但是给出的建议有在使用run-clang-tidy.py,这是我在做什么。因此,我不认为这是重复的。

c++ cmake clang clang-tidy

5
推荐指数
1
解决办法
580
查看次数

在哪里可以找到 Clang-tidy“可读性标识符命名”检查器的可用选项列表?

用例

我想为readability-identifier-naming在我的代码库上运行的 clang-tidy配置检查器。

背景

clang-tidy 中的检查器可以提供 CheckOptions,例如:

    clang-tidy -checks='-*,readability-identifier-naming' \ 
    -config="{CheckOptions: [ {key: readability-identifier-naming.ClassCase, value: CamelCase} ]}" main.cpp 
Run Code Online (Sandbox Code Playgroud)

也可以在 .clang-tidy 文件中指定一个选项。

问题

我在哪里可以找到可用选项列表(readability-identifier-naming在这种情况下进行检查),例如ClassCase上面的代码行?

官方文档是不是很具体,只说“很多配置选项,为了能够创建不同类型标识符的不同的规则。”

谷歌搜索结果

我在github上找到了这个页面,它更详细地解释了它(但仍然没有解决问题)。

我还在Microsoft 存储库的文件中找到了一个巨大的列表,但我不知道他们从哪里得到的。

进一步的调查

我想,如果需要,也许 clang-tidy 会放弃所有可能的选项。如果你跑

    clang-tidy -checks=* --dump-config
Run Code Online (Sandbox Code Playgroud)

(或仅指定readability-identifier-naming检查器。这并不重要,输出是相同的)

    clang-tidy -checks='-*,readability-identifier-naming --dump-config
Run Code Online (Sandbox Code Playgroud)

转储的文件只包含一个关于可读性标识符命名的选项,即:

      - key:             readability-identifier-naming.IgnoreFailedSplit   
        value:           '0'
Run Code Online (Sandbox Code Playgroud)

我也试图通过 clang-tidy 源代码,但没有成功。

毕竟

如果有人可以将我指向一个包含所有可用 CheckOptions 列表的地方(如果存在),我将不胜感激。

c++ static-analysis clang llvm-clang clang-tidy

5
推荐指数
1
解决办法
1537
查看次数

cmake + clang_tidy - 禁用检查目录

我有使用 CMake 的大型项目。我想clang_tidy-8使用以下代码添加支持:

set(BORG_CLANG_TIDY OFF CACHE STRING "If enabled, clang-tidy will be used. If set to 'fix', fixes will be done on source")
set_property(CACHE BORG_CLANG_TIDY PROPERTY STRINGS ON OFF fix)
if(BORG_CLANG_TIDY)
    if (BORG_CLANG_TIDY STREQUAL "fix")
        set(maybe_fix -fix)
    endif()

    set(CMAKE_CXX_CLANG_TIDY clang-tidy-8 -extra-arg=-Wno-unknown-warning-option -format-style=file ${maybe_fix} )
endif()
Run Code Online (Sandbox Code Playgroud)

我将适当的.clang-tidy放在项目的根目录中(正确 = 带有所需的检查)。但是,有些目录我不希望 clang tidy 检查/修复(3rdparty 和遗留代码,因为它很脆弱而无法修改)。所以我尝试将空.clang-tidy文件放在这些目录中(empty = with -checks=-*)。这不起作用,因为Error: no checks enabled.

我希望找到一些假货,-checks=-*,hello-world-do-nothing-check但没有任何表现。

还有其他方法可以禁用选定子目录 (/subtrees) 中的检查吗?这些目录是静态的,如果需要,可以在 CMake 中进行硬编码。

c++ cmake clang-tidy

5
推荐指数
1
解决办法
2723
查看次数

Clang-tidy header-filter 正则表达式:Makefile -&gt; .clang-tidy

我正在尝试将硬编码的配置选项clang-tidy从我们的 Makefile 移动到.clang-tidyYAML 文件。截至目前,我们将 run-clang-tidy-6.0.py 称为:

# Run clang-tidy. The header filter includes files in the foo and bar/baz directories
# but it excludes files ending in .g.h (auto-generated headers).
run-clang-tidy-6.0.py -header-filter='.*(foo|bar\/baz).*(?<!\.g\.h)$$' > clang-tidy-output.txt
Run Code Online (Sandbox Code Playgroud)

这工作正常。但是如果我有HeaderFilterRegex: '.*(foo|bar\/baz).*(?<!\.g\.h)$$'in .clang-tidy,过滤就不会按预期工作。

我尝试了围绕哪些字符被转义/未转义的各种事情,因为我知道 Make 和 YAML 有不同的期望,但我无法做到恰到好处。IE:

  • 替换 $$ -> $
  • 双重转义 \ ( \ -> \\)
  • 删除 '\' 有人可以向我解释这个正则表达式在 YAML 文件中的适当格式吗?

非常感激!

regex yaml makefile clang-tidy

5
推荐指数
1
解决办法
2959
查看次数

clang-tidy 无法找到 stdlib 标头

今天我从源代码构建了 clang-tidy,我使用 clang++ 构建了它。构建完成后,我创建了一个指向可执行文件的符号链接,如下所示:

ln -s /path/to/build/bin/clang-tidy /usr/local/bin/clang-tidy
Run Code Online (Sandbox Code Playgroud)

然后我尝试在简单的项目(包含打印 helloworld 代码的单个 .cpp 文件)上使用带有 cmake 的 clang-tidy。这是我的 cmake 文件的样子:

project(Test)
cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
set(CMAKE_CXX_STANDARD 17)
set(CXX_STANDARD_REQUIRED)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(CMAKE_CXX_CLANG_TIDY
  clang-tidy;
  -checks=*;)

add_executable(Test
    helloworld.cpp)
Run Code Online (Sandbox Code Playgroud)

我在某处读到 cmake 的整洁仅适用于 Unix Makefiles & Ninja 生成器(或可能其他一些)。我通常使用 xcode 生成器,但我对这两个不太熟悉,所以我并不真正关心其他人。我已经尝试使用 Unix Makefiles 和 Ninja 生成和构建项目,但是我得到了这个错误:

/Users/xxxxxxx/Dev/VSCodePlayground/helloworld.cpp:2:10: error: 'string' file not found [clang-diagnostic-error]
Run Code Online (Sandbox Code Playgroud)

我找到了一些信息,这可能是因为 clang 找不到 libc++/stdlib 头文件。因此,我尝试了带-v参数的建议编译(成功而没有错误),并在包含目录中获得了此输出:

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks …
Run Code Online (Sandbox Code Playgroud)

macos clang clang-tidy

5
推荐指数
1
解决办法
862
查看次数

我如何告诉 clang-tidy 检查一次编译指示而不是 llvm 风格的标头防护?

我想使用部落整洁。该程序应该检查我是否有标头防护,这就是我设置标志的原因llvm-header-guard。不幸的是,这会检查标头防护是否是 llvm-style,这是我不想要的。我想用#pragma once.

有谁知道如何告诉 clang-tidy 检查#pragma once而不是 llvm 风格的标头防护?

c++ pragma llvm header-files clang-tidy

5
推荐指数
1
解决办法
1751
查看次数

有没有办法为 FetchContent 目标获取 -isystem ?

NO_SYSTEM_FROM_IMPORTED告诉我们IMPORTED目标会自动获取-isystem. 这也适用于使用FetchContent引入项目的目标吗?

如果不是(我认为是因为在获取的目标上出现了 clang-tidy 警告问题),那么获得-isystem此类目标的最佳方法是什么?

cmake include clang-tidy

5
推荐指数
2
解决办法
1344
查看次数

宇宙飞船操作员出现整洁的解析错误

使用clang++-11withlibstdc++-11clang-tidy-11,我在用 linting 代码时遇到了失败clang-tidy- 即在处理众所周知的 sleeper 时出现解析错误std::this_thread::sleep_for(std::chrono::seconds(1));

clang-tidy-11 -header-filter=include/ -p=/tmp/dev/build/bin/aggregation/ -quiet /tmp/de
v/build/aggregation/src/main.cc
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.      Program arguments: clang-tidy-11 -header-filter=include/ -p=/tmp/dev/build/bin/
aggregation/ -quiet /tmp/dev/build/aggregation/src/main.cc
1.      <eof> parser at end of file
2.      While analyzing stack:
        #0 Calling std::chrono::operator<=> at line /usr/include/c++/11/thread:125:6
        #1 Calling std::this_thread::sleep_for at line 159
        #2 Calling main
3.      /usr/include/c++/11/chrono:771:9: Error evaluating statement
4.      /usr/include/c++/11/chrono:771:9: Error evaluating …
Run Code Online (Sandbox Code Playgroud)

c++ clang c++20 clang-tidy

5
推荐指数
1
解决办法
816
查看次数

在启用 c++20 的情况下编译时,clang-tidy 发出警告

我最近更新了我的项目及其 CI 管道以使用 C++20 功能。当我将编译器设置更改为使用 C++20 时,clang-tidy 开始为我检查的所有文件发出以下警告(我将它们视为错误):

error: invalid case style for template parameter 'expr-type' [readability-identifier-naming,-warnings-as-errors]
Run Code Online (Sandbox Code Playgroud)

我可以使用 CMake 和一个 clang-tidy 配置文件将其缩小到以下最小示例:

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(clang_tidy_warning LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(clang_tidy_warning main.cpp)
Run Code Online (Sandbox Code Playgroud)

.clang-tidy

Checks: >
  readability-*,

WarningsAsErrors: '*'

CheckOptions:
  - {key: readability-identifier-naming.TemplateParameterCase,           value: lower_case}
  - {key: readability-identifier-naming.TypeTemplateParameterCase,       value: CamelCase }
  - {key: readability-identifier-naming.TemplateParameterPrefix,         value: t_ }
  - {key: readability-identifier-naming.TypeTemplateParameterPrefix,     value: T_ }
Run Code Online (Sandbox Code Playgroud)

主程序

error: invalid case style for template parameter 'expr-type' [readability-identifier-naming,-warnings-as-errors]
Run Code Online (Sandbox Code Playgroud)

您应该能够在 Ubuntu 20.04 中使用以下命令在根目录中重现它:

mkdir build …
Run Code Online (Sandbox Code Playgroud)

c++ c++20 clang-tidy

5
推荐指数
1
解决办法
162
查看次数