Mailing List Archive

[xen master] xen/cppcheck: add parameter to skip given MISRA rules
commit a21c9e6ddfee6d21dff1f18c299cb94a47b32c9e
Author: Luca Fancellu <luca.fancellu@arm.com>
AuthorDate: Mon Jan 30 11:01:32 2023 +0000
Commit: Stefano Stabellini <stefano.stabellini@amd.com>
CommitDate: Thu Feb 2 12:03:10 2023 -0800

xen/cppcheck: add parameter to skip given MISRA rules

Add parameter to skip the passed MISRA rules during the cppcheck
analysis, the rules are specified as a list of comma separated
rules with the MISRA number notation (e.g. 1.1,1.3,...).

Modify convert_misra_doc.py script to take an extra parameter
giving a list of MISRA rule to be skipped, comma separated.
While there, fix some typos in the help and print functions.

Modify settings.py and cppcheck_analysis.py to have a new
parameter (--cppcheck-skip-rules) used to specify a list of
MISRA rule to be skipped during the cppcheck analysis.

Signed-off-by: Luca Fancellu <luca.fancellu@arm.com>
Acked-by: Stefano Stabellini <sstabellini@kernel.org>
---
xen/scripts/xen_analysis/cppcheck_analysis.py | 8 ++++--
xen/scripts/xen_analysis/settings.py | 35 ++++++++++++++++-----------
xen/tools/convert_misra_doc.py | 28 ++++++++++++++-------
3 files changed, 46 insertions(+), 25 deletions(-)

diff --git a/xen/scripts/xen_analysis/cppcheck_analysis.py b/xen/scripts/xen_analysis/cppcheck_analysis.py
index 0e952a1696..cc1f403d31 100644
--- a/xen/scripts/xen_analysis/cppcheck_analysis.py
+++ b/xen/scripts/xen_analysis/cppcheck_analysis.py
@@ -153,11 +153,15 @@ def generate_cppcheck_deps():
if settings.cppcheck_misra:
cppcheck_flags = cppcheck_flags + " --addon=cppcheck-misra.json"

+ skip_rules_arg = ""
+ if settings.cppcheck_skip_rules != "":
+ skip_rules_arg = "-s {}".format(settings.cppcheck_skip_rules)
+
utils.invoke_command(
"{}/convert_misra_doc.py -i {}/docs/misra/rules.rst"
- " -o {}/cppcheck-misra.txt -j {}/cppcheck-misra.json"
+ " -o {}/cppcheck-misra.txt -j {}/cppcheck-misra.json {}"
.format(settings.tools_dir, settings.repo_dir,
- settings.outdir, settings.outdir),
+ settings.outdir, settings.outdir, skip_rules_arg),
False, CppcheckDepsPhaseError,
"An error occured when running:\n{}"
)
diff --git a/xen/scripts/xen_analysis/settings.py b/xen/scripts/xen_analysis/settings.py
index a8502e554e..8c0d357fe0 100644
--- a/xen/scripts/xen_analysis/settings.py
+++ b/xen/scripts/xen_analysis/settings.py
@@ -24,6 +24,7 @@ cppcheck_binpath = "cppcheck"
cppcheck_html = False
cppcheck_htmlreport_binpath = "cppcheck-htmlreport"
cppcheck_misra = False
+cppcheck_skip_rules = ""
make_forward_args = ""
outdir = xen_dir

@@ -53,20 +54,22 @@ Cppcheck report creation phase runs only when --run-cppcheck is passed to the
script.

