为什么C容忍缺少函数声明?

时间:2012-07-27 12:11:10

标签: gcc linker valgrind

我们今天遇到了一个不寻常的现象,一位同事在他的代码中调用了一个通常表现良好的函数,该函数触发了libc(gethostbyname)中的段错误。令人费解的是,同一个函数在同一运行时的其他源文件中没有遇到麻烦。令人惊讶的是,当使用valgrind时,segfault消失了,事实上,它与valgrind完美配合,没有报告错误。

经过多次牺牲以安抚编译器之后,我们最终意识到声明该函数的头文件在调用该函数的源文件中丢失了。一旦我们添加了这个,一切都正常运行。

为什么gcc / ld没有生成错误(甚至是警告),表明函数未被识别?为什么它与valgrind一起工作?

感谢。

1 个答案:

答案 0 :(得分:8)

因为您没有使用正确的警告选项,例如-Wall -Wmissing-prototypes -Wstrict-prototypes。默认情况下,gcc在接受的内容方面非常自由。 C语言(至少是C89)具有隐式函数声明的概念,其中没有原型的函数具有返回类型和从函数调用中首次使用而得到的arg列表,并且缺少该函数,它返回int并获取一个未指定但固定数量的参数(即不能是vararg函数)。

相关问题