基于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第三方库


热门话题
具有x86javapath的x64机器上x86java上的java JNI未满足链接错误   java将Pixmap的一部分上传到GPU   图像Java位图RLE8格式   java Android studio谷歌广告崩溃应用程序   java如何创建包含未知数量对象的变量?   Java计算给定int数组的所有可能组合   java JDBC classnotfound异常   httpclient中的java将HttpEntity转换为字符串的最优雅/正确的方法是什么?   如何从Java程序运行nano?   java在安卓中调用自定义类/方法   调用方法和JOptionPane后,允许代码继续执行所需的java计时器或其他想法   关于侦听器的向量Java并发问题   线程池执行器Java线程池   java配置DTO上的Swagger javax验证约束   Java中用于按钮功能的swing操作命令   ServletOutputStream中的java设置状态代码   java打印输入数组的平均值