我正在尝试使用 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 …
我有这个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文件,但结果总是一样的。
在应用修复程序之前,整个项目都可以用gcc和clang,编译得很好。
请注意,有一个类似的讨论在这里,但是给出的建议有在使用run-clang-tidy.py,这是我在做什么。因此,我不认为这是重复的。
我想为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 列表的地方(如果存在),我将不胜感激。
我有使用 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 中进行硬编码。
我正在尝试将硬编码的配置选项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:
非常感激!
今天我从源代码构建了 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) 我想使用部落整洁。该程序应该检查我是否有标头防护,这就是我设置标志的原因llvm-header-guard。不幸的是,这会检查标头防护是否是 llvm-style,这是我不想要的。我想用#pragma once.
有谁知道如何告诉 clang-tidy 检查#pragma once而不是 llvm 风格的标头防护?
NO_SYSTEM_FROM_IMPORTED告诉我们IMPORTED目标会自动获取-isystem. 这也适用于使用FetchContent引入项目的目标吗?
如果不是(我认为是因为在获取的目标上出现了 clang-tidy 警告问题),那么获得-isystem此类目标的最佳方法是什么?
使用clang++-11withlibstdc++-11和clang-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) 我最近更新了我的项目及其 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) clang-tidy ×10
c++ ×7
clang ×5
cmake ×3
c++20 ×2
header-files ×1
include ×1
llvm ×1
llvm-clang ×1
macos ×1
makefile ×1
pragma ×1
regex ×1
yaml ×1