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

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


> 在 2017年10月13日,下午10:09,杨已彪 <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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://systeme.lip6.fr/pipermail/cocci/attachments/20171013/08137e33/attachment.html>


More information about the Cocci mailing list