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>
This commit is contained in:
Luca Fancellu authored and Stefano Stabellini committed 2023-02-02 12:03:10 -08:00
1 parent 94f154f168
commit a21c9e6ddf
3 files changed
+46 -25

No files matched your search

@@ -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{}"
)
+21 -14
View File
@@ -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"):
+19 -9
View File
@@ -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')
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.