@@ -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')