|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH 1/4] xen/Makefile: add analysis-coverity and analysis-eclair
On 07.11.2022 11:47, Luca Fancellu wrote:
> +Here is an example to add a new justification in false-positive-<tool>.json::
With <tool> already present in the name, ...
> +|{
> +| "version": "1.0",
> +| "content": [
> +| {
> +| "id": "SAF-0-false-positive-<tool>",
> +| "analyser": {
> +| "<tool>": "<proprietary-id>"
... can we avoid the redundancy here? Perhaps ...
> +| },
> +| "tool-version": "<version>",
... it could be
"analyser": {
"<version>": "<proprietary-id>"
},
? It's not really clear to me though how a false positive would be
correctly recorded which is present over a range of versions.
> --- a/xen/Makefile
> +++ b/xen/Makefile
> @@ -457,7 +457,8 @@ endif # need-config
>
> __all: build
>
> -main-targets := build install uninstall clean distclean MAP cppcheck
> cppcheck-html
> +main-targets := build install uninstall clean distclean MAP cppcheck \
> + cppcheck-html analysis-coverity analysis-eclair
> .PHONY: $(main-targets)
> ifneq ($(XEN_TARGET_ARCH),x86_32)
> $(main-targets): %: _% ;
> @@ -572,7 +573,7 @@ _clean:
> rm -f $(TARGET).efi $(TARGET).efi.map $(TARGET).efi.stripped
> rm -f asm-offsets.s arch/*/include/asm/asm-offsets.h
> rm -f .banner .allconfig.tmp include/xen/compile.h
> - rm -f cppcheck-misra.* xen-cppcheck.xml
> + rm -f cppcheck-misra.* xen-cppcheck.xml *.sed
Is *.sed perhaps a little too wide? But yes, we can of course deal with that
in case any *.sed file appears in the source tree.
> @@ -757,6 +758,51 @@ cppcheck-version:
> $(objtree)/include/generated/compiler-def.h:
> $(Q)$(CC) -dM -E -o $@ - < /dev/null
>
> +JUSTIFICATION_FILES := $(XEN_ROOT)/docs/misra/safe.json \
> + $(XEN_ROOT)/docs/misra/false-positive-$$*.json
> +
> +# The following command is using grep to find all files that contains a
> comment
> +# containing "SAF-<anything>" on a single line.
> +# %.safparse will be the original files saved from the build system, these
> files
> +# will be restored at the end of the analysis step
> +PARSE_FILE_LIST := $(addsuffix .safparse,$(filter-out %.safparse,\
> +$(shell grep -ERl '^[[:blank:]]*\/\*[[:space:]]+SAF-.*\*\/$$' $(srctree))))
Please indent such line continuations. And then isn't this going to risk
matching non-source files as well? Perhaps you want to restrict this to
*.c and *.h?
> +.PRECIOUS: $(PARSE_FILE_LIST) $(objtree)/%.sed
> +
> +.SECONDEXPANSION:
I have to admit that I'm a little worried of this living relatively early in
the script.
> +$(objtree)/%.sed: $(JUSTIFICATION_FILES) $(srctree)/tools/xenfusa-gen-tags.py
> + $(PYTHON) $(srctree)/tools/xenfusa-gen-tags.py \
> + $(foreach file, $(filter %.json, $^), --input $(file)) --output
> $@ \
> + --tool $*
To reduce redundancy, how about
$(objtree)/%.sed: $(srctree)/tools/xenfusa-gen-tags.py $(JUSTIFICATION_FILES)
$(PYTHON) $< --output $@ --tool $* \
$(foreach file, $(filter %.json, $^), --input $(file))
?
> +%.safparse: %
For this to not be overly widely matching, maybe better
$(PARSE_FILE_LIST): %.safparse: %
?
> +# Create a copy of the original file (-p preserves also timestamp)
> + $(Q)if [ -f "$@" ]; then \
> + echo "Found $@, please check the integrity of $*"; \
> + exit 1; \
> + fi
> + $(Q)cp -p "$*" "$@"
While you use the full source name as the stem, I still think $< would be
more clear to use here.
To limit work done, could this me "mv" instead of "cp -p", and then ...
> +analysis-parse-tags-%: $(PARSE_FILE_LIST) $(objtree)/%.sed
> + $(Q)for file in $(patsubst %.safparse,%,$(PARSE_FILE_LIST)); do \
> + sed -i -f "$(objtree)/$*.sed" "$${file}"; \
... with then using
sed -f "$(objtree)/$*.sed" "$${file}.safparse" >"$${file}"
here? This would then also have source consistent between prereqs and
rule.
> + done
> +
> +analysis-build-%: analysis-parse-tags-%
> + $(MAKE) O=$(abs_objtree) -f $(srctree)/Makefile build
This rule doesn't use the stem, so I'm struggling to understand what
this is about.
> +analysis-clean:
> +# Reverts the original file (-p preserves also timestamp)
> + $(Q)find $(srctree) -type f -name "*.safparse" -print | \
> + while IFS= read file; do \
> + cp -p "$${file}" "$${file%.safparse}"; \
> + rm -f "$${file}"; \
Why not "mv"?
> + done
> +
> +_analysis-%: analysis-build-%
> + $(Q)$(MAKE) O=$(abs_objtree) -f $(srctree)/Makefile analysis-clean
Again no use of the stem, plus here I wonder if this may not lead to
people invoking "analysis-clean" without having said anything about
cleaning on their command line.
> --- /dev/null
> +++ b/xen/tools/xenfusa-gen-tags.py
> @@ -0,0 +1,81 @@
> +#!/usr/bin/env python
> +
> +import sys, getopt, json
> +
> +def help():
> + print('Usage: {} [OPTION] ...'.format(sys.argv[0]))
> + print('')
> + print('This script converts the justification file to a set of sed
> rules')
> + print('that will replace generic tags from Xen codebase in-code
> comments')
> + print('to in-code comments having the proprietary syntax for the
> selected')
> + print('tool.')
> + print('')
> + print('Options:')
> + print(' -i/--input Json file containing the justifications, can be')
> + print(' passed multiple times for multiple files')
> + print(' -o/--output Sed file containing the substitution rules')
> + print(' -t/--tool Tool that will use the in-code comments')
> + print('')
> +
> +# This is the dictionary for the rules that translates to proprietary
> comments:
> +# - cppcheck: /* cppcheck-suppress[id] */
> +# - coverity: /* coverity[id] */
> +# - eclair: /* -E> hide id 1 "" */
> +# Add entries to support more analyzers
> +tool_syntax = {
> + "cppcheck":"s,^.*/*[[:space:]]*TAG.*$,/* cppcheck-suppress[VID] */,g",
> + "coverity":"s,^.*/*[[:space:]]*TAG.*$,/* coverity[VID] */,g",
> + "eclair":"s,^.*/*[[:space:]]*TAG.*$,/* -E> hide VID 1 \"\" */,g"
> +}
> +
> +def main(argv):
> + infiles = []
> + justifications = []
> + outfile = ''
> + tool = ''
> +
> + try:
> + opts, args =
> getopt.getopt(argv,"hi:o:t:",["input=","output=","tool="])
> + except getopt.GetoptError:
> + help()
> + sys.exit(2)
> + for opt, arg in opts:
> + if opt == '-h':
> + help()
> + sys.exit(0)
> + elif opt in ("-i", "--input"):
> + infiles.append(arg)
> + elif opt in ("-o", "--output"):
> + outfile = arg
> + elif opt in ("-t", "--tool"):
> + tool = arg
> +
> + # Open all input files
> + for file in infiles:
> + try:
> + handle = open(file, 'rt')
> + content = json.load(handle)
> + justifications = justifications + content['content']
> + handle.close()
> + except json.JSONDecodeError:
> + print('JSON decoding error in file: ' + file)
> + except:
> + print('Error opening ' + file)
> + sys.exit(1)
> +
> + try:
> + outstr = open(outfile, "w")
> + except:
> + print('Error creating ' + outfile)
> + sys.exit(1)
> +
> + for j in justifications:
> + if tool in j['analyser']:
> + comment=tool_syntax[tool].replace("TAG",j['id'])
> + comment=comment.replace("VID",j['analyser'][tool])
> + outstr.write('{}\n'.format(comment))
> +
> + outstr.close()
> +
> +if __name__ == "__main__":
> + main(sys.argv[1:])
> \ No newline at end of file
Nit: ^^^
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |