Gcc 为什么C允许丢失函数声明?

Gcc 为什么C允许丢失函数声明?,gcc,linker,valgrind,Gcc,Linker,Valgrind,今天我们遇到了一个不寻常的现象,一位同事在他的代码中调用了一个行为正常的函数,这在libc(gethostbyname)中触发了一个segfault。令人费解的是,同一个函数在同一个运行时的其他源文件中正常工作。令人惊讶的是,当使用valgrind时,segfault消失了,事实上,它与valgrind一起工作非常完美,没有错误报告 为了安抚编译器,我们做出了很多牺牲,最终意识到调用函数的源文件中缺少了声明函数的头文件。一旦我们加入这个,一切都正常运行 为什么gcc/ld没有生成一个错误(甚至一

今天我们遇到了一个不寻常的现象,一位同事在他的代码中调用了一个行为正常的函数,这在libc(gethostbyname)中触发了一个segfault。令人费解的是,同一个函数在同一个运行时的其他源文件中正常工作。令人惊讶的是,当使用valgrind时,segfault消失了,事实上,它与valgrind一起工作非常完美,没有错误报告

为了安抚编译器,我们做出了很多牺牲,最终意识到调用函数的源文件中缺少了声明函数的头文件。一旦我们加入这个,一切都正常运行

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


谢谢。

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

PS:C不允许缺少功能(必须诊断未解析的符号)。我冒昧地将标题改为“缺少函数声明”。很难说。缺少的原型是标准C函数的原型吗,可能是malloc()?这个函数的名字是什么?它是一个简单的C函数,当时是projectBeats me的本地函数;我对瓦尔格兰德只有模糊的了解,一点点知识是危险的。。。所以我最好不要猜测。经验法则:尽可能提高警告级别。建议
-Wall
-Werror
。这两个选项将使你成为一名更好的程序员。@sherrellbc同意,但请注意,
-Wall
不包括此答案中提到的警告标志。