Re: Coccinelle
Samuel Abraham <[email protected]> Mon, 31 Mar 2025 14:16:39 +0100
| Newsgroups | dev.linux.lists.outreachy |
|---|---|
| Message-ID | <CADYq+fby2sPRqG9r+Q1NhYhYEgkSy_=8+xbUQ5+y+ELCD70Y-Q@mail.gmail.com> |
On Mon, Mar 31, 2025 at 9:52 AM Julia Lawall <[email protected]> wrote: > > > > On Mon, 31 Mar 2025, Samuel Abraham wrote: > > > On Sun, Mar 30, 2025 at 3:56 PM Julia Lawall <[email protected]> wrote: > > > > > > Hello, > > > > > > The actual internship project will involve using Coccinelle. Some warm up > > > examplesin using Coccinelle are available at the following URL: > > > > > > https://who.paris.inria.fr/Julia.Lawall/outreachy25/ > > > > Hello Julia, > > I have been studying the SmPL examples and some documentation. > > But I have some questions as regards the flow of execution of the SmPL. > > > > Firstly, I found out you are the writer and maintainer of Coccinelle, and I just > > want to say a job well done. > > Thanks :) > > > Looking at the first example of the SmPL, > > > > @initialize:ocaml@ => This defines an ocaml function > > @@ > > > > let same_function p q = > > (List.hd p).Coccilib.current_element = (List.hd > > q).Coccilib.current_element. => This checks if both p and q belong to > > the same function > > Actually, this defines any data that you want to be global to the semantic > patch execution. It is also possible to define a finalize that is > executed after all of the files have been handled. Okay that is like @finalize:python@? > > You can also use python. Then it would be eg initialize:python. That's great. > > > > > @r@. => Defines a named rule 'r' > > Yes. You dont' have to name all your rules. But if you want to refer to > the metavariables defined in this rule from a later rule, then this rule > needs a name. This is understood > > > expression e; => matches an expression > > position p; => Does this store the match's position like the > > line number in the file? > > Yes. You can also get the function name and the starting and ending lines > of the containing function. Okay, I think that was done in the third SmPL example. > > > symbol true,false; > > @@ > > > > e =@p \(true\|false\) > > This line above is where I am majorly confused. > > Please clarify: Are we setting the value of the expression to true or > > false and storing the position of the match? > > This rule doesn't say it is an ocaml or python script, so it's a pattern > matching rule. This is matching an assignment where the right hand side > is either true or false. The left hand side is any expression e. You can Oh I get now. So we are not assigning \(true\|false\) to e rather, we are defining what to match on both the left and right hand side of an assignment. > also write the true or false pattern as: > > ( > true > | > false > ) > > where the ( | ) are in column 0. Outside column 0, without \, they are > interpreted as somethign to match in the code. > > > > > @@ > > expression r.e; => Here, we are referencing the expression in > > rule 'r' to replace the expression we have matched? > > e is going to be an expression, but now it has to look the same as the one > matched in rule r. It doesn't have to be at the same position, though. Oh, Noted, so we specify that the expression e looks the same as the one in rule r. We are not modifying the one matched earlier > > > position q : script:ocaml(r.p) { same_function p q }; => we are > > setting position q if it the same as position p from the same_function > > r.p is the position that was noted in rule r. Here we want to note a > position and see if that position is in the same function as r.p. The > idea here is that we may have x = true and then we may have x = 1. But if > the second x is declared in a different function than the first x, then it > might be the case that the second one is really intended to be an integer. > So we take x = true as evidence that x should be a boolean only when the > two occurrences of x are in the same function. > Okay this is understood too > This is of course a heuristic. You can try something different, for > example getting rid of q entirely, and see what the result is. Okay I will do that. > > > @@ > > > > e =@q > > ( > > - 1 > > + true > > | > > - 0 > > + false > > ) > > > > Then this line above replaces the 1 with true or 0 with false in the > > expression that had been set previously above. > > But my question is, are we setting the value of e =@p \(true\|false\) > > No. Pattterns don't change anything. The only way to change the state is > to write OCeml or python code (script:ocaml or script:python). Okay noted. > > > or it just a place holder that will be replaced by any expression > > we match > > Then we can now check the matched expression if it is 0 and replace > > with true and if is 1 we replace with false? > > The two matches of e are intrinsically at different places in the code, > since in one case there is true and in the other case there is 1 (or false > or 0). Okay this is very well understood now > > > > > @s@ > > type T; > > T e; > > identifier fld; > > symbol true,false; > > @@ > > > > e.fld = \(true\|false\) ==> Same question applies here too > > Same answer. No assignment is executed here. We find a random > expression of some type, and this expression has some random structure > field named fld. The whole thing is found somewhere to be assigned to > true or to false in the source code. > > I hope it's clearer now. You may want to try running it on some small > example to see what it does. Yes it is much clearer now. I will try that Thanks a lot Adekunle.