On Wed, 2020-09-02 at 23:38 +0200, Julia Lawall wrote:
> On Wed, 2 Sep 2020, Joe Perches wrote:
> > On Wed, 2020-09-02 at 22:46 +0200, Julia Lawall wrote:
> > > On Wed, 2 Sep 2020, Joe Perches wrote:
> > > > On Sun, 2020-08-30 at 20:41 +0200, Julia Lawall wrote:
> > > > > On Sun, 30 Aug 2020, Joe Perches wrote:
> > > > > > On Sun, 2020-08-30 at 17:46 +0200, Julia Lawall wrote:
> > > > > > > Unfortunately this does not work when the declaration
> > > > > > is comma terminated and not semicolon terminated.
> > > > []
> > > > > I will have to look into it.  It should handle this sort of thing, 
> > > > > but it
> > > > > is somewhat complex, because the declarations have to be split and 
> > > > > this
> > > > > specific case may not be handled.
> > > > 
> > > > Thanks.  Hope you can get to look at that one day.
> > > > 
> > > > > One thing that is possible is to change only the variable name.  If 
> > > > > there
> > > > > are not many occurrences, one could fix them up afterwards by hand.
> > > > 
> > > > And hi again Julia.
> > > > 
> > > > I've tried a few variations on finding uses of a function
> > > > argument that are not by specific named functions or with
> > > > local assignment of that function argument to another
> > > > variable without success.
> > > > 
> > > > For example:
> > > > 
> > > > ssize_t fn(struct device *dev, struct device_attribute *attr, char *buf)
> > > > {
> > > > *       char *orig = buf;
> > > > or
> > > >         int count;
> > > > ...
> > > > *       count = local_static_func(some_struct *foo, buf);
> > > > }
> > > > 
> > > > where local_static_func is not sysfs_emit or sysfs_emit_at
> > > > 
> > > > Any clue you can offer?
> > > 
> > > I'm not completely sure what is wanted.
> > 
> > I want to identify places where the 3rd argument
> > to any sysfs "show" function is used other than
> > by the converted sysfs_emit and sysfs_emit_to calls.
> > 
> > For instance, this assignment of p to buf
> > 
> > drivers/isdn/mISDN/dsp_pipeline.c-static ssize_t
> > drivers/isdn/mISDN/dsp_pipeline.c-attr_show_args(struct device *dev, struct 
> > device_attribute *attr, char *buf)
> > drivers/isdn/mISDN/dsp_pipeline.c-{
> > drivers/isdn/mISDN/dsp_pipeline.c-      struct mISDN_dsp_element *elem = 
> > dev_get_drvdata(dev);
> > drivers/isdn/mISDN/dsp_pipeline.c-      int i;
> > drivers/isdn/mISDN/dsp_pipeline.c-      char *p = buf;
> > drivers/isdn/mISDN/dsp_pipeline.c-
> > drivers/isdn/mISDN/dsp_pipeline.c:      *buf = 0;
> > drivers/isdn/mISDN/dsp_pipeline.c-      for (i = 0; i < elem->num_args; i++)
> > drivers/isdn/mISDN/dsp_pipeline.c-              p += sprintf(p, "Name:      
> >   %s\n%s%s%sDescription: %s\n\n",
> > drivers/isdn/mISDN/dsp_pipeline.c-                           
> > elem->args[i].name,
> > drivers/isdn/mISDN/dsp_pipeline.c-                           
> > elem->args[i].def ? "Default:     " : "",
> > drivers/isdn/mISDN/dsp_pipeline.c-                           
> > elem->args[i].def ? elem->args[i].def : "",
> > drivers/isdn/mISDN/dsp_pipeline.c-                           
> > elem->args[i].def ? "\n" : "",
> > drivers/isdn/mISDN/dsp_pipeline.c-                           
> > elem->args[i].desc);
> > drivers/isdn/mISDN/dsp_pipeline.c-
> > drivers/isdn/mISDN/dsp_pipeline.c-      return p - buf;
> > drivers/isdn/mISDN/dsp_pipeline.c-}
> > 
> > so that this could (likely manually) be converted to:
> > 
> > static ssize_t attr_show_args(struct device *dev, struct device_attribute 
> > *attr, char *buf)
> > {
> >     struct mISDN_dsp_element *elem = dev_get_drvdata(dev);
> >     int len = 0;
> > 
> >     for (i = 0; i < elem->num_args; i++) {
> >             len += sysfs_emit(buf, len, "Name:        
> > %s\n%s%s%sDescription: %s\n\n",
> >                               elem->args[i].name,
> >                               elem->args[i].def ? "Default:     " : "",
> >                               elem->args[i].def ? elem->args[i].def : "",
> >                               elem->args[i].def ? "\n" : "",
> >                               elem->args[i].desc);
> >     }
> > 
> >     return len;
> > }
> > 
> > And any use of buf passed to another function:
> > 
> > drivers/macintosh/macio_sysfs.c-static ssize_t modalias_show (struct device 
> > *dev,
> > drivers/macintosh/macio_sysfs.c-                              struct 
> > device_attribute *attr,
> > drivers/macintosh/macio_sysfs.c-                              char *buf)
> > drivers/macintosh/macio_sysfs.c-{
> > drivers/macintosh/macio_sysfs.c-        return of_device_modalias(dev, buf, 
> > PAGE_SIZE);
> > drivers/macintosh/macio_sysfs.c-}
> 
> OK, I think that what I suggested could work.

Yes, it did point the way, thanks.

I needed to change the protected block to use a
sysfs_ function specific definition, otherwise
additional similar, but not sysfs <show> function
blocks were also output.

cheers, Joe

----

@dev_protected@
identifier fn,buf;
identifier dev, attr;
position p1,p2;
@@

ssize_t fn@p1(struct device *dev, struct device_attribute *attr, char *buf) {
<...
\(sysfs_emit\|sysfs_emit_at\)(...,buf@p2,...)
...>
}

@@
identifier dev_protected.fn,dev_protected.buf;
position dev_protected.p1;
position p2 != dev_protected.p2;
@@

ssize_t fn@p1(...,char *buf) { <...
*buf@p2
...> }
 


_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to