如何快速确定我的代码使用哪些宏?

时间:2016-11-30 09:48:26

标签: c macros static-analysis dead-code

我已从一个较大的(C)项目中删除了一段代码。这个代码在许多地方定义了许多宏 - 其中一些只用于原始的,更大的代码库,而不是我剪切的部分代码所使用的。

我想快速确定哪些宏在实际使用中,哪些不在(以便我可以删除那些不是)。我不关心使用它们的代码路径是否被采用(即if (1+1 == 3) { MY_MACRO(a,b,c); }是一个用途,就我而言。

这样做的好方法是什么?我能想到的最好的方法是使用-E预处理所有内容并查找以某种方式提及宏的源位置注释。

备注:

  • 如果您的解决方案也列出了正在使用的功能,那也没关系。
  • 我只是直接调用我从项目中删除的代码中的某些函数。如果您的解决方案可以将列出的宏限制为许多实际从入口点调用的函数中的宏,那就更好了
  • 我的代码编译并运行(如果有帮助,你可以假设gprof输出)
  • 只是评论出所有的宏,虽然显然是可行的,但却很麻烦;所以我想要一个不需要我这样做的解决方案。
  • 预处理器排除的代码未使用;但是如果你有一个没有遵守这个限制的解决方案,那就更好了。
  • 我不想"dump the list of preprocessor defines" - 而是定义正在使用的

1 个答案:

答案 0 :(得分:3)

存在名为pp-traceclang工具。它输出每个预处理器调用及其参数。

您对MacroExpands事件感兴趣,在pp-trace输出中看起来如此:

...

- Callback: MacroExpands
  MacroNameTok: X_IMPL
  MacroDirective: MD_Define
  Range: [(nonfile), (nonfile)]
  Args: [a <plus> y, b]

...

MacroNameTok块中提取MacroExpands应该可以帮到你。