Re: [cocci] [PATCH] add usage-strings ci check and amend remaining usage strings
- From
- Julia Lawall <julia.lawall@inria.fr>
- Date
- Feb 25, 2022, 15:36 UTC
- Message-ID
- <alpine.DEB.2.22.394.2202251630510.2577@hadrien>
- In-Reply-To
- <nycvar.QRO.7.76.6.2202251601040.11118@tvgsbejvaqbjf.bet>
On Fri, 25 Feb 2022, Johannes Schindelin wrote:
Show 39 quoted lines
> Hi Julia, > > On Tue, 22 Feb 2022, Julia Lawall wrote: > > > [I]f there are some cases that are useful to do statically, with only > > local information, then using Coccinelle could be useful to get the > > problem out of the way once and for all. Coccinelle doesn't support > > much processing of strings directly, but you can always write some > > python code to test the contents of a string and to create a new one. > > > > Let me know if you want to try this. You can also check, eg the demo > > demos/pythontococci.cocci to see how to create code in a python script and > > then use it in a normal SmPL rule. > > > > If some context has to be taken into account and the context in the same > > function, then that can also be done with Coccinelle, eg > > > > A > > ... > > B > > > > matches the case where after an A there is a B on all execution paths > > (except perhaps those that end in an error exit) and > > > > A > > ... when exists > > B > > > > matches the case where there is a B sometime after executing A, even if > > that does not always occur. > > > > If the context that you are interested in is in a called function or is in > > the calling context, then Coccinelle might not be the ideal choice. > > Coccinelle works on one function at a time, so to do anything > > interprocedural, you have to do some hacks. > > Right. The code in question is not actually calling a function, but a > macro, and passes a literal string to the macro that we would want to > check statically.
Coccinelle doesn't care about whether a function is called or whether a macro is called. It considers everything to be a function.
> > I did have my doubts that it would be easy with Coccinelle, but since Ævar > seemed so confident, I tried it, struggled, and decided to follow up with > you.
Something like this:
@r1@ expression e; @@
N(e)
@script:python s@ e << r1.e; replacement; @@
if string_ok e then cocci.include_match(False) else coccinelle.replacement = "\"better string\""
@@ expression r1.e; expression s.replacement; @@ - N(e) + N(replacement)
------------------
You can fill in the definition of string_ok and better string. I think the \" will be necessary, because the value of an expression metavariable at the python level is a string, so there should be a string inside of it to make it a string expression.
julia