From e88e024509d0a61e19239e8d6350f3dd737eb9a1 Mon Sep 17 00:00:00 2001 From: Georgy Komarov Date: Sun, 28 Jul 2019 08:51:03 +0300 Subject: [PATCH] Addons: Add README (#2047) * Addons: Add README * fix --- addons/README.md | 37 +++++++++++++++++++++++++ addons/doc/img/cppcheck-gui-addons.png | Bin 0 -> 23645 bytes 2 files changed, 37 insertions(+) create mode 100644 addons/README.md create mode 100644 addons/doc/img/cppcheck-gui-addons.png diff --git a/addons/README.md b/addons/README.md new file mode 100644 index 000000000..839d09620 --- /dev/null +++ b/addons/README.md @@ -0,0 +1,37 @@ +# Cppcheck addons + +Addons are scripts that analyses Cppcheck dump files to check compatibility with secure coding standards and to locate various issues. + +## Supported addons + ++ [cert.py](https://github.com/danmar/cppcheck/blob/master/addons/cert.py) + Checks for compliance with the safe programming standard [CERT](http://www.cert.org/secure-coding/). ++ [misra.py](https://github.com/danmar/cppcheck/blob/master/addons/misra.py) + Used to verify compliance with MISRA C 2012 - a proprietary set of guidelines to avoid such questionable code, developed for embedded systems. Since this standard is proprietary, cppcheck does not display error text by specifying only the number of violated rules (for example, [c2012-21.3]). If you want to display full texts for violated rules, you will need to create a text file containing MISRA rules, which you will have to pass when calling the script with `--rule-texts` key. Some examples of rule texts files available in [tests directory](https://github.com/danmar/cppcheck/blob/master/addons/test/misra/). ++ [y2038.py](https://github.com/danmar/cppcheck/blob/master/addons/y2038.py) + Checks Linux system for [year 2038 problem](https://en.wikipedia.org/wiki/Year_2038_problem) safety. This required [modified environment](https://github.com/3adev/y2038). See complete description [here](https://github.com/danmar/cppcheck/blob/master/addons/doc/y2038.txt). ++ [threadsafety.py](https://github.com/danmar/cppcheck/blob/master/addons/threadsafety.py) + Analyse Cppcheck dump files to locate threadsafety issues like static local objects used by multiple threads. + +## Usage + +### Command line interface + +```bash +cppcheck --addon=cert --addon=y2038 src/test.c +``` + +It is also possible to call scripts as follows: +```bash +cppcheck --dump --quiet src/test.c +python cert.py src/test.c.dump +python misra.py --rules-texts=~/misra_rules.txt src/test.c.dump +``` + +This allows you to add additional parameters when calling the script (for example, `--rule-tests` for `misra.py`). The full list of available parameters can be found by calling any script with the `--help` flag. + +### GUI + +When using the graphical interface `cppcheck-gui`, the selection and configuration of addons is carried out on the tab `Addons and tools` in the project settings (`Edit Project File`): + +[](https://raw.githubusercontent.com/danmar/cppcheck/master/addons/doc/img/cppcheck-gui-addons.png) diff --git a/addons/doc/img/cppcheck-gui-addons.png b/addons/doc/img/cppcheck-gui-addons.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a22ba953c7725a5c931146e44d9e43f14fd0ec GIT binary patch literal 23645 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 NJYD@<);T3K0RXq~G|2z} literal 0 HcmV?d00001