Options:
- --build-only Run only the commands to build Xen with the optional
- make arguments passed to the script
- --clean-only Run only the commands to clean the analysis artifacts
- --cppcheck-bin= Path to the cppcheck binary (Default: {})
- --cppcheck-html Produce an additional HTML output report for Cppcheck
- --cppcheck-html-bin= Path to the cppcheck-html binary (Default: {})
- --cppcheck-misra Activate the Cppcheck MISRA analysis
- --distclean Clean analysis artifacts and reports
- -h, --help Print this help
- --no-build Skip the build Xen phase
- --no-clean Don\'t clean the analysis artifacts on exit
- --run-coverity Run the analysis for the Coverity tool
- --run-cppcheck Run the Cppcheck analysis tool on Xen
- --run-eclair Run the analysis for the Eclair tool
+ --build-only Run only the commands to build Xen with the optional
+ make arguments passed to the script
+ --clean-only Run only the commands to clean the analysis artifacts
+ --cppcheck-bin= Path to the cppcheck binary (Default: {})
+ --cppcheck-html Produce an additional HTML output report for Cppcheck
+ --cppcheck-html-bin= Path to the cppcheck-html binary (Default: {})
+ --cppcheck-misra Activate the Cppcheck MISRA analysis
+ --cppcheck-skip-rules= List of MISRA rules to be skipped, comma separated.
+ (e.g. --cppcheck-skip-rules=1.1,20.7,8.4)
+ --distclean Clean analysis artifacts and reports
+ -h, --help Print this help
+ --no-build Skip the build Xen phase
+ --no-clean Don\'t clean the analysis artifacts on exit
+ --run-coverity Run the analysis for the Coverity tool
+ --run-cppcheck Run the Cppcheck analysis tool on Xen
+ --run-eclair Run the analysis for the Eclair tool
"""
print(msg.format(sys.argv[0], cppcheck_binpath,
cppcheck_htmlreport_binpath))
@@ -78,6 +81,7 @@ def parse_commandline(argv):
global cppcheck_html
global cppcheck_htmlreport_binpath
global cppcheck_misra
+ global cppcheck_skip_rules
global make_forward_args
global outdir
global step_get_make_vars
@@ -115,6 +119,9 @@ def parse_commandline(argv):
cppcheck_htmlreport_binpath = args_with_content_regex.group(2)
elif option == "--cppcheck-misra":
cppcheck_misra = True
+ elif args_with_content_regex and \
+ args_with_content_regex.group(1) == "--cppcheck-skip-rules":
+ cppcheck_skip_rules = args_with_content_regex.group(2)
elif option == "--distclean":
target_distclean = True
elif (option == "--help") or (option == "-h"):
diff --git a/xen/tools/convert_misra_doc.py b/xen/tools/convert_misra_doc.py
index 13074d8a2e..8984ec625f 100755
--- a/xen/tools/convert_misra_doc.py
+++ b/xen/tools/convert_misra_doc.py
@@ -4,12 +4,14 @@
This script is converting the misra documentation RST file into a text file
that can be used as text-rules for cppcheck.
Usage:
- convert_misr_doc.py -i INPUT [-o OUTPUT] [-j JSON]
+ convert_misra_doc.py -i INPUT [-o OUTPUT] [-j JSON] [-s RULES,[...,RULES]]

INPUT - RST file containing the list of misra rules.
OUTPUT - file to store the text output to be used by cppcheck.
If not specified, the result will be printed to stdout.
JSON - cppcheck json file to be created (optional).
+ RULES - list of rules to skip during the analysis, comma separated
+ (e.g. 1.1,1.2,1.3,...)
"""

import sys, getopt, re
@@ -47,21 +49,25 @@ def main(argv):
outfile = ''
outstr = sys.stdout
jsonfile = ''
+ force_skip = ''

try:
- opts, args = getopt.getopt(argv,"hi:o:j:",["input=","output=","json="])
+ opts, args = getopt.getopt(argv,"hi:o:j:s:",
+ ["input=","output=","json=","skip="])
except getopt.GetoptError:
- print('convert-misra.py -i <input> [-o <output>] [-j <json>')
+ print('convert-misra.py -i <input> [-o <output>] [-j <json>] [-s <rules>]')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
- print('convert-misra.py -i <input> [-o <output>] [-j <json>')
+ print('convert-misra.py -i <input> [-o <output>] [-j <json>] [-s <rules>]')
print(' If output is not specified, print to stdout')
sys.exit(1)
elif opt in ("-i", "--input"):
infile = arg
elif opt in ("-o", "--output"):
outfile = arg
+ elif opt in ("-s", "--skip"):
+ force_skip = arg
elif opt in ("-j", "--json"):
jsonfile = arg

@@ -169,14 +175,18 @@ def main(argv):

skip_list = []

+ # Add rules to be skipped anyway
+ for r in force_skip.split(','):
+ skip_list.append(r)
+
# Search for missing rules and add a dummy text with the rule number
for i in misra_c2012_rules:
for j in list(range(1,misra_c2012_rules[i]+1)):
- if str(i) + '.' + str(j) not in rule_list:
- outstr.write('Rule ' + str(i) + '.' + str(j) + '\n')
- outstr.write('No description for rule ' + str(i) + '.' + str(j)
- + '\n')
- skip_list.append(str(i) + '.' + str(j))
+ rule_str = str(i) + '.' + str(j)
+ if (rule_str not in rule_list) and (rule_str not in skip_list):
+ outstr.write('Rule ' + rule_str + '\n')
+ outstr.write('No description for rule ' + rule_str + '\n')
+ skip_list.append(rule_str)

# Make cppcheck happy by starting the appendix
outstr.write('Appendix B\n')
--
generated by git-patchbot for /home/xen/git/xen.git#master