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)

Reply via email to