clang-tidy 10 игнорирует мои команды NOLINT - PullRequest
2 голосов
/ 10 июля 2020

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?

1 Ответ

2 голосов
/ 10 июля 2020

Программа clang-tidy может иногда выдавать ложные срабатывания или иным образом определять проблемные c области, которые, возможно (с учетом вашей платформы), являются известным поведением, определяемым реализацией, которое не обязательно соответствует стандарту.

Вы можете clang-tidy игнорировать эти разделы, передав определение командной строки, например -DCLANG_TIDY, а затем использовать в коде блоки #ifndef CLANG_TIDY ... #endif, которые вы хотите, чтобы clang-tidy игнорировал.

Это прагматичный c обходной путь.

...