【问题标题】:How to find C functions without a prototype?如何找到没有原型的 C 函数?
【发布时间】:2013-04-05 03:26:19
【问题描述】:

公司政策规定 C 源代码中的每个函数都有一个原型。我继承了一个带有自己的 make 系统的项目(所以我无法在 gcc 或 Visual Studio 上对其进行测试)并发现其中一个文件有一些没有原型声明的静态函数。有没有办法(不一定使用编译器)列出所有 .c 文件中没有原型的所有函数?

【问题讨论】:

  • 静态函数实际上并不需要原型,除非在定义之前调用它们
  • @Paul:是的,但我想它可以让项目经理快速查看可用的功能等。
  • 如果您不能使用其他编译器,出于未知原因,您将不得不获得一个单独的静态分析器工具。市场上所有此类工具都会为您找到所有缺失的原型
  • its own make system - 什么意思?
  • 那么我猜@Lundin 的解决方案适用;除非该编译器可以选择像 gcc 那样检测丢失的原型

标签: c function-prototypes


【解决方案1】:

gcc 有一个选项可以警告你:

gcc -Wmissing-prototypes

您可以将此警告变为错误以停止编译并强制人们修复它:

gcc -Werror=missing-prototypes

如果您只想列出它,可以使用gcc 选项-Wmissing-prototypes 进行编译,并在日志中查找no previous prototype for

根据编辑更新

既然你现在提到你不能使用 gcc,你必须为你当前的编译器找到一个类似的选项。大多数编译器都有这样的选项。从手册页或内置帮助输出开始。

【讨论】:

  • 对不起,如果我没有说清楚,但它有自己的构建系统,所以我无法在 gcc 上测试它。
  • “构建系统”!=“编译器”。我假设这个自定义构建系统使用的任何编译器(gcc/icc/clang/.......)都有各种选项/开关来启用警告/错误/等。这将是开始的地方,即使它不是 gcc...
【解决方案2】:

ctags 可以做到!

--c-kinds=p 生成所有函数原型的列表

--c-kinds=f 生成所有函数定义的列表

现在你只需要比较这些。

diff -u <(ctags -R -x --sort=yes --c-kinds=f | cut -d' ' -f1) <(ctags -R -x --sort=yes --c-kinds=p | cut -d' ' -f1) | sed -n 's/^-//p'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多