web-dev-qa-db-fra.com

Prise en charge de Cppcheck dans CMake

Je ne pose pas de questions sur les différents modules tiers disponibles qui prennent en charge Cppcheck d'une manière ou d'une autre.

Avec CMake 3.10, CMake semble avoir gagné un support officiel de Cppcheck. Voir CMAKE_ <LANG> _CPPCHECK .

Malheureusement, la documentation sur l'utilisation de cette variable est un peu clairsemée. Existe-t-il un bon exemple de la façon dont Cppcheck est censé être utilisé avec CMake 3.10 (ou version ultérieure)?

14
arved

Un exemple simple serait - si vous avez cppcheck dans votre PATH et que vous ne spécifiez pas de paramètres supplémentaires - ce qui suit en définissant 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")

Les fichiers à analyser sont ajoutés automatiquement à la ligne de commande cppcheck. Ainsi, l'exemple ci-dessus donne la sortie suivante (gcc et cppcheck sur le système Linux):

# 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

Vous pouvez essayer cppcheck dans un projet existant en définissant simplement le CMAKE_CXX_CPPCHECK variable via la ligne de commande cmake:

# cmake -DCMAKE_CXX_CPPCHECK:FILEPATH=cppcheck ..

Un exemple plus "quotidien" vous permettrait probablement d'inclure quelque chose comme l'extrait de code suivant dans votre 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()

Références

17
Florian