基于coccinelle的c语言语义grep
coccigrep的Python项目详细描述
简介
coccigrep是基于coccinelle的c语言语义grep。 (http://coccinelle.lip6.fr)。它可以用来查找给定的 结构用于代码文件。coccigrep依赖于spatch coccinelle附带的程序。
用法
运行coccigrep-h获取完整选项。
示例
要查找在一组文件中使用名为packet类型的位置,请 可以运行
$ coccigrep -t Packet *c source-af-packet.c:272: p = ptv->in_p; source-af-packet.c:300: p->datalink = ptv->datalink; source-af-packet.c:758: switch(p->datalink) {
如果要在结构上匹配,则需要提供完整的名称
coccigrep -t 'struct seq_file' fs/seq_file.c fs/seq_file.c:654 (struct seq_file *seq): seq = f->private_data; fs/seq_file.c:655 (struct seq_file *seq): seq->private = private; fs/seq_file.c:537 (struct seq_file *m): if (m->count < m->size) {
要查找文件集中的位置,结构中使用datalink属性 命名为packet,您只需执行
$ coccigrep -t Packet -a datalink *c source-af-packet.c:300: p->datalink = ptv->datalink; source-af-packet.c:758: switch(p->datalink) { source-erf-dag.c:525: p->datalink = LINKTYPE_ETHERNET;
如果要更精确地查找该属性的设置位置,可以使用 操作标志(-o)。它的一个值是set这表示我们只需要 设置属性的匹配项
$ coccigrep -t Packet -a datalink -o set source*c source-af-packet.c:300: p->datalink = ptv->datalink; source-erf-dag.c:525: p->datalink = LINKTYPE_ETHERNET;
安装
coccigrep的依赖性是伴随coccinelle而来的spatch。在python方面,您 需要setuptools和可选的pygments(用于彩色输出)。快乐的debian用户可以做到
aptitude install python-setuptools python-pygments
要安装coccigrep,请运行
sudo python ./setup.py install
配置
从0.8版开始,coccigrep可以通过配置文件进行配置。完整的样品 配置文件在src/coccinelle.cfg中可用。
层次结构
配置文件系统是分层的,以下文件按此顺序进行分析
- host config in /etc/coccigrep
- user config in ~/.coccigrep
- directory config in .coccigrep
因此,例如,目录配置设置将覆盖主机配置设置。
有趣的选择
在全局部分中,并发级别是最有趣的。它编码 将并行启动的spatch命令。如果搜索多个文件,则 以稍微增加内存使用为代价显著提高性能。
如果要添加自己的语义修补程序,只需将它们放在 与所需操作名称匹配的名称(zeroed.cocci将导致zeroed操作)。 然后在全局部分中添加指向此目录的local_cocci_dir。
有关编写语义补丁的描述,请参见coccigrep homepage。
其他选项更明确,是关联命令行选项的直接映射。
在vim中运行coccigrep
要在vim中使用cocci grep,可以使用 编辑器目录。这样你就可以简单地将它复制到你的插件目录中 通常是~/.vim/plugin/。如果您的coccigrep脚本不在 path,您可以使用coccigrep_path变量来给出完整的路径。为了 例如,您可以添加到您的.vimrc
let g:coccigrep_path = '/usr/local/bin/coccigrep'
然后您可以运行类似于
:Coccigrep :Coccigrep Packet datalink source-*.c :Coccigrep Packet datalink set source-*.c
第一个命令将交互地询问值。第二个将搜索所有 数据包结构的数据链路属性的取消引用。最后一个会 查看对数据包的datalink属性执行set操作的位置。得到 在系统上的操作列表中,您可以运行coccigrep-l或查看 在交互模式下请求操作输入时提供的列表。
匹配项将出现在快速修复列表和与第一个 匹配将在相应行打开。请注意,您可以在 基于标记的结构和属性名称(由make tags生成)。
要在vim中对非命名结构运行搜索,必须引用空格和 因此运行类似于
:Coccigrep "struct nfq_data" s*c
请注意,在交互模式下,不需要报价。
您还可以设置全局变量coccigrep_文件
:let g:coccigrep_files = '~/myproject/src/flist'
其中flist是与-l选项对应的文件。 然后您可以运行类似于
:Coccigrep Packet :Coccigrep Packet datalink set
也就是说,您不需要提供前面示例的最后一个参数。 这在设置vim的autochdir选项时特别有用。
在emacs中运行coccigrep
要在emacs中使用cocci grep,您需要加载编辑器中提供的cocci grep.el模块 源代码的目录。例如,如果将其复制到~/.emacs.d/site lisp/中,则 可以
(add-to-list 'load-path "~/.emacs.d/site-lisp/") (require 'cocci-grep)
然后您可以运行类似于
Meta+x cocci-grep
并回答以下问题
- Type: The structure type you are searching
- Attribut: The attribute in the structure
- Operation: The operation on the structure. The set of commands include set,used,func,test,deref
- Files: A blob expression that will match the file you want to search in
匹配项将出现在缓冲区中,模式设置为grep mode,因此您可以跳转 发生时。历史记录可用于不同的参数。