【问题标题】:Using grep to find function使用 grep 查找函数
【发布时间】:2013-08-07 10:17:42
【问题描述】:

我需要找到system("rm filename") & system("rm -r filename")等函数的用法。

我尝试了grep -r --include=*.{cc,h} "system" .grep -r --include=*.{cc,h} "rm" .,但他们给出的结果太多了。

如何搜索 system("rm x") 的所有实例,其中“x”可以是任何值。 grep 有点新意。

【问题讨论】:

  • grep -r 'system("rm'
  • 我会在该模式中添加一个空格,aragaer。但是无论如何,拨打rmdir 或类似的电话应该很少见。
  • 对于文件,最好使用unlink(2)系统调用或调用system("rmremove(3)库函数

标签: linux unix grep


【解决方案1】:

试试:

grep -E "system\(\"rm [a-zA-Z0-9 ]*\"\)" file.txt

正则表达式[a-zA-Z0-9 ]grep 构建一个模式,它需要在xsystem("rm x") 中找到它。不幸的是,grep 不支持匹配组,因此您需要直接指定要搜索的内容。

【讨论】:

    【解决方案2】:

    一种可能的方法是在 GCC 编译器中工作。您可以为此使用MELT 域特定语言。它为 GCC 的 Gimple 内部表示提供了简单的匹配。

    它比文本解决方案更复杂,但它也可以找到例如在内联和其他优化后调用 system 内部函数。

    因此自定义 GCC 编译器可能不值得为您的情况付出努力,除非您拥有非常大的代码库(例如数百万行源代码)。

    在更简单的基于文本的方法中,您可以通过管道传输两个 grep,例如

       grep -rwn system * | grep -w rm
    

    或者只是

       grep -rn 'system.*rm' *
    

    顺便说一句,在一些足够大的软件中,您可能有很多代码,例如

      char cmdbuf[128];
      snprintf (cmdbuf, sizeof(cmdbuf), "rm %s", somefilepath);
      system (cmdbuf);
    

    在这种情况下,基于grep 的简单文本方法是不够的(除非您在视觉上检查周围的代码)。

    【讨论】:

      【解决方案3】:

      安装ack (http://beyondgrep.com) 你的电话是:

      ack --cc '\bsystem\(.+\brm\rb'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 2015-10-22
        • 1970-01-01
        • 2016-07-16
        • 1970-01-01
        相关资源
        最近更新 更多