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