当包含其他编译器选项时,clang-tidy 报告错误未知参数
clang-tidy report error unknown argument when contain other compiler options
我有一个项目,我用英特尔编译器构建了它。我想使用 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]
其实还有一个很相似的问题:
但是,当我尝试使用上述方法时,没有任何帮助。可以抑制警告,但错误仍然存在。
$ 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编译器中控制warning。
虽然是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"
}
]
感谢您的宝贵时间。
这本身并不是一个整洁的错误。 Clang-diagnostic-error 基本上是一个编译器错误。 Clang 前段时间将未知参数设为硬错误,并且不能将其降级为警告。曾经有 -Qunused-arguments 但这在 Clang 11 AFAIK 中不起作用。
在将编译命令传递给 clang-tidy 之前,您必须删除参数,我建议 CMake - remove a compile flag for a single translation unit。
@pablo285 已经给出了完美的答案。
他说:
have to remove the argument before passing the compile commands to
clang-tidy
他已经提供了一个 link 来演示如何修改 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
我有一个项目,我用英特尔编译器构建了它。我想使用 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]
其实还有一个很相似的问题:
但是,当我尝试使用上述方法时,没有任何帮助。可以抑制警告,但错误仍然存在。
$ 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编译器中控制warning。
虽然是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"
}
]
感谢您的宝贵时间。
这本身并不是一个整洁的错误。 Clang-diagnostic-error 基本上是一个编译器错误。 Clang 前段时间将未知参数设为硬错误,并且不能将其降级为警告。曾经有 -Qunused-arguments 但这在 Clang 11 AFAIK 中不起作用。
在将编译命令传递给 clang-tidy 之前,您必须删除参数,我建议 CMake - remove a compile flag for a single translation unit。
@pablo285 已经给出了完美的答案。 他说:
have to remove the argument before passing the compile commands to clang-tidy
他已经提供了一个 link 来演示如何修改 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