[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 1/3] xen/cppcheck: add a way to exclude files from the scan
On Fri, 3 Mar 2023, Luca Fancellu wrote: > Add a way to exclude files from the scan, in this way we can skip > some findings from the report on those files that Xen doesn't own. > > To do that, introduce the exclude-list.json file under docs/misra, > this file will be populated with relative path to the files/folder > to be excluded. > Introduce a new module, exclusion_file_list.py, to deal with the > exclusion list file and use the new module in cppcheck_analysis.py > to take a list of excluded paths to update the suppression list of > cppcheck. > Modified --suppress flag for cppcheck tool to remove > unmatchedSuppression findings for those external file that are > listed but for example not built for the current architecture. > > Add documentation for the file. > > Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > Changes from v2: > - enforce excluded folder path to end with '/*', so update docs > and drop the code that handled (badly) that case from > exclusion_file_list.py, __cppcheck_path_exclude_syntax(...) > (Stefano) > Changes from v1: > - Indentation fixed (Jan) > --- > --- > docs/misra/exclude-list.json | 4 ++ > docs/misra/exclude-list.rst | 46 ++++++++++++ > xen/scripts/xen_analysis/cppcheck_analysis.py | 20 +++++- > .../xen_analysis/exclusion_file_list.py | 70 +++++++++++++++++++ > 4 files changed, 138 insertions(+), 2 deletions(-) > create mode 100644 docs/misra/exclude-list.json > create mode 100644 docs/misra/exclude-list.rst > create mode 100644 xen/scripts/xen_analysis/exclusion_file_list.py > > diff --git a/docs/misra/exclude-list.json b/docs/misra/exclude-list.json > new file mode 100644 > index 000000000000..1fb0ac67747b > --- /dev/null > +++ b/docs/misra/exclude-list.json > @@ -0,0 +1,4 @@ > +{ > + "version": "1.0", > + "content": [] > +} > diff --git a/docs/misra/exclude-list.rst b/docs/misra/exclude-list.rst > new file mode 100644 > index 000000000000..c97431a86120 > --- /dev/null > +++ b/docs/misra/exclude-list.rst > @@ -0,0 +1,46 @@ > +.. SPDX-License-Identifier: CC-BY-4.0 > + > +Exclude file list for xen-analysis script > +========================================= > + > +The code analysis is performed on the Xen codebase for both MISRA > +checkers and static analysis checkers, there are some files however that > +needs to be removed from the findings report for various reasons (e.g. > +they are imported from external sources, they generate too many false > +positive results, etc.). > + > +For this reason the file docs/misra/exclude-list.json is used to exclude > every > +entry listed in that file from the final report. > +Currently only the cppcheck analysis will use this file. > + > +Here is an example of the exclude-list.json file:: > + > +|{ > +| "version": "1.0", > +| "content": [ > +| { > +| "rel_path": "relative/path/from/xen/file", > +| "comment": "This file is originated from ..." > +| }, > +| { > +| "rel_path": "relative/path/from/xen/folder/*", > +| "comment": "This folder is a library" > +| }, > +| { > +| "rel_path": "relative/path/from/xen/mem*.c", > +| "comment": "memcpy.c, memory.c and memcmp.c are from the > outside" > +| } > +| ] > +|} > + > +Here is an explanation of the fields inside an object of the "content" array: > + - rel_path: it is the relative path from the Xen folder to the file/folder > that > + needs to be excluded from the analysis report, it can contain a wildcard > to > + match more than one file/folder at the time. This field is mandatory. > + - comment: an optional comment to explain why the file is removed from the > + analysis. > + > +To ease the review and the modifications of the entries, they shall be > listed in > +alphabetical order referring to the rel_path field. > +Excluded folder paths shall end with '/*' in order to match everything on > that > +folder. > diff --git a/xen/scripts/xen_analysis/cppcheck_analysis.py > b/xen/scripts/xen_analysis/cppcheck_analysis.py > index cc1f403d315e..e385e2c8f54a 100644 > --- a/xen/scripts/xen_analysis/cppcheck_analysis.py > +++ b/xen/scripts/xen_analysis/cppcheck_analysis.py > @@ -1,7 +1,8 @@ > #!/usr/bin/env python3 > > import os, re, shutil > -from . import settings, utils, cppcheck_report_utils > +from . import settings, utils, cppcheck_report_utils, exclusion_file_list > +from .exclusion_file_list import ExclusionFileListError > > class GetMakeVarsPhaseError(Exception): > pass > @@ -50,6 +51,21 @@ def __generate_suppression_list(out_file): > # header for cppcheck > supplist_file.write("*:*generated/compiler-def.h\n") > > + try: > + exclusion_file = \ > + > "{}/docs/misra/exclude-list.json".format(settings.repo_dir) > + exclusion_list = \ > + > exclusion_file_list.load_exclusion_file_list(exclusion_file) > + except ExclusionFileListError as e: > + raise CppcheckDepsPhaseError( > + "Issue with reading file {}: {}".format(exclusion_file, > e) > + ) > + > + # Append excluded files to the suppression list, using * as > error id > + # to suppress every findings on that file > + for path in exclusion_list: > + supplist_file.write("*:{}\n".format(path)) > + > for entry in headers: > filename = entry["file"] > try: > @@ -128,7 +144,7 @@ def generate_cppcheck_deps(): > --relative-paths={} > --inline-suppr > --suppressions-list={}/suppression-list.txt > - --suppress='unmatchedSuppression:*generated/compiler-def.h' > + --suppress='unmatchedSuppression:*' > --include={}/include/xen/config.h > -DCPPCHECK > """.format(settings.outdir, CPPCHECK_BUILD_DIR, settings.xen_dir, > diff --git a/xen/scripts/xen_analysis/exclusion_file_list.py > b/xen/scripts/xen_analysis/exclusion_file_list.py > new file mode 100644 > index 000000000000..871e480586bb > --- /dev/null > +++ b/xen/scripts/xen_analysis/exclusion_file_list.py > @@ -0,0 +1,70 @@ > +#!/usr/bin/env python3 > + > +import os, glob, json > +from . import settings > + > +class ExclusionFileListError(Exception): > + pass > + > + > +def __cppcheck_path_exclude_syntax(path): > + # Prepending * to the relative path to match every path where the Xen > + # codebase could be > + path = "*" + path > + > + return path > + > + > +# Reads the exclusion file list and returns a list of relative path to be > +# excluded. > +def load_exclusion_file_list(input_file): > + ret = [] > + try: > + with open(input_file, "rt") as handle: > + content = json.load(handle) > + entries = content['content'] > + except json.JSONDecodeError as e: > + raise ExclusionFileListError( > + "JSON decoding error in file {}: {}".format(input_file, e) > + ) > + except KeyError: > + raise ExclusionFileListError( > + "Malformed JSON file: content field not found!" > + ) > + except Exception as e: > + raise ExclusionFileListError( > + "Can't open file {}: {}".format(input_file, e) > + ) > + > + for entry in entries: > + try: > + path = entry['rel_path'] > + except KeyError: > + raise ExclusionFileListError( > + "Malformed JSON entry: rel_path field not found!" > + ) > + abs_path = settings.xen_dir + "/" + path > + check_path = [abs_path] > + > + # If the path contains wildcards, solve them > + if '*' in abs_path: > + check_path = glob.glob(abs_path) > + > + # Check that the path exists > + for filepath_object in check_path: > + if not os.path.exists(filepath_object): > + raise ExclusionFileListError( > + "Malformed path: {} refers to {} that does not exists" > + .format(path, filepath_object) > + ) > + > + if settings.analysis_tool == "cppcheck": > + path = __cppcheck_path_exclude_syntax(path) > + else: > + raise ExclusionFileListError( > + "Unimplemented for {}!".format(settings.analysis_tool) > + ) > + > + ret.append(path) > + > + return ret > -- > 2.34.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |