|
[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
On Tue, 6 Dec 2022, Luca Fancellu wrote:
> 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?
Examples would certainly help a lot. Looking at the html results it
wasn't clear to me what the violation-id actually was. It took me a few
tries to understand that "shadowVariable" was the cppcheck violation-id.
Maybe just add: look under the column "Defect ID" amoung the html
results to find the violation-id, such as "variableScope".
> >> 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?
Yes I think it is fine. I plan to test again your next version anyway
> >> 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
Thank you
> >> +
> >> +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 |