Cppcheck support in CMake
An simple example would be - if you have cppcheck in your PATH and you are not specifying additional parameters - the following by setting global CMAKE_<LANG>_CPPCHECK variable:
cmake_minimum_required(VERSION 3.10)
project(CppCheckTest)
file(
WRITE "main.cpp"
[=[
int main()
{
char a[10];
a[10] = 0;
return 0;
}
]=]
)
set(CMAKE_CXX_CPPCHECK "cppcheck")
add_executable(${PROJECT_NAME} "main.cpp")
The files to scan are added automatically to the cppcheck command line. So the above example gives the following output (gcc and cppcheck on Linux system):
# make
Scanning dependencies of target CppCheckTest
[ 50%] Building CXX object CMakeFiles/CppCheckTest.dir/main.cpp.o
Checking .../CppCheckTest/main.cpp...
Warning: cppcheck reported diagnostics:
[/mnt/c/temp/StackOverflow/CppCheckTest/main.cpp:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.
[100%] Linking CXX executable CppCheckTest
[100%] Built target CppCheckTest
You could give cppcheck a try in an existing project by simply setting the CMAKE_CXX_CPPCHECK variable via the cmake command line:
# cmake -DCMAKE_CXX_CPPCHECK:FILEPATH=cppcheck ..
A more "daily life" example would probably for you to include something like the following code snippet in your CMakeList.txt:
find_program(CMAKE_CXX_CPPCHECK NAMES cppcheck)
if (CMAKE_CXX_CPPCHECK)
list(
APPEND CMAKE_CXX_CPPCHECK
"--enable=warning"
"--inconclusive"
"--force"
"--inline-suppr"
"--suppressions-list=${CMAKE_SOURCE_DIR}/CppCheckSuppressions.txt"
)
endif()
References
- CMake Commit: Add properties to run cppcheck along with the compiler
-
<LANG>_CPPCHECKtarget propertyThis property is supported only when
<LANG>isCorCXX.Specify a ;-list containing a command line for the
cppcheckstatic analysis tool. The Makefile Generators and the Ninja generator will runcppcheckalong with the compiler and report any problems.This property is initialized by the value of the
CMAKE_<LANG>_CPPCHECKvariable if it is set when a target is created.
arved
Open Source enthusiast. Develop software by day. Hacking FreeBSD by night.
Updated on June 06, 2022Comments
-
arved 7 monthsI am not asking about the various available third-party modules that support Cppcheck in one way or the other.
With CMake 3.10, CMake seems to have gained some official Cppcheck support. See CMAKE_<LANG>_CPPCHECK.
Unfortunately the documentation how to use this variable is a bit sparse. Is there a good example of how Cppcheck is supposed to be used with CMake 3.10 (or later)?
-
arved almost 5 yearsThanks for the detailed answer, unfortunately it doesn't work here (Ubuntu 17.10, cppcheck 1.80 cmake 3.9.1. There is no output from cppcheck. How to debug this? -
Florian almost 5 years@arved Are you sure that this also works with CMake 3.9.x? Havn't checked this. I'm using CMake 3.10.x. The commit I've linked is 5 month old, so I suspect that it only works in 3.10.x (also if I look at the release notes it was added with Version 3.10). -
arved almost 5 yearsyou are right, i misread the release notes, it works with 3.10 -
Zitrax over 4 yearsI would like the compile to fail if there is acppcheck error or warning. I tried--error-exitcode=1but unfortunately it did not have any effect. ( I know I can roll my own cppcheck target of course - but would be nice if it worked with the built in support ). -
Florian Wolters about 4 yearsThe "daily life" example provided does not work (at least using a Ninja generator with CMake 3.12.4)! It seems thatCMAKE_CXX_CPPCHECKhas to be fully specified on the CLI. Otherwise the build system does not pick up the value ofCMAKE_CXX_CPPCHECK. I had it almost working by setting the variable manually as aCACHEvariable in myCMakeLists.txt, but even then configure has to be run twice in order for the generator to pick up the updatedCMAKE_CXX_CPPCHECKvalue. Guess: Build files are written in wrong order. I'm afraid the only portable solution is a custom target. -
oarfish over 2 yearsInterestingly, whenmakeis invoked with parallel jobs-jX, cppcheck output is garbled and ureadable. -
mgiaco over 2 yearsI also try this but does not work for me with the latest cmake version. cppcheck is found on configure but when I build the proejct i did not get any cppcheck output. Did anyone has a link to a sample project?
-
Avi almost 2 yearsI am also not getting the cppcheck output using the provided "daily life" example. mgiaco and @Florian Wolter, Did you guys got the fix to make that work? Could you also look at here