基于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,因此您可以跳转 发生时。历史记录可用于不同的参数。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
ByteArrayOutputStream的java解码属性   java S3 SDK在上载时更新单个对象,而不是创建新文件   java hibernate:无法从eclipse连接到DB   java如何在强制转换JComboBox之前检查其类型?   http从Java中的GETPOST请求方法捕获URI、资源名称,如开发人员工具中所示   java在Spring@Bean方法中返回接口的局限性   Java中的Web服务和客户端(使用Eclipse Apache Axis 2自底向上服务)某些代码会引发异常   java spring安全+rest不起作用   java将LinkedList添加到包含LinkedList的LinkedList并更改添加的LinkedList   java是否临时删除对象的属性?   java使用AnimatedGifEncoder类创建的gif图像的部分帧是不透明的   java如何高效地处理maven3时间戳快照?   java向集合对象添加另一项   java如何将动态参数传递给jquery函数   java使用libGdx桌面端口作为Android GLES20的仿真器