[Cocci] How to remove unused global variables by using Coccinelle?

杨已彪 yangyibiao at nju.edu.cn
Fri Oct 13 17:25:19 CEST 2017


> 在 2017年10月13日,下午11:12,杨已彪 <yangyibiao at nju.edu.cn> 写道:
> 
> 
>> 在 2017年10月13日,下午10:09,杨已彪 <yangyibiao at nju.edu.cn <mailto:yangyibiao at nju.edu.cn>> 写道:
>> 
>> Thank you very much. It works.
>> 
>>> 在 2017年10月13日,下午9:59,Julia Lawall <julia.lawall at lip6.fr <mailto:julia.lawall at lip6.fr>> 写道:
>>> 
>>> 
>>> On Fri, 13 Oct 2017, 杨已彪 wrote:
>>> 
>>>> Hello,
>>>> 
>>>> Thanks for this awesome tool - Coccinelle.
>>>> 
>>>> Currently, I am trying to use Coccinelle to remove unused global variables in C source code. While applying the following remove.cocci to test.c , it does not work.
>>>> 
>>>> Can anyone help?
>>>> 
>>>> Thanks.
>>>> ---
>>>> Yibiao
>>>> 
>>>> $ spatch --version
>>>> spatch version 1.0.6 compiled with OCaml version 4.02.3
>>>> Flags passed to the configure script: [none]
>>>> Python scripting support: yes
>>>> Syntax of regular expresssions: PCRE
>>>> 
>>>> $ spatch —in-place -sp-file remove.cocci small.c
>>>> init_defs_builtins: /usr/local/lib/coccinelle/standard.h
>>>> HANDLING: small.c
>>>> 
>>>> $ cat remove.cocci
>>>> @@
>>>> type T;
>>>> identifier i;
>>>> expression E;
>>>> @@
>>>> - static T i = E;
>>>>  ... when != I
>>> 
>>> This doesn't work for various reasons.  First Coccinelle is case
>>> sensitive, so i is different than I.  Also Coccinelle works on one
>>> function at a time.  So you can't use ... to refer to the rest of the
>>> file.  You want something like:
>>> 
>>> @r@
>>> type T;
>>> identifier i;
>>> expression E;
>>> @@
>>> static T i = E;
>>> 
>>> @useful@
>>> identifier r.i;
>>> @@
>>> 
>>> i
>>> 
>>> @depends on !useful@
>>> identifier r.i;
>>> @@
>>> - static T i = E;
>>> 
>>> julia
>>> 
>>>> 
>>>> $ cat small.c
>>>> static int g = 0;
>>>> int main()
>>>> {
>>>>    return 0;
>>>> }
>>>> _______________________________________________
>>>> Cocci mailing list
>>>> Cocci at systeme.lip6.fr <mailto:Cocci at systeme.lip6.fr>
>>>> https://systeme.lip6.fr/mailman/listinfo/cocci <https://systeme.lip6.fr/mailman/listinfo/cocci>
> 
> 
> Btw, how to distinguish global and local variables? 
> In the following, the output include both global variables, functions names, and local variables. 
> 
> What if I only want to output global variables? Thanks.
> 
> @g@
> type T;
> identifier i;
> @@
> T i;
> 
> @script:python depends on g@
> i << g.i;
> @@
> print I
> 
> 
> ——
> Yibiao

Solved by using the global idexpression! Thank you all the same.

@g@
type T;
global idexpression x;
@@
x

@useful@
global idexpression g.x;
@@
x(...)


@script:python depends on g && !useful@
x << g.x;
@@
print x

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://systeme.lip6.fr/pipermail/cocci/attachments/20171013/3c3c0ffe/attachment-0001.html>


More information about the Cocci mailing list