|
[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>"
>> },
About this, I’ve investigated a bit and I don’t think this is the right
solution, it wouldn't make
much sense to have a schema where in one file the analyser dictionary key is
the tool name
and in another it is a version (or range of versions).
However I can remove the analyser dictionary and use this schema for the
false-positive, which is
more compact:
|{
| "version": "1.0",
| "content": [
| {
| "id": "SAF-0-false-positive-<tool>",
| “tool-proprietary-id”: "<proprietary-id>”,
| "tool-version": "<version>",
| "name": "R20.7 [...]",
| "text": "[...]"
| },
| {
| "id": "SAF-1-false-positive-<tool>",
| “tool-proprietary-id”: "",
| "tool-version": "",
| "name": "Sentinel",
| "text": "Next ID to be used"
| }
| ]
|}
This needs however a change in the initial design and more documentation on the
different handlings
of the safe.json schema and the false-positive-<tool>.json schema. Is it worth?
> On 9 Nov 2022, at 08:31, Jan Beulich <jbeulich@xxxxxxxx> wrote:
>
> On 08.11.2022 18:13, Luca Fancellu wrote:
>>> On 8 Nov 2022, at 15:49, Jan Beulich <jbeulich@xxxxxxxx> wrote:
>>> On 08.11.2022 15:00, Luca Fancellu wrote:
>>>>> 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:
>>>>>>>> @@ -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)))
>>>
>>> Hmm, not sure: --include isn't a standard option to grep, and we
>>> generally try to be portable. Actually -R (or -r) isn't either. It
>>> may still be okay that way if properly documented where the involved
>>> goals will work and where not.
>>
>> Is a comment before the line ok as documentation? To state that —include and
>> -R are not standard options so analysis-{coverity,eclair} will not work
>> without a
>> grep that takes those parameters?
>
> A comment _might_ be okay. Is there no other documentation on how these
> goals are to be used? The main question here is how impacting this might
> be to the various environments we allow Xen to be built in: Would at
> least modern versions of all Linux distros we care about allow using
> these rules? What about non-Linux?
>
> And could you at least bail when PARSE_FILE_LIST ends up empty, with a
> clear error message augmenting the one grep would have issued?
An empty PARSE_FILE_LIST should not generate an error, it just means there are
no
justifications, but I see it can be problematic in case grep does not work.
What about this? They should be standard options right?
PARSE_FILE_LIST := $(addsuffix .safparse,$(shell find $(srctree) -type f \
-name '*.c' -o -name '*.h' -exec \
grep -El '^[[:blank:]]*\/\*[[:space:]]+SAF-.*\*\/$$' {} + ))
>
>>> And then - why do you escape slashes in the ERE?
>>>
>>> Talking of escaping - personally I find backslash escapes harder to
>>> read / grok than quotation, so I'd like to recommend using quotes
>>> around each of the two --include (if they remain in the first place)
>>> instead of the \* construct.
>>
>> Ok I’ve removed the escape from the * and also from slashes:
>>
>> PARSE_FILE_LIST := $(addsuffix .safparse,$(shell grep -ERl --include='*.h' \
>> --include='*.c' '^[[:blank:]]*/\*[[:space:]]+SAF-.*\*/$$' $(srctree)))
>
> Good - seeing things more clearly now my next question is: Isn't
> matching just "/* SAF-...*/" a little too lax? And is there really a
> need to permit leading blanks?
I’m permitting blanks to allow spaces or tabs, zero or more times before the
start of
the comment, I think it shall be like that.
About matching, maybe I can match also the number after SAF-, this should be
enough,
[…] grep -El '^[[:blank:]]*\/\*[[:space:]]+SAF-[0-9]+.*\*\/$$’ […]
>
>>>>>>>> + 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?
>>>
>>> Well, my problem is that I don't see how the distinction is conveyed
>>> without the stem being used. With what you say I understand I'm
>>> overlooking something, so I'd appreciate some explanation or at least
>>> a pointer.
>>
>> Ok, I have that eclair and coverity shares the same commands to be executed
>> by the build system,
>> so instead of duplicating the targets for coverity and eclair and their
>> recipe, I’ve used the pattern rule
>> to have that these rules:
>>
>> JUSTIFICATION_FILES := $(XEN_ROOT)/docs/misra/safe.json \
>> $(XEN_ROOT)/docs/misra/false-positive-$$*.json
>>
>> […]
>>
>> .SECONDEXPANSION:
>> $(objtree)/%.sed: $(srctree)/tools/xenfusa-gen-tags.py $(JUSTIFICATION_FILES)
>> […]
>>
>> […]
>>
>> analysis-parse-tags-%: $(PARSE_FILE_LIST) $(objtree)/%.sed
>> […]
>>
>> analysis-build-%: analysis-parse-tags-%
>> $(MAKE) O=$(abs_objtree) -f $(srctree)/Makefile build
>>
>> analysis-clean:
>> […]
>>
>> _analysis-%: analysis-build-%
>> $(Q)$(MAKE) O=$(abs_objtree) -f $(srctree)/Makefile analysis-clean
>>
>> Matches the case where 'make analysis-coverity’ or ‘make analysis-eclair’ is
>> called.
>>
>> Now, please correct me if my assumption on the way make works are wrong,
>> here my assumptions:
>>
>> For example when ‘make analysis-coverity’ is called we have that this rule
>> is the best match for the
>> called target:
>>
>> _analysis-%:
>
> So my main oversight was your addition to main-targets, which makes the
> connection with this underscore-prefixed goal.
>
> As to you saying "best match" - I didn't think make had such a concept
> when it comes to considering pattern rules. Aiui it is "first match", in
> the order that rules were parsed from all involved makefiles.
Yes first match is the right term.
>
>> So anything after _analysis- will be captured with % and this will be
>> transferred to the dependency
>> of the target that is analysis-build-% -> analysis-build-coverity
>>
>> Now analysis-build-coverity will be called, the best match is
>> analysis-build-%, so again the dependency
>> which is analysis-parse-tags-%, will be translated to
>> analysis-parse-tags-coverity.
>>
>> Now analysis-parse-tags-coverity will be called, the best match is
>> analysis-parse-tags-%, so the % will
>> Have the ‘coverity’ value and in the dependency we will have
>> $(objtree)/%.sed -> $(objtree)/coverity.sed.
>>
>> Looking for $(objtree)/coverity.sed the best match is $(objtree)/%.sed,
>> which will have $(JUSTIFICATION_FILES)
>> and the python script in the dependency, here we will use the second
>> expansion to solve
>> $(XEN_ROOT)/docs/misra/false-positive-$$*.json in
>> $(XEN_ROOT)/docs/misra/false-positive-coverity.json
>>
>> So now after analysis-parse-tags-coverity has ended its dependency it will
>> start with its recipe, after it finishes,
>> the recipe of analysis-build-coverity will start and it will call make to
>> actually build Xen.
>
> Okay, I see now - this building of Xen really _is_ independent of the
> checker chosen. I'm not sure though whether it is a good idea to
> integrate all this, including ...
>
>> After the build finishes, if the status is good, the analysis-build-coverity
>> has finished and the _analysis-coverity
>> recipe can now run, it will call make with the analysis-clean target,
>> restoring any <file>.{c,h}.safparse to <file>.{c,h}.
>
> ... the subsequent cleaning. The state of the _source_ tree after a
> build failure would be different from that after a successful build.
> Personally I consider this at best surprising.
>
> I wonder whether instead there could be a shell(?) script driving a
> sequence of make invocations, leaving the new make goals all be self-
> contained. Such a script could revert the source tree to its original
> state even upon build failure by default, with an option allowing to
> suppress this behavior.
Instead of adding another tool, so another layer to the overall system, I would
be more willing to add documentation
about this process, explaining how to use the analysis-* build targets, what to
expect after a successful run and what
to expect after a failure.
What do you think?
Cheers,
Luca
>
> Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |