clang-tidy 10 忽略了我的 NOLINT 命令
clang-tidy 10 is ignoring my NOLINT commands
clang-tidy
v10.0.0 似乎忽略了我的 NOLINT
或 NOLINTNEXTLINE
指令。使用这个简单的 compile_commands.json
:
[
{
"directory": "/home/cmannett85/workspace/scratch/build",
"command": "/usr/lib/ccache/g++-10 -g -Werror -Wall -Wextra -std=c++2a -o main.cpp.o -c /home/cmannett85/workspace/scratch/main.cpp",
"file": "/home/cmannett85/workspace/scratch/main.cpp"
}
]
还有这个微不足道的源文件:
#include <ranges>
#include <vector>
#include <iostream>
int main()
{
auto v = std::vector{0, 1, 2, 3, 4};
for (auto i : v | std::views::reverse) { // NOLINT
std::cout << i << std::endl;
}
return EXIT_SUCCESS;
}
产生此 clang-tidy
输出:
$ clang-tidy -p . --quiet ./main.cpp
2 warnings and 6 errors generated.
Error while processing /home/cmannett85/workspace/scratch/main.cpp.
/home/cmannett85/workspace/scratch/main.cpp:8:21: error: invalid operands to binary expression ('std::vector<int, std::allocator<int> >' and 'const __adaptor::_RangeAdaptorClosure<(lambda at /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/ranges:3280:9)>' (aka 'const std::ranges::views::__adaptor::_RangeAdaptorClosure<std::ranges::views::(lambda at /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/ranges:3280:9)>')) [clang-diagnostic-error]
for (auto i : v | std::views::reverse) { // NOLINT
...
现在我可以原谅虚假错误,因为它可能缺乏 C++20 范围支持,因为它太新了,但为什么 clang-tidy
忽略了我的 NOLINT
指令?
clang-tidy
程序有时会出现误报,或者以其他方式识别可能(给定您的平台)可能不一定符合标准的已知实现定义行为的问题区域。
您可以让 clang-tidy
通过传入命令行定义忽略这些部分,例如 -DCLANG_TIDY
,然后使用 #ifndef CLANG_TIDY
... #endif
块在您希望 clang-tidy
忽略的代码中。
这是一个实用的解决方法。
clang-tidy
v10.0.0 似乎忽略了我的 NOLINT
或 NOLINTNEXTLINE
指令。使用这个简单的 compile_commands.json
:
[
{
"directory": "/home/cmannett85/workspace/scratch/build",
"command": "/usr/lib/ccache/g++-10 -g -Werror -Wall -Wextra -std=c++2a -o main.cpp.o -c /home/cmannett85/workspace/scratch/main.cpp",
"file": "/home/cmannett85/workspace/scratch/main.cpp"
}
]
还有这个微不足道的源文件:
#include <ranges>
#include <vector>
#include <iostream>
int main()
{
auto v = std::vector{0, 1, 2, 3, 4};
for (auto i : v | std::views::reverse) { // NOLINT
std::cout << i << std::endl;
}
return EXIT_SUCCESS;
}
产生此 clang-tidy
输出:
$ clang-tidy -p . --quiet ./main.cpp
2 warnings and 6 errors generated.
Error while processing /home/cmannett85/workspace/scratch/main.cpp.
/home/cmannett85/workspace/scratch/main.cpp:8:21: error: invalid operands to binary expression ('std::vector<int, std::allocator<int> >' and 'const __adaptor::_RangeAdaptorClosure<(lambda at /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/ranges:3280:9)>' (aka 'const std::ranges::views::__adaptor::_RangeAdaptorClosure<std::ranges::views::(lambda at /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/ranges:3280:9)>')) [clang-diagnostic-error]
for (auto i : v | std::views::reverse) { // NOLINT
...
现在我可以原谅虚假错误,因为它可能缺乏 C++20 范围支持,因为它太新了,但为什么 clang-tidy
忽略了我的 NOLINT
指令?
clang-tidy
程序有时会出现误报,或者以其他方式识别可能(给定您的平台)可能不一定符合标准的已知实现定义行为的问题区域。
您可以让 clang-tidy
通过传入命令行定义忽略这些部分,例如 -DCLANG_TIDY
,然后使用 #ifndef CLANG_TIDY
... #endif
块在您希望 clang-tidy
忽略的代码中。
这是一个实用的解决方法。