mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
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{}"
|
||||
)
|
||||
|
||||
@@ -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"):
|
||||
|
||||
@@ -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')
|
||||
|
||||