从 C 源代码中删除特定函数的所有实例

Strip all instances of specific function(s) from C source

背景

我有一个测试应用程序涉及来自多个独立承包商的库。每个承包商都编写了一个库,该库使用我已经提供的通用日志记录 API。在构建时,我可以传递一个标志来完全优化日志记录调用,因为它们是包装我们底层 fprintf() 包装器的预处理器宏。

产品需求变更现在要求两个承包商可以以有限的方式查看彼此的代码库。


问题

独立签约团队使用的某些代码的日志记录语句必须在团队之间共享之前从代码中清除,因为它可能包含我们未获许可在之间共享的知识 属性团队(即:解释一些晦涩的算法是如何工作的)。


问题

如何在 Linux 上(使用 BAShsedVIMawk 等)去除某个特定对象的所有实例从源函数。一些示例:

logToClient("Something wrong with process %s (owner = %d).\n", 
    pName, iOwner);
 
logToClientVerbose("Big problem.");

我试过编写一些 python 脚本来创建遇到的所有 () 字符的“堆栈”,但它不能 100% 工作时间,我希望有一个简单的正则表达式单行魔术可以实现这一目标。

谢谢。

考虑这个测试文件:

$ cat file.c
logToClient2("keep this");
logToClient("Something wrong with process %s (owner = %d).\n", pName, iOwner);
logToClientVerbose("Big problem.");
logToClientVerb("Keep Verb.");

要删除对您要删除的两个函数的所有引用:

$ grep -vwE 'logToClient|logToClientVerbose' file.c
logToClient2("keep this");
logToClientVerb("Keep Verb.");

工作原理:

  • -v 告诉 grep 删除匹配的行。

  • -w 告诉 grep 只匹配整个单词。

  • -E 告诉 grep 使用扩展正则表达式:这样我们就不必转义 |.

  • logToClient|logToClientVerbose 匹配 logToClientlogToClientVerbose

局限性:这不会解析C。这只会删除具有匹配词的行。

命令分布在多行

考虑这个测试文件:

$ cat file2.c
logToClient2("keep this");
logToClient("Something wrong with process %s (owner = %d).\n", 
      pName, iOwner);
logToClientVerbose("Big problem.");
logToClientVerb("Keep Verb.");

此 awk 命令将文件分成记录,这些记录由分号和换行符组成的记录分隔符标记。它会删除所有与 logToClientlogToClientVerbose:

中的一个单词匹配的记录
$ awk '!/\<(logToClient|logToClientVerbose)\>/' RS=';\n' ORS=';\n' file2.c
logToClient2("keep this");
logToClientVerb("Keep Verb.");

限制:不解析C,只删除匹配词的记录。例如,这会被一行上的多个命令或分号后有空格的行混淆。