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.

>
> 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
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to