如何实现标准C函数提取?

时间:2010-11-19 04:46:56

标签: c function standards

我有一个“a $$中的痛苦”任务来提取/解析main()函数中调用的所有标准C函数。例如:printf,fseek等......

目前,我唯一的计划是读取main()中的每一行,并通过检查我将定义的标准C函数列表来搜索是否存在标准C函数(#define CFUNCTIONS“printf ...” )

如你所知,有很多标准C函数,所以定义所有这些函数会非常烦人。

关于如何检查字符串是否为标准C函数的任何想法?

4 个答案:

答案 0 :(得分:1)

如果您听说过cscope,请尝试查看它生成的数据库。 cscope前端有指令可列出给定函数调用的所有函数。

如果查看main()中的调用列表,您应该可以大大缩小工作范围。

如果您必须手动解析,我建议从包含的标准标题开始。他们应该对你在main()中看到哪些函数给你一个体面的想法。

无论哪种方式,这项工作听起来都非常重要而且很有趣。

答案 1 :(得分:1)

解析C源代码乍一看似乎很简单,但正如其他人所指出的那样,程序员使用#define#include s远离皮带的可能性相当普遍。除非知道要解析的特定程序在文本替换方面是温和的,否则解析任意C源代码的复杂性是相当大的。

考虑使用较少但更有效的解析对象模块的策略。编译源模块,但不要链接它。为了进一步简化,重新处理包含main的文件以删除所有其他函数,但在其位置保留声明。

根据要求,有两种方法可以完成任务:

  1. 编写一个程序,打开对象模块并遍历外部参考符号表。如果符号与其中一个有趣的函数名称匹配,请列出它。许多平台都有用于解析对象模块的库函数。
  2. 编写使用开发人员工具检查对象模块的命令文件或脚本。例如,在Linux上,命令nm列出了带有U
  3. 的外部引用

答案 2 :(得分:0)

首先,任务可能看起来很简单,但为了真正100%确定你需要解析C文件。仅查找名称是不够的,您还需要知道上下文,即何时检查id,首先当您确定id是一个函数时,您可以检查它是否是标准的c-runtime函数。

(加上我想这会让任务变得更有趣: - )

答案 3 :(得分:0)

我认为没有任何方法可以定义标准C函数列表来完成您的任务。但它比那更烦人 - 考虑宏, 例如:

#define OUTPUT(foo) printf("%s\n",foo)

main()
{
   OUTPUT("Ha ha!\n");
}

因此,您可能希望在检查之前通过预处理器运行代码 从main()调用哪些函数。然后你可能会遇到这样的情况:

some_func("This might look like a call to fclose(fp), but surprise!\n");

因为字符串文字,所以你可能需要一个完整的解析器来严格执行此操作 可能跨越多行。

我不会提出三元组......那只是毫无意义的虐待狂。 :-)无论如何,祝你好运,编码愉快!