今天我们遇到了一个不寻常的现象,一位同事在他的代码中调用了一个正常运行的函数,这触发了 libc (gethostbyname) 中的段错误。令人费解的是,相同的函数在同一运行时的其他源文件中运行没有问题。令人惊讶的是,当使用 valgrind 时,段错误消失了,事实上,它与 valgrind 完美配合,没有报告任何错误。
为了安抚编译器之神,我们做出了很多牺牲,最终意识到调用该函数的源文件中缺少声明该函数的头文件。一旦我们添加了这个,一切就正常了。
为什么 gcc/ld 没有生成错误(甚至警告)来指示该函数未被识别?为什么它可以与 valgrind 一起使用?
Thanks.
因为您没有使用正确的警告选项,例如-Wall -Wmissing-prototypes -Wstrict-prototypes
。默认情况下,gcc 在接受的内容上相当自由。
C语言(至少C89)有这样的概念隐式函数声明,其中没有原型的函数具有从函数调用中第一次使用派生的返回类型和参数列表,并且缺少该列表,它返回 int 并接受未指定但固定数量的参数(即不能是可变参数函数) 。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)