[Cocci] use Coccinelle to perform "queries" on C code
Julia Lawall
julia.lawall at lip6.fr
Thu Mar 1 08:03:18 CET 2012
On Thu, 1 Mar 2012, David Wagner wrote:
> On 29/02/2012 07:29, Julia Lawall wrote:
>> On Wed, 29 Feb 2012, David Wagner wrote:
>
>> With Coccinelle, you can make arbitrarily complicated matches. Look at
>> the examples on the webiste. They are a bit oriented towards bug
>> finding, but you should get the idea.
>>
>>> I also imagined it could be possible to parse the code and build an
>>> SQL database from it but I'm not sure that it is fit and I can only
>>> begin to imagine all the problems I would run into.
>>
>> You can also use python or ocaml to insert information into a database.
>
> Do you know of someone who has done that or is it just a suggestion ? Maybe
> it could be worth a try once I manage to get a grasp at spatch. It's great
> that there is a Python support; that will save me some effort (or you could
> say it's a shame I won't have to learn OCaml) :)
We have done that. We just used the programming language to run the
appropriate shell command. Actually we tried that option and the option
of printing the commands to a file and then running that file. The latter
has the advantage that when something goes wrong withyour database, you
can just rerun the file. But the file can take up a lot of disk space.
>
>>
>> Here is your semantic patch, using ocaml scripting:
>>
>> @initialize:ocaml@
>> let tbl = Hashtbl.create 101
>>
>> @match@
>> identifier virtual.func;
>> expression e1,e2;
>> @@
>>
>> func(e1,e2)
>>
>> @script:ocaml@
>> e2 << match.e2;
>> @@
>>
>> if not (Hashtbl.mem tbl e2) then Hashtbl.add tbl e2 ()
>>
>> @finalize:ocaml@
>> let elements =
>> Hashtbl.fold (fun key _ rest -> key :: rest) tbl [] in
>> Printf.printf "(%s)" (String.concat ", " elements)
>>
>> func is a virtual identifier so you can give it on the command line:
>>
>> spatch -sp_file david.cocci -D func=usb_submit_urb -dir /path/to/linux
>>
>> gives
>>
>> (flags, GFP_KERNEL, gfp_flags, GFP_ATOMIC, mf, gfp, mem_flags, GFP_NOIO,
>> gfp_mask, f)
>
> Awesome !
> I guess it could be possible with something like
> "
> e2 = x
> ...
> func(e1,e2)
> "
> to be sometimes able to get the real value of gfp_flags, for instance ?
Yes.
> Is "nesting"/"including" spatches possible ?
Not sure what you mean. I think you can say include "foo.cocci" if you
have some code you want to use in many rules, but I'm not sure that that
is what you mean.
julia
> Anyway, I will explore the possibilities of Coccinelle and find out by
> myself.
>
>>
>> If you want to do this on a large code base, you may want to run glimpse
>> or idutils on it first to improve efficiency. For glimpse, there is
>> coccinelle/scripts/glimpseindex_cocci.sh to use the right options. Then
>> run coccinelle with --use-glimpse. Glimpse is not free software though.
>> I guess you just run it in the normal way and then use the option
>> --use-idutils with spatch.
>
> ok
>
>>
>> julia
>
>
> Thanks a lot for your help !
> David.
>
>
More information about the Cocci
mailing list