.. SPDX-License-Identifier: BSD-3-Clause .. SPDX-FileCopyrightText: Copyright TF-RMM Contributors. ************************* Cppcheck Application Note ************************* Cppcheck is an open source static analysis tool for C/C++. In addition to various static analysis, it also has an addon to verify compliance with MISRA C 2012. Please refer to `Cppcheck Project Page`_ for details on Cppcheck. Cppcheck can be run standalone or along with MISRA addon from within the RMM build system. TF-RMM aims to have 0 outstanding errors with the recommended Cppcheck version mentioned in :ref:`tool_dependencies`. Installing Cppcheck =================== Cppcheck can be installed directly from various package managers or built from source. However installing from package manager can get you an outdated version. For building from source, please refer to `Cppcheck GitHub`_ for downloading recommended version and build guidelines. Once Cppcheck is built, add both Cppcheck binary folder and Cppcheck-htmlreport folder to PATH. The latter is used to convert Cppcheck XML output into user friendly html report. Asssuming that `build` is the output folder for Cppcheck build: .. code-block:: bash export PATH=$cppcheck_root/build/bin:$cppcheck_root/htmlreport:$PATH cppcheck --version The Cppcheck version should report the recommended version. Invoking Cppcheck rule within TF-RMM build system ================================================= If you own a valid copy of a MISRA rules file, copy the file to the below location as it will give a more descriptive error message on detecting MISRA errors. .. code-block:: bash cp -a / ${RMM_SOURCE_DIR}/tools/cppcheck/misra.rules To invoke the standard Cppcheck static analysis build rule on TF-RMM, run the `cppcheck` build target after TF-RMM configuration : .. code-block:: bash cd $rmm_root cmake -DRMM_CONFIG=fvp_defcfg -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON cmake --build build -- cppcheck The `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON` generates a compile_commands.json file containing the exact compiler calls for all translation units of the project in machine-readable form. The successful execution of the build target will generate `cppcheck.xml` in `build/tools/cppcheck` folder. To invoke the Cppcheck static analysis with MISRA addon, run the `cppcheck-misra` build target: .. code-block:: bash cd $rmm_root cmake -DRMM_CONFIG=fvp_defcfg -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON cmake --build build -- cppcheck-misra This will generate `cppcheck_misra.xml` in `build/tools/cppcheck` folder. If the above generated xml contains error tags detected by Cppcheck and if the installed version of Cppcheck matches or exceeds the recommended version mentioned in :ref:`tool_dependencies`, the build fails and prints the error count. However, if the installed version is less than the recommended version, a warning is generated and the output is not parsed for errors. Generating the Cppcheck HTML report =================================== To generate html report in current directory after the Cppcheck build target has executed, run `cppcheck-htmlreport` tool with the genenerated xml file as input. For example, after the `cppcheck-misra` build target has completed, use the below cmd line to generate the html report : .. code-block:: bash cppcheck-htmlreport --file=./build/tools/cppcheck/cppcheck_misra.xml --report-dir=test --source-dir=. The output will be generated in the specified `report-dir` and, for the above command, the html report can be found at `./test/index.html`. Cppcheck Error Suppression ========================== TF-RMM as a project has decided to suppress some rules because either the rule is not found to be useful for the project or there are too many false positives generated by the rule. The global suppression rules are specified via `suppressions.txt` file present in `tools/cppcheck` directory. If more suppressions need to be added for Cppcheck, it can be done by adding it to the suppression rules file. For example, to skip `ext` folder from Cppcheck analysis, add the following line to the file : .. code-block:: bash *:*/ext/* Suppression can be added inline to code as a comment. For example, to suppress the `uninitvar` rule on a particular line, add the following comment above the line : .. code-block:: C /* cppcheck-suppress uninitvar */ Multiple rules can be disabled via this method, as shown in example below : .. code-block:: C /* cppcheck-suppress [arrayIndexOutOfBounds, uninitvar] */ If a certain rule needs to be suppressed for a block of code, the block suppression format can be used as shown in example below: .. code-block:: C /* cppcheck-suppress-begin uninitvar */ block_of_code; /* cppcheck-suppress-end uninitvar */ .. _Cppcheck Project Page: https://cppcheck.sourceforge.io/ .. _Cppcheck GitHub: https://github.com/danmar/cppcheck