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

У меня есть проект, я построил его с помощью компилятора 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"
}
]

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

Ответы [ 2 ]

1 голос
/ 15 февраля 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
1 голос
/ 15 февраля 2020

Это не простая ошибка как таковая. Clang-Diagnostti c -error - это ошибка компилятора. Clang сделал неизвестные аргументы серьезной ошибкой когда-то go, и это не может быть превращено в предупреждение. Раньше были -Qunused-arguments, но в AFAIK Clang 11 это не работает.

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

...