C++ 从cmake生成的命令中取消cppcheck分析中的定义
我有一个用cppcheck 1.90检查的项目,但我想取消设置一些定义,因为检查所有定义需要很多时间 示例:C++ 从cmake生成的命令中取消cppcheck分析中的定义,c++,cmake,cppcheck,C++,Cmake,Cppcheck,我有一个用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; } 当我在没有项目的情况下使用
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...
我取消设置define 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 ../ -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”路径检查。
但如果存在不更改CmakeList的解决方案,则更好。一个可能的决定是更改CmakeList文件(未设置定义): 输出为:
$ 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”路径检查。
但是,如果存在不更改CmakeList的解决方案,那就更好了。您可以选择只编辑CmakeList文件一次,并根据需要传递参数,要实现这一点,您应该 在CMakeLists文件中添加:
set(CMAKE\u CXX\u标志“${CMAKE\u CXX\u标志}*硬编码的\u标志*”)
命令行:
从命令行调用
cmake
时,您可以添加cmake\u CXX\u标志=-UB=1
(或任何其他cppcheck标志),这将-UB=1
连接到硬编码的\u标志
,您可以选择只编辑一次CMakeLists文件,并根据需要传递参数,要做到这一点,你应该
在CMakeLists文件中添加:
set(CMAKE\u CXX\u标志“${CMAKE\u CXX\u标志}*硬编码的\u标志*”)
命令行:
从命令行调用
cmake
时,添加cmake\u CXX\u标志=-UB=1
(或任何其他cppcheck标志),这将把-UB=1
连接到硬编码的\u标志
另一种方法是让cmake
运行cppcheck
本身。可以通过设置CMAKE\u CXX\u CPPCHECK
(请参阅)。您可以在CMakeLists.txt
中设置CMAKE\u CXX\u CPPCHECK
,也可以在调用CMAKE
的命令行上进行设置
这确实有一些缺点(例如,每个源文件都是单独检查的,因此跨文件检查不起作用)
但有几个优点:
- 无需单独调用
cppcheck
- 如果在
中设置CMakeLists.txt
,还可以添加CMAKE\u CXX\u CPPCHECK
命令行选项来控制它的功能。在您的情况下,可以添加CPPCHECK
-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\u code\u analysis=ON
进行代码分析,另一种方法是让cmake
运行cppcheck
本身。可以通过设置CMAKE\u CXX\u CPPCHECK
(请参阅)。您可以在CMakeLists.txt
中设置CMAKE\u CXX\u CPPCHECK
,也可以在调用CMAKE
的命令行上进行设置
这确实有一些缺点(例如,每个源文件都是单独检查的,因此跨文件检查不起作用)
但有几个优点:
- 无需单独调用
cppcheck
- 如果在
CMakeLists.txt
中设置CMAKE\u CXX\u CPPCHECK
,还可以添加CPPCHECK
命令行选项来控制它的功能。在您的情况下,可以添加-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)
然后,你可以通过<代码> CGIS-DENABLE代码分析= < < /C++ > .< /P>你尝试设置C++标志吗?CMakeLists文件
设置(CMAKE_CXX_FLAGS“-D*您的_FLAGS*”
,发布您的CMakeLists文件会很有帮助。这是cppcheck
的问题,您很可能]应该向他们报告一个错误。@joepol,谢谢!但最好是取消定义!你试过设置C++标志吗?CMakeLists文件设置(CMAKE_CXX_FLAGS“-D*您的_FLAGS*”
,发布您的CMakeLists文件会很有帮助。这是cppcheck
的问题,您很可能]应该向他们报告一个错误。@joepol,谢谢!但最好是取消定义!