clang-tidy сообщает об ошибке неизвестного аргумента, если содержит другие параметры компилятора

У меня есть проект, я собрал его компилятором Intel. Я хочу использовать clang-tidy для обнаружения проблем с кодом.

Я использую CMake для создания compile_commands.json и получаю следующую ошибку при использовании clang-tidy:

$ run-clang-tidy
# output
# ...
clang-tidy-6.0 -header-filter=^/home/xuhui/temp/build/.* -p=/home/xuhui/temp/build /home/xuhui/temp/main.cpp
1 warning and 1 error generated.
Error while processing /home/xuhui/temp/main.cpp.
error: unknown argument: '-w2' [clang-diagnostic-error]
warning: unknown warning option '-Wno-maybe-uninitialized'; did you mean '-Wno-uninitialized'? [clang-diagnostic-unknown-warning-option]

На самом деле существует очень похожий вопрос: clang-tidy сообщает о неизвестных предупреждениях

Однако, когда я пытаюсь использовать метод, упомянутый выше, это не помогает. Предупреждение можно подавить, но ошибка все еще существует.

$ run-clang-tidy -extra-arg=-Wno-unknown-warning-option

# output
# ...
clang-tidy-6.0 -header-filter=^/home/xuhui/temp/build/.* -extra-arg=-Wno-unknown-warning-option -p=/home/xuhui/temp/build /home/xuhui/temp/main.cpp
1 error generated.
Error while processing /home/xuhui/temp/main.cpp.
error: unknown argument: '-w2' [clang-diagnostic-error]

Как я могу справиться с ошибкой?

-w2 параметры используются для управления предупреждениями в компиляторе Intel.

Хотя проблема возникает у меня из-за компилятора Intel, но могут быть и другие параметры компилятора, которые также могут привести к проблеме.

Приложение

Следующие фрагменты кода могут помочь воспроизвести проблему.

// CMakeLists.txt
SET(CMAKE_CXX_COMPILER "icc")
SET(CMAKE_CXX_COMPILER "icpc")

project(test)

# leads to warning, can be settled by refer link
add_compile_options("-Wno-maybe-uninitialized")

# leads to error, can not be settled by refer link
add_compile_options("-w2")

add_executable(a.out main.cpp)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
// main.cpp
#include <iostream>
int main()
{
    std::cout << "hello!" << std::endl;
    return 0;
}

приведенный выше код может генерировать compile_commands.json следующим образом:

[
{
  "directory": "/home/xuhui/temp/build",
  "command": "/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc      -Wno-maybe-uninitialized -w2 -o CMakeFiles/a.out.dir/main.o -c /home/xuhui/temp/main.cpp",
  "file": "/home/xuhui/temp/main.cpp"
}
]

Спасибо за ваше время.


person Xu Hui    schedule 14.02.2020    source источник


Ответы (2)


Это не ошибка аккуратности как таковая. Clang-diagnostic-error — это, по сути, ошибка компилятора. Некоторое время назад Clang сделал неизвестные аргументы серьезной ошибкой, и она не может быть понижена до предупреждения. Раньше были аргументы -Qunused-, но они не работают в Clang 11 AFAIK.

Вам нужно будет удалить аргумент перед передачей команд компиляции в clang-tidy, я предлагаю CMake — удалить флаг компиляции для одной единицы перевода.

person pablo285    schedule 14.02.2020

@ pablo285 уже дал идеальный ответ. Он сказал, что:

необходимо удалить аргумент перед передачей команд компиляции в clang-tidy

Он уже предоставил ссылку, чтобы продемонстрировать, как изменить CMakeLists.txt, чтобы удалить аргумент.

Кроме того, мы можем внести некоторые изменения непосредственно в compile_commands.json, чтобы удалить аргумент.

Скрипт для очистки кода можно написать следующим образом:

# tidy_code.sh

cd build
cmake ..

# do modification on compile_commands.json to remove argument which clang can not recognized
# replace '-w2' to ' '
sed -i 's/-w2/ /g' compile_commands.json

# using clang tidy 
run-clang-tidy -checks='*' -extra-arg=-Wno-unknown-warning-option
person Xu Hui    schedule 15.02.2020