On Wed, 10 Jan 2018 09:40:19 +0100 (CET)
Julia Lawall <[email protected]> wrote:
> On Tue, 9 Jan 2018, Rob Hoelz wrote:
>
> > Hi Coccinelle community,
> >
> > I just discovered Coccinelle a few days ago, and already my mind is
> > reeling with the possibilities. I'm doing some work porting the
> > Claws Mail mail client to GTK3, and I think Coccinelle would be a
> > great tool to use to accomplish this task.
> >
> > One of the thing I'm trying to use Coccinelle to do is to detect
> > and patch string concatenation via string literal juxtaposition;
> > for example:
> >
> > > ...
> > > GTK_STOCK_NO, "+" GTK_STOCK_YES, NULL);
> >
> > I would like to write a spatch that does something like the
> > following:
> >
> > > @@
> > > constant char *stock_constant =~ "^GTK_STOCK";
> > > @@
> > >
> > > -"+" stock_constant
> > > +stock_constant
> >
> > For starters, Coccinelle doesn't seem to recognize string
> > juxtaposition (spatch gives me an error when I try this); secondly,
> > I can't seem to get "constant char *p" to match *any* string
> > literals. For example, take this simple test program:
> >
> > > int
> > > main(void)
> > > {
> > > const char *p = "bar";
> > > return 0;
> > > }
> >
> > If I just use "constant p", it'll match the 0 literal in the return
> > statement. I can use "constant int p" to make only that 0 match,
> > but I'd like to match the "bar" string literal, and "constant char
> > *p" doesn't seem to work. Is there some way I can get Coccinelle
> > to match only string literals to a metavariable?
>
> It's constant char[] c. A string is an array.
/me facepalms
Of course! What a silly mistake on my part =/ Thanks for clarifying for me!
>
> >
> > Another quick question: is there a way to tell Coccinelle to dump
> > its AST so I can see which type an expression has been assigned?
> > Having such a tool might help me get more familiar with the tool!
>
> No there is nothing like this. There is a BNF in the documentation
> (http://coccinelle.lip6.fr/docs/index.html).
> People don't find it very user-friendly, but for example here:
>
> http://coccinelle.lip6.fr/docs/main_grammar010.html
>
> you can see that there are possibilities like:
>
> exp metaidAssignOp exp
> exp metaidBinOp exp
> metaidExp
> metaidConst
>
> Unfortunately, none of those names actually correspond to the way in
> which one declares those metavariables, which are assignment operator
> x, binary operator x, expression, and constant, respectively.
>
> It may be helpful to look at the examples in http://coccinellery.org/
>
> For the concatenated strings, unfortunately the patern matching
> language doesn't support that. The only thing you can do is match
> the full string, and then do some magic with python to get out the
> parts you want. I'm not sure that this is the best first project.
>
> julia
>
Thanks for the quick answer, Julia! I'll try to undertake something a little
simpler to start.
-Rob
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci