[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 8 Nov 2022, at 11:48, Jan Beulich <jbeulich@xxxxxxxx> wrote: > > On 08.11.2022 11:59, Luca Fancellu wrote: >>> 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>" >>> }, >> >> Yes it’s a bit redundant but it helps re-using the same tool we use for >> safe.json > > I guess the tool could also be made cope without much effort. I can modify the script to take an additional parameter to distinguish between safe.json and false-positive-*.json, then call twice the script and append the result to the .sed file. > >>>> @@ -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? >> >> Yes, how about this, it will filter out *.safparse files while keeping in >> only .h and .c: >> >> PARSE_FILE_LIST := $(addsuffix .safparse,$(filter %.c %.h,\ >> $(shell grep -ERl '^[[:blank:]]*\/\*[[:space:]]+SAF-.*\*\/$$' >> $(srctree)))) > > That's better, but still means touching all files by grep despite now > only a subset really looked for. If I was to use the new goals on a > more or less regular basis, I'd expect that this enumeration of files > doesn't read _much_ more stuff from disk than is actually necessary. Ok would it be ok? PARSE_FILE_LIST := $(addsuffix .safparse,$(shell grep -ERl --include=\*.h \ --include=\*.c '^[[:blank:]]*\/\*[[:space:]]+SAF-.*\*\/$$' $(srctree))) > >>> 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. >> >> We saw that mv is not preserving the timestamp of the file, instead we would >> like to preserve >> it, for this reason we used cp -p > > Buggy mv? It certainly doesn't alter timestamps here, and I don't think > the spec allows for it doing so (at least when it doesn't need to resort > to copying to deal with cross-volume moves, but those can't happen here). Yes you are right, my assumption was wrong, I will change the code as you suggested. > >>>> + 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. >> >> Yes, here my aim was to catch analysis-build-{eclair,coverity}, here I see >> that if the user has a typo >> the rule will run anyway, but it will be stopped by the dependency chain >> because at the end we have: >> >> JUSTIFICATION_FILES := $(XEN_ROOT)/docs/misra/safe.json \ >> $(XEN_ROOT)/docs/misra/false-positive-$$*.json >> >> That will give an error because >> $(XEN_ROOT)/docs/misra/false-positive-<typo>.json does not exists. >> >> If you think it is not enough, what if I reduce the scope of the rule like >> this? >> >> _analysis-coverity _analysis-eclair: _analysis-%: analysis-build-% > > But then, without using the stem, how does it know whether to do an > Eclair or a Coverity run? Sorry I think I’m a bit lost here, the makefile is working on both analysis-coverity and analysis-eclair because the % is solving in coverity or eclair depending on which the makefile has in input, it is not complaining so I guess it works. Do you see something not working? If so, are you able to provide a piece of code for that to make me understand? > >> Or, if you are still worried about “analysis-build-%: >> analysis-parse-tags-%”, then I can do something >> like this: >> >> analysis-supported-coverity analysis-supported-eclair: >> @echo > /dev/null >> >> analysis-supported-%: >> @error Unsupported analysis tool @* >> >> analysis-build-%: analysis-parse-tags-% | analysis-supported-% >> $(MAKE) O=$(abs_objtree) -f $(srctree)/Makefile build > > If I'm not mistaken support for | doesn't exist in make 3.80 (the > minimum version we require to be used). IDK, we use order-only prerequisite already in the Makefile. > >>>> +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. >> >> In any case, the cleaning process is very safe and does not clean anything >> that was not dirty before, >> so in case of typos, it’s just like a nop. > > People may put transient files in their trees. Of course they need to be > aware that when they specify a "clean" target their files may be deleted. > But without any "clean" target specified nothing should be removed. *.safparse files are not supposed to be used freely by user in their tree, those files will be removed only if the user calls the “analysis-clean” target or if the analysis-coverity or analysis-eclair reaches the end (a process that creates *.safparse). There is no other way to trigger the “analysis-clean” unintentionally, so I’m not sure about the modification you would like to see there. > > Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |