为什么C语言能够容忍缺失的函数声明?

3
今天我们遇到了一个不寻常的现象,同事在他的代码中调用了一个通常表现良好的函数,但却触发了libc(gethostbyname)的segfault。令人困惑的是,在相同的运行时中,其他源文件中同样的函数可以正常工作而没有问题。令人惊讶的是,在使用valgrind时,segfault消失了,实际上,它与valgrind一起完美地工作,没有报告任何错误。
经过我们许多向编译器神灵献祭的努力,我们最终意识到调用该函数的源文件缺少声明该函数的头文件。一旦我们添加了它,一切都正常运行。
为什么gcc / ld没有生成指示未识别该函数的错误(甚至警告)?为什么它在valgrind下工作?
谢谢。

1
PS:C 不允许缺失的函数(必须诊断未解决的符号)。我自行更改了标题为“缺失函数声明”。 - Jens
1个回答

9
由于你没有使用正确的警告选项,例如-Wall -Wmissing-prototypes -Wstrict-prototypes,所以出现了这个问题。默认情况下,gcc接受的标准比较宽松。 C语言(至少C89)有隐式函数声明的概念,即没有原型的函数在第一次调用时返回类型和参数列表从中推断出来,如果没有这个,则返回int并采用未指定但固定数量的参数(即不能是可变参数函数)。

很难说。缺失的原型是标准C函数吗?也许是malloc()函数?这个函数的名字是什么? - Jens
它是一个简单的 C 函数,只在该项目中使用。 - Gearoid Murphy
1
那我也不知道了;我只对valgrind有一点模糊的了解,而且“一知半解”是很危险的...所以我最好不要猜测。经验法则:尽可能提高警告级别。 - Jens
建议使用-Wall-Werror。这两个选项会让你成为一个更好的程序员。 - sherrellbc
@sherrellbc 同意,但请注意 -Wall 不包括本答案提到的警告标志。 - Zitrax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接