cmakecppcheck

Cppcheck support in CMake


I 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 on 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)?


Solution

  • 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