|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/5] xen/scripts: add cppcheck tool to the xen-analysis.py script
Hi Stefano,
>>
>> +++ b/docs/misra/false-positive-cppcheck.json
>> @@ -0,0 +1,12 @@
>> +{
>> + "version": "1.0",
>> + "content": [
>> + {
>> + "id": "SAF-0-false-positive-cppcheck",
>> + "violation-id": "",
>> + "tool-version": "",
>> + "name": "Sentinel",
>> + "text": "Next ID to be used"
>> + }
>> + ]
>> +}
>
> I think we need to add to the cppcheck document how to figure out the
> cppcheck id for a given violation in the html report
I’m planning to send some patches with cppcheck false positive fixes, would
them be enough?
We already have a section in documenting-violation.rst on how to document the
finding, for
cppcheck it’s just a matter to get the text report, do you think it’s better to
add a part to that section
on how to locate the cppcheck violation id from its text report?
>>
>> diff --git a/xen/scripts/xen_analysis/generic_analysis.py
>> b/xen/scripts/xen_analysis/generic_analysis.py
>> index 0b470c4ecf7d..94122aebace0 100644
>> --- a/xen/scripts/xen_analysis/generic_analysis.py
>> +++ b/xen/scripts/xen_analysis/generic_analysis.py
>> @@ -1,7 +1,7 @@
>> #!/usr/bin/env python3
>>
>> -import os, subprocess
>> -from . import settings, utils, tag_database
>> +import os
>> +from . import settings, utils, tag_database, cppcheck_analysis
>>
>> class ParseTagPhaseError(Exception):
>> pass
>> @@ -60,18 +60,13 @@ def parse_xen_tags():
>>
>>
>> def build_xen():
>> - try:
>> - subprocess.run(
>> - "make -C {} {} build"
>> - .format(settings.xen_dir, settings.make_forward_args),
>> - shell=True, check=True
>> + utils.invoke_command(
>> + "make -C {} {} {} build"
>> + .format(settings.xen_dir, settings.make_forward_args,
>> + cppcheck_analysis.cppcheck_extra_make_args),
>> + False, BuildPhaseError,
>> + "Build error occured when running:\n{}"
>> )
>> - except (subprocess.CalledProcessError, subprocess.SubprocessError) as
>> e:
>> - excp = BuildPhaseError(
>> - "Build error occured when running:\n{}".format(e.cmd)
>> - )
>> - excp.errorcode = e.returncode if hasattr(e, 'returncode') else 1
>> - raise excp
>
> Any reason why we can't have utils.invoke_command directly in patch #1?
There was only one invocation, so I left that as it was, now if I change it I
think I will lost your
Tested-by and ack, do you want me to put also in the first patch?
>
>
>> def clean_analysis_artifacts():
>> diff --git a/xen/scripts/xen_analysis/settings.py
>> b/xen/scripts/xen_analysis/settings.py
>> index 947dfa2d50af..bd1faafe79a3 100644
>> --- a/xen/scripts/xen_analysis/settings.py
>> +++ b/xen/scripts/xen_analysis/settings.py
>> @@ -7,14 +7,23 @@ xen_dir = os.path.realpath(module_dir + "/../..")
>> repo_dir = os.path.realpath(xen_dir + "/..")
>> tools_dir = os.path.realpath(xen_dir + "/tools")
>>
>> +step_get_make_vars = False
>> step_parse_tags = True
>> +step_cppcheck_deps = False
>> step_build_xen = True
>> +step_cppcheck_report = False
>> step_clean_analysis = True
>> +step_distclean_analysis = False
>>
>> target_build = False
>> target_clean = False
>> +target_distclean = False
>>
>> analysis_tool = ""
>> +cppcheck_binpath = "cppcheck"
>> +cppcheck_html = False
>> +cppcheck_htmlreport_binpath = "cppcheck-htmlreport"
>> +cppcheck_misra = False
>> make_forward_args = ""
>> outdir = xen_dir
>>
>> @@ -26,29 +35,47 @@ Usage: {} [OPTION] ... [-- [make arguments]]
>> This script runs the analysis on the Xen codebase.
>>
>> 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
>> - -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-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
>> + --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]))
>> + print(msg.format(sys.argv[0], cppcheck_binpath,
>> + cppcheck_htmlreport_binpath))
>>
>>
>> def parse_commandline(argv):
>> global analysis_tool
>> + global cppcheck_binpath
>> + global cppcheck_html
>> + global cppcheck_htmlreport_binpath
>> + global cppcheck_misra
>> global make_forward_args
>> global outdir
>> + global step_get_make_vars
>> global step_parse_tags
>> + global step_cppcheck_deps
>> global step_build_xen
>> + global step_cppcheck_report
>> global step_clean_analysis
>> + global step_distclean_analysis
>> global target_build
>> global target_clean
>> + global target_distclean
>> forward_to_make = False
>> for option in argv:
>> + args_with_content_regex = re.match(r'^(--[a-z]+[a-z-]*)=(.*)$',
>> option)
>> +
>> if forward_to_make:
>> # Intercept outdir
>> outdir_regex = re.match("^O=(.*)$", option)
>> @@ -60,6 +87,18 @@ def parse_commandline(argv):
>> target_build = True
>> elif option == "--clean-only":
>> target_clean = True
>> + elif args_with_content_regex and \
>> + args_with_content_regex.group(1) == "--cppcheck-bin":
>> + cppcheck_binpath = args_with_content_regex.group(2)
>> + elif option == "--cppcheck-html":
>> + cppcheck_html = True
>> + elif args_with_content_regex and \
>> + args_with_content_regex.group(1) == "--cppcheck-html-bin":
>> + cppcheck_htmlreport_binpath = args_with_content_regex.group(2)
>> + elif option == "--cppcheck-misra":
>> + cppcheck_misra = True
>> + elif option == "--distclean":
>> + target_distclean = True
>> elif (option == "--help") or (option == "-h"):
>> help()
>> sys.exit(0)
>> @@ -69,6 +108,11 @@ def parse_commandline(argv):
>> step_clean_analysis = False
>> elif (option == "--run-coverity") or (option == "--run-eclair"):
>> analysis_tool = option[6:]
>> + elif (option == "--run-cppcheck"):
>> + analysis_tool = "cppcheck"
>> + step_get_make_vars = True
>> + step_cppcheck_deps = True
>> + step_cppcheck_report = True
>> elif option == "--":
>> forward_to_make = True
>> else:
>> @@ -76,13 +120,23 @@ def parse_commandline(argv):
>> help()
>> sys.exit(1)
>>
>> - if target_build and target_clean:
>> - print("--build-only is not compatible with --clean-only argument.")
>> + if target_build and (target_clean or target_distclean):
>> + print("--build-only is not compatible with --clean-only/--distclean
>> "
>> + "argument.")
>> sys.exit(1)
>>
>> + if target_distclean:
>> + # Implicit activation of clean target
>> + target_clean = True
>> +
>> + step_distclean_analysis = True
>> +
>> if target_clean:
>> + step_get_make_vars = False
>> step_parse_tags = False
>> + step_cppcheck_deps = False
>> step_build_xen = False
>> + step_cppcheck_report = False
>> step_clean_analysis = True
>> return
>>
>> @@ -95,3 +149,4 @@ def parse_commandline(argv):
>> step_parse_tags = False
>> step_build_xen = True
>> step_clean_analysis = False
>> + step_cppcheck_report = False
>
> I think that target_build should not say anything about
> step_cppcheck_report.
>
> - if one wants to just do a regular build, they can do "make xen"
> - if one is calling xen-analysis.py --cppcheck-html --run-cppcheck
> --build-only, it means that they want the build done, not the cleaning
> done, not the tags substitution. If they also add --cppcheck-html and
> --run-cppcheck, then it means that they also want the cppcheck report
> produced. --build-only still makes sense because they don't want the
> cleaning done and don't want the tag substitution.
>
> Does it make sense to you as well?
>
>
> If it does, I think we also need to add a note in the help message from
> xen_analysis because it is not clear. So basically:
>
> <nothing>: tags, build, clean [, cppcheck]
> --no-clean: tags, build [, cppcheck]
> --build-only: build [, cppcheck]
> --no-build: tags
> --clean-only: clean
>
> Did I get it right?
Ok I can leave the report generation with the build-only, I will also explain
better
In the help
>>
>> +
>> +function create_jcd() {
>> + local line="${1}"
>> + local arg_num=0
>> + local same_line=0
>> +
>> + {
>> + echo -e -n "[\n"
>
> Everywhere in this bash function: there is no point in passing -n and
> then adding \n at the end. You might as well do this:
>
> echo -e "["
>
> Also, you'll find that in most cases, you don't need -e either, which
> simplifies it to:
>
> echo "["
>
> That's better right? :-) Of course feel free to use -e when you have
> escape and -n when you don't want \n in the output
Yeah I guess they come from copy paste, I can use the right arguments when
needed
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |