Coccinelle Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: vladimir_zapolskiy@mentor.com (Vladimir Zapolskiy)
To: cocci@systeme.lip6.fr
Subject: [Cocci] Matching from upper level struct
Date: Thu, 21 May 2015 15:21:12 +0300	[thread overview]
Message-ID: <555DCDB8.3050600@mentor.com> (raw)
In-Reply-To: <alpine.DEB.2.10.1505202254470.2642@hadrien>

Hello Julia,

thank you for helpful and fast response.

On 20.05.2015 23:58, Julia Lawall wrote:
> 
> 
> On Wed, 20 May 2015, Vladimir Zapolskiy wrote:
> 
>> Hello Julia,
>>
>> please excuse me for a newbie question, I'm trying to find a way how to
>> match an assignment done from embracing struct or union.
>>
>> If you consider this C code sample:
>>
>> ----8<----
>> static void a(void) {};
>>
>> struct x {
>> 	void (*u)(void);
>> };
>>
>> struct y {
>> 	struct x v;
>> };
>>
>> struct x k = {
>> 	.u = a,
>> };
>>
>> struct y l = {
>> 	.v = {
>> 		.u = a,
>> 	},
>> };
>> ----8<----
>>
>> where "struct x" type is known and "struct y" may be arbitrary/unknown,
>> and I would like to match both assignments.
>>
>> My na?ve rule finds only k.u assignment:
>>
>> ----8<----
>> @@
>> struct x X;
>> identifier value;
>> @@
>>
>> * X.u = value;
>> ----8<----
>>
>> I believe it should not be a problem for me to get access to ".u", if I
>> get ".v" identifier firstly, but here I encounter a problem, probably
>> because "{ .u = a, }" above is not considered as a valid expression to
>> be matched in a rule like ".f = E,".
>>
>> Any help is appreciated, thank you in advance.
> 
> Could you live with the following?
> 
> @@
> struct x X;
> identifier value;
> @@
> 
> * X.u = value;
> 
> @parent@
> identifier y,v;
> @@
> 
> struct y {
>         ...
>         struct x v;
>         ...
> };
> 
> @@
> identifier l,parent.y,parent.v;
> struct y X;

Just to share my level of comprehension, I don't quite understand what
the line above is needed for.

> identifier value;
> @@
> 
> struct y l = {
>         .v = {
> *                .u = value,
>         },
> };
> 
> -----------------------------------
> 
> This will work for the case of a struct field inside a struct field, but
> not more levels of nesting. 

Much better than nothing and I got the idea, thank you so much. It might
be a good improvement to coccinelle, if any level of nesting can be
technically supported (if it is not).

I ported the code to my actual project, and it works well, though spatch
1.0.0-rc24 produces a warning even on toy example above:

  (ONCE) warning: struct/union with a metavariable name detected.
  (ONCE) For type checking assuming the name of the metavariable is the
name of the type

> Do you expect the assignments to all be in structures, or sometimes
> in ordinary assignments?  If you expect always structures, perhaps
> rewrite the first rule to mention structures.  If there can be
> ordinary assignments, you can leave it as is.

Yes, my intention is to cover both cases, actually ordinary assignments
is the main case, but then I found that the discussed case is not
covered by my rule.

> But you may want to make a second copy without the ; if there is the
> possibility that such an assignment could be part of another
> expression, and thus without the ;.  The ; though is necessary
> to get the isomorphism with structure field assignments.
> 

In my particular situation it is unlikely, but I tested it and works as
expected.

Thank you for the great tool!

--
With best wishes,
Vladimir

  reply	other threads:[~2015-05-21 12:21 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-20 20:35 [Cocci] Matching from upper level struct Vladimir Zapolskiy
2015-05-20 20:58 ` Julia Lawall
2015-05-21 12:21   ` Vladimir Zapolskiy [this message]
2015-05-21 17:32     ` Julia Lawall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=555DCDB8.3050600@mentor.com \
    --to=vladimir_zapolskiy@mentor.com \
    --cc=cocci@systeme.lip6.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox