2012-07-27 53 views
2

今天我们遇到了一个不寻常的现象,一位同事在他的代码中调用了一个通常行为正常的函数,这个函数在libc(gethostbyname)中触发了段错误。令人费解的是,同一个函数在同一运行时在其他源文件中工作没有问题。令人震惊的是,当使用valgrind时,segfault消失了,事实上,它与valgrind完美结合,没有报告错误。C为什么容忍缺少函数声明?

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

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

谢谢。

+1

PS:C不允许丢失功能(必须诊断未解析的符号)。我冒昧地将标题改为“缺少函数*声明*”。 – Jens 2012-07-27 12:32:53

回答

8

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

+0

良好的信息,谢谢,它为什么与valgrind合作? – 2012-07-27 12:38:24

+0

很难说。是标准C函数的缺失原型,或许是malloc()?这个函数的名字是什么? – Jens 2012-07-27 12:45:11

+0

这是一个本地项目的简单C函数 – 2012-07-27 12:51:54