[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


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Luca Fancellu <Luca.Fancellu@xxxxxxx>
  • Date: Wed, 9 Nov 2022 10:08:41 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=PFgrpnWSFpfvRhlcpXkoJqz4ZjsqYqDXmVuWeM49ugg=; b=Hjd6FWvmgV7tlEE6o4E/10+MHRix3D00HpCAdRHnFM2CZqbBPPppijB9hSAT6OV33xZTeQfAdrRh4MkrgHIDs0POkhthVdWbnnJjYESEzRlRFtjj4SMxmKl/BW9ErakZYNZLvHm9ENUTZ1GI6JVQOyARPFzQjRkD57lu3uinhOap4eeKlzKpzt9B+7RomJhLAlJKKK74qjl9kO973fKnZM6Lxq6kkO7IPMVWtn2+DmY7LrLl3+DamBUdswxnODaAnDqmbk7ed4YrdmHPH95nsJQe99YMygLpgSsD/SQDyRpwA/xOIMgBhq3GLGqHXF3fOhVfZWSvhyTZCr78kefvRQ==
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=PFgrpnWSFpfvRhlcpXkoJqz4ZjsqYqDXmVuWeM49ugg=; b=IVvf+HikqifRrytUI4syO4v7jDuz/N9wSHPvXYS2x5XF5tILVVznzhWH1oa/GUR0MchZxaos6vdjBF8KgytLFqs74p+Zvaik0pYmiMYagxaREDjvp7A+hUIXDuBux3L8D3kjT9XrT1h59UF3FGjRkKF61xVFQdEsbT2T6RXagS6a7/r6v349lp5eiM+pTkjuVugESIRX9EhkXfuH9QPXi9uofw+rlqyN6Omh2vFSke3/oOKC/2ICO3/LxsfmoSneIMQv5WcgYvM1faZUGTKGdpec921iFwLJRgBzSIuogLUIxYTrD2JKgG6qM0u4XteJvUKdpr0a90llXbiaFay++Q==
  • Arc-seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=QUAH8PBiUL/VhcDHlibd2YVzZsRQFheVfRLnM30xrpbW8m3Yv4jtDTOwY27nCTXJnc7UlbIHevQmbTfedEcEMhXWgTjdkj2TVwFRcp5RbuVDeDtG6MA8Np+uwsD1KFWpFAPLFzkxKMc2rax0aA68iHS/iuCt+pSl9As0Kja6lrNegPLd1JdO644ECYNDFBrMgjZxhaM6bn5boXCdRVSwP+XAMIN3qqs96gcBFdCr4466dXU3Tr4BvoilCFQ42M0UHbtkBd8qHoCZdV2//ee0CddiVeJTRzu1aJtgDNk49cvS61G/hWG9gwifNchTNLsyGSjZ95EioO72ACYM6Igs9w==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eLqxrXhPaTDklMlrQeKrq06ZhnblxDFV/m+t2LQHhZS4k9mIzG5xTCH4NpLtBVlwDMf9DxQpE2hyt393IwzSI4myxx6fdw2/YsQ5c7FJtf40NBIYXjqbkATIFkGeIpPrF1sPdIn1RDo0pRR4+2GAOjz5IVPgG+QLOTE22uPflD9KoQTq9GLgQ20h3liyOOpBZPr4xjD8ncNKZgip2+7QGM7o6PRLsfDm7WJmta8nNFqxsVZH9i7h8sddbu+3gHht2Jpic/7cbhrpUQwYW7Sbj9gXEohwrNeH5iuMQhAezJn0VdU2YozLBI6rSX1Len/EY3rvlYpfKbo3u95qbh0L5A==
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, Wei Chen <Wei.Chen@xxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, George Dunlap <george.dunlap@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Wed, 09 Nov 2022 10:09:11 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Original-authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Thread-index: AQHY8pZ008DS0BACDkyhs+OWN8Oan64zqLWAgAE0WoCAAA3SgIAAJOMAgAAeVoCAABeCgIABAHkAgAAbOoA=
  • Thread-topic: [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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.