从 cmake 生成的命令中取消 cppcheck 分析中的定义
Unset define in cppcheck analyze from cmake generated command
我有一个用 cppcheck 1.90 检查的项目,但我想取消设置一些定义,因为检查所有定义需要很多时间。
示例:tests.cpp
:
int main() {
int x,y;
#ifdef A
x = 5;
#else
x = 10;
#endif
#ifdef B
y = 5;
#else
y = 10;
#endif
#ifdef C
y = 5*x;
#else
y = 10*x;
#endif
int c = x+y;
}
当我在没有项目的情况下处理文件时 - 没有问题:
cppcheck ../tests.cpp --force -UB
Checking ../tests.cpp ...
Checking ../tests.cpp: A...
Checking ../tests.cpp: C...
我取消设置定义 B - 并且 cppcheck 不使用 B 检查编译路径。
但是如何使用 cmake 项目生成的文件呢?
cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
cppcheck --project=./compile_commands.json --force -UB
Checking /home/builder/bugs/test_cppcheck/tests.cpp ...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: A...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: B...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: C...
如我所见,cppcheck 被忽略了“-U”键。在这种情况下有什么方法可以取消定义吗?
为测试示例添加 cmakefile:
CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(tests)
set(SRC
tests.cpp
)
set(NAME test)
add_executable(${NAME} ${SRC})
可能的决定之一是更改 CMakeLists 文件(取消设置定义):
cmake_minimum_required(VERSION 3.6)
project(tests)
set(SRC
tests.cpp
)
set(CMAKE_CXX_FLAGS "-UB=1")
set(NAME test)
add_executable(${NAME} ${SRC})
输出为:
$ cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-- Configuring done
-- Generating done
-- Build files have been written to: /home/builder/bugs/test_cppcheck/build
$ cppcheck --project=./compile_commands.json --force
Checking /home/builder/bugs/test_cppcheck/tests.cpp ...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: A...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: C...
没有“B”路径检查。
但是,如果存在不更改 CMakeLists 的解决方案 - 会更好。
您可以选择只编辑一次 CMakeLists 文件并根据需要传递参数,为此您应该
In the CMakeLists file add:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} *hard_coded_flags*")
Command line :
从命令行调用 cmake
时添加 CMAKE_CXX_FLAGS = -UB=1
(或任何其他 cppcheck 标志),这会将 -UB=1
连接到hard_coded_flags
.
另一种方法是cmake
运行 cppcheck
本身。这可以通过设置 CMAKE_CXX_CPPCHECK
来完成(参见 documentation)。您可以在 CMakeLists.txt
中设置 CMAKE_CXX_CPPCHECK
,也可以在调用 cmake
.
的 command-line 中设置它
这确实有一些缺点(例如,每个源文件都是单独检查的,所以 cross-file 检查不起作用)。
但是有几个优点:
- 无需单独调用
cppcheck
。
- 如果您在
CMakeLists.txt
中设置 CMAKE_CXX_CPPCHECK
,您还可以添加 cppcheck
command-line 选项来控制它的作用。在您的情况下,您可以添加 -UB
.
- 这有助于将有关如何构建和检查项目的所有知识封装到一个文件中 (
CMakeLists.txt
)。
我通常在 CMakeLists.txt
:
中遵循类似这样的模式
option(ENABLE_CODE_ANALYSIS "Run code analysis" OFF)
if(ENABLE_CODE_ANALYSIS)
find_program(cppcheck cppcheck)
message(STATUS "cppcheck ${cppcheck}")
if(NOT (cppcheck MATCHES "NOTFOUND"))
set(CMAKE_CXX_CPPCHECK "${cppcheck}"
"--enable=all"
"--inconclusive"
"--inline-suppr"
"--quiet"
"--suppress=missingInclude"
"--suppress=unmatchedSuppression"
"--suppress=unusedFunction"
"--template='{file}:{line}: warning: {id} ({severity}): {message}'")
endif()
endif(ENABLE_CODE_ANALYSIS)
然后就可以通过cmake -DENABLE_CODE_ANALYSIS=ON
.
进行代码分析了
我有一个用 cppcheck 1.90 检查的项目,但我想取消设置一些定义,因为检查所有定义需要很多时间。
示例:tests.cpp
:
int main() {
int x,y;
#ifdef A
x = 5;
#else
x = 10;
#endif
#ifdef B
y = 5;
#else
y = 10;
#endif
#ifdef C
y = 5*x;
#else
y = 10*x;
#endif
int c = x+y;
}
当我在没有项目的情况下处理文件时 - 没有问题:
cppcheck ../tests.cpp --force -UB
Checking ../tests.cpp ...
Checking ../tests.cpp: A...
Checking ../tests.cpp: C...
我取消设置定义 B - 并且 cppcheck 不使用 B 检查编译路径。 但是如何使用 cmake 项目生成的文件呢?
cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
cppcheck --project=./compile_commands.json --force -UB
Checking /home/builder/bugs/test_cppcheck/tests.cpp ...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: A...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: B...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: C...
如我所见,cppcheck 被忽略了“-U”键。在这种情况下有什么方法可以取消定义吗?
为测试示例添加 cmakefile:
CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(tests)
set(SRC
tests.cpp
)
set(NAME test)
add_executable(${NAME} ${SRC})
可能的决定之一是更改 CMakeLists 文件(取消设置定义):
cmake_minimum_required(VERSION 3.6)
project(tests)
set(SRC
tests.cpp
)
set(CMAKE_CXX_FLAGS "-UB=1")
set(NAME test)
add_executable(${NAME} ${SRC})
输出为:
$ cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-- Configuring done
-- Generating done
-- Build files have been written to: /home/builder/bugs/test_cppcheck/build
$ cppcheck --project=./compile_commands.json --force
Checking /home/builder/bugs/test_cppcheck/tests.cpp ...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: A...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: C...
没有“B”路径检查。 但是,如果存在不更改 CMakeLists 的解决方案 - 会更好。
您可以选择只编辑一次 CMakeLists 文件并根据需要传递参数,为此您应该
In the CMakeLists file add:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} *hard_coded_flags*")
Command line :
从命令行调用 cmake
时添加 CMAKE_CXX_FLAGS = -UB=1
(或任何其他 cppcheck 标志),这会将 -UB=1
连接到hard_coded_flags
.
另一种方法是cmake
运行 cppcheck
本身。这可以通过设置 CMAKE_CXX_CPPCHECK
来完成(参见 documentation)。您可以在 CMakeLists.txt
中设置 CMAKE_CXX_CPPCHECK
,也可以在调用 cmake
.
这确实有一些缺点(例如,每个源文件都是单独检查的,所以 cross-file 检查不起作用)。
但是有几个优点:
- 无需单独调用
cppcheck
。 - 如果您在
CMakeLists.txt
中设置CMAKE_CXX_CPPCHECK
,您还可以添加cppcheck
command-line 选项来控制它的作用。在您的情况下,您可以添加-UB
. - 这有助于将有关如何构建和检查项目的所有知识封装到一个文件中 (
CMakeLists.txt
)。
我通常在 CMakeLists.txt
:
option(ENABLE_CODE_ANALYSIS "Run code analysis" OFF)
if(ENABLE_CODE_ANALYSIS)
find_program(cppcheck cppcheck)
message(STATUS "cppcheck ${cppcheck}")
if(NOT (cppcheck MATCHES "NOTFOUND"))
set(CMAKE_CXX_CPPCHECK "${cppcheck}"
"--enable=all"
"--inconclusive"
"--inline-suppr"
"--quiet"
"--suppress=missingInclude"
"--suppress=unmatchedSuppression"
"--suppress=unusedFunction"
"--template='{file}:{line}: warning: {id} ({severity}): {message}'")
endif()
endif(ENABLE_CODE_ANALYSIS)
然后就可以通过cmake -DENABLE_CODE_ANALYSIS=ON
.