On Fri, 2011-02-18 at 09:03 +0100, ext Nicolas Palix wrote:
> Hi,
>
> On Fri, Feb 18, 2011 at 4:04 AM, Oliver McFadden
> <[email protected]> wrote:
> Hi Nicolas,
>
> I think your solution is closest; I really should learn the
> SmPL grammar
> properly... Unfortunately it doesn't seem to work. I did
> receive a
> warning:
>
> warning: line 8: should client be a metavariable?
>
> I guess in this case it doesn't matter because the variable in
> the
> example is actually named "client", but this might not always
> be the
> case.
>
> Indeed. I need the client declaration to give you the proper client
> metavariable declaration
> if you care about typing, otherwise you just need to add "identifier
> client" to the set of metavariable.
Well, I could look that up from the headers. It should just be a
standard C structure.
However, the problem is your SmPL code below does not work. You can try
it on the example code I've attached. I'd appreciate any help in getting
it working correctly. :-)
>
>
>
> Here's a real-world code segment from the X server:
>
> int main(void)
> {
> xRRGetScreenSizeRangeReply rep;
> /* normally lots of code here */
> WriteToClient(client, sizeof(xRRSetScreenConfigReply),
> (char *)&rep);
> }
>
> So I would want to match on the WriteToClient line, see that
> "rep" (could be named anything) is passed to WriteToClient,
> then change
> it's variable definition to a macro:
>
> The fact that "rep" could be named otherwise is already handle by the
> "foobar" metavariable
> of my previous SmPL example.
Yes.
>
>
>
> REPLY(xRRSetScreenConfigReply);
> /* normally lots of code here */
> WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char
> *)&rep);
>
> Btw, thanks for the help!
>
> Am I correct in assuming that "rep" is now a constant ?
Yes, I intend to have the REPLY macro always expand to a variable named
"rep" (or "reply" -- I can easily change that myself in the SmPL code.)
>
> --8<--------------------------------------------------->8----------------------------------
>
> @@
> type T;
> identifier foobar;
> identifier client;
> @@
> -T foobar;
> +REPLY(T);
> ...
> -WriteToClient(client, sizeof(T), &foobar);
> +WriteToClient(client, sizeof(T), &rep);
>
> --8<--------------------------------------------------->8----------------------------------
>
>
>
> -- Oliver.
>
>
> On Wed, 2011-02-16 at 13:27 +0100, ext Nicolas Palix wrote:
> > Hi,
> >
> > Does the following SmPL code do what you want ?
> > Or did I miss something in your explanation ?
> >
> > @@
> > type T;
> > identifier foobar;
> > @@
> > -T foobar;
> > +REPLY(T);
> > ...
> > -WriteToClient(client, sizeof(T), &foobar);
> > +WriteToClient(client, sizeof(T), &rep);
> >
> > The type and identifier are meta-variables
> > but "rep" is constant, as it is defined in your macro.
> >
> >
> > On Wed, Feb 16, 2011 at 11:32 AM, Julia Lawall
> <[email protected]> wrote:
> > On Wed, 16 Feb 2011, Oliver McFadden wrote:
> >
> > > Hi,
> > >
> > > I'm quite new to Coccinelle but it seems to be an
> excellent
> > tool,
> > > however, I have a question about how to use it to
> do what I
> > need.
> > >
> > > I have a bunch of code that looks like this
> (inside a
> > function):
> > >
> > > xFoobarReply foobar;
> > > /* many lines of code */
> > > WriteToClient(client, sizeof(xFoobarReply),
> &foobar);
> > >
> > > I would like to transform these into (note change
> of foobar
> > to rep):
> > >
> > > REPLY(xFoobarReply);
> > > /* many lines of code */
> > > WriteToClient(client, sizeof(xFoobarReply), &rep);
> > >
> > > Then the REPLY macro is defined to expand to:
> > > xFoobarReply rep; memset(&rep, 0,
> sizeof(xFoobarReply);
> > >
> > > But note that I must only match on calls to
> WriteToClient. I
> > know how I
> > > could change the WriteToClient line easily, but
> not how to
> > change the
> > > declaration of one of it's arguments?
> >
> >
> > Thank you for your interest in Coccinelle.
> >
> > When you say "change the declaration of one of it's
> > arguments", do you
> > actually mean change the parameter declaration of
> the
> > definition of the
> > WriteToClient function?
> >
> > If so, then perhaps the following page in the wiki
> can help
> > you:
> >
> >
>
> http://cocci.ekstranet.diku.dk/wiki/doku.php?id=parameter_list_matching
> >
> > This is going the other way, from when you have
> information
> > about a
> > parameter argument position and want to adjust the
> > corresponding call
> > sites, but it should be adaptable to what I think
> you want to
> > do.
> >
> > If I have completely missed understanding, please
> write back
> > and I or
> > someone else will get back to you later.
> >
> > julia
> >
> > _______________________________________________
> > Cocci mailing list
> > [email protected]
> > http://lists.diku.dk/mailman/listinfo/cocci
> > (Web access from inside DIKUs LAN only)
> >
> >
> >
> >
> > --
> > Nicolas Palix
> > http://sardes.inrialpes.fr/~npalix/
>
>
>
>
>
>
> --
> Nicolas Palix
> http://sardes.inrialpes.fr/~npalix/
typedef struct {
int fake; /* so I don't have to include lots of things from /usr/include/X11 */
} xRRGetScreenSizeRangeReply;
int main(void)
{
/* this should get changed to:
*
* REPLY(xRRGetScreenSizeRangeReply);
*
* but it doesn't?
*/
xRRGetScreenSizeRangeReply reply;
/* normally lots of code here */
WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char *)&reply);
}
/*
$ spatch -sp_file test.cocci test.c
init_defs_builtins: /usr/share/coccinelle/standard.h
HANDLING: test.c
*/
@@
type T;
identifier foobar;
identifier client;
@@
-T foobar;
+REPLY(T);
...
-WriteToClient(client, sizeof(T), &foobar);
+WriteToClient(client, sizeof(T), &rep);
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)