On Fri, 25 Feb 2022, Johannes Schindelin wrote: > 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