为什么 C 允许缺少函数声明?

2024-03-26

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

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

为什么 gcc/ld 没有生成错误(甚至警告)来指示该函数未被识别?为什么它可以与 valgrind 一起使用?

Thanks.


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 C 允许缺少函数声明? 的相关文章

  • gcc 和 ld 中与位置无关的可执行文件的 -fPIE 选项是什么?

    它将如何更改代码 例如函数调用 PIE是支持地址空间布局随机化 ASLR http en wikipedia org wiki Address space layout randomization在可执行文件中 在创建PIE模式之前 程序的
  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • #pragma init 和 #pragma fini 在 Linux 上使用 gcc 编译器

    我想构建一些代码 在加载共享库时调用一些代码 我想我会这样做 pragma init my init static void my init do something int add int a int b return a b 所以当我用
  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • C++11正则表达式匹配[重复]

    这个问题在这里已经有答案了 我正在尝试在 C 11 中进行相当简单的正则表达式匹配 使用 gcc 4 7 2 但我遇到了很多麻烦 尝试使用构建模式 std regex unquoted R regex s s regex 导致构造函数抛出一
  • clang 编译器从相同的源生成不同的目标文件

    我有一个简单的 hello world Objective C 库 hello m import
  • Xcode 4 单元测试链接器错误

    注意 使用 GHUnit 不是此问题的可接受答案 我知道大多数人认为 GHUnit 比 Xcode4 OCUnit 更好 但这不是我要问的 我将单独评估 我有一个在 Xcode4 中从头开始创建的 Xcode 项目 在创建过程中选中了 包含
  • C++x0 unique_ptr GCC 4.4.4

    我正在尝试使用 C x0 中的 unique ptr 方法是 include
  • ARM、VFP、浮点、惰性上下文切换

    我正在为 ARM 处理器 Cortex A9 编写操作系统 我正在尝试实现浮点寄存器的延迟上下文切换 这背后的想法是 浮点扩展最初对线程禁用 因此不需要在任务切换上保存浮点上下文 当线程尝试使用浮点指令时 会触发异常 然后 操作系统启用浮点
  • GCC编译非常慢(文件大)

    我正在尝试编译一个大的 C 文件 专门用于 MATLAB mexing C 文件大约 20 MB 可用来自 GCC 错误跟踪器 https gcc gnu org bugzilla attachment cgi id 36632如果你想玩一
  • 在 Objective-C 中使用 GCC C 扩展(语句表达式)进行初始化 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 GNU C 提供了标准 C 中没有的多种语言功能 这些扩展在 C 和 Objective C 中都可用 有一个 GCC C 扩展 称为语句表达式
  • 如何将 GCC 诊断编译指示与 C++ 模板函数一起使用?

    我想使用 g 和 Werror 所以我现在必须禁用我无法控制的第三方库的警告 提供的解决方案http gcc gnu org onlinedocs gcc Diagnostic Pragmas html http gcc gnu org o
  • G++ 错误:“”的类型不完整

    我被迫使用第三方加密狗访问库 该库提供包含文件 sense4 h 其代码如下 if defined WINDOWS define WINAPI define CONST const typedef unsigned char UCHAR t
  • GCC 从 C++ 程序生成的汇编代码中的 .cfi 和 .LFE 是什么?

    我有以下 C 代码 int factorial int n if n 0 return 1 return n factorial n 1 int main void factorial 5 return 0 当我使用 g S Factori
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 基于 MIPS 的 codesourcery 工具链的编译参数?

    我在我的 WIN 7 机器上安装了用于 mips32 架构的 codesourcery 交叉编译工具链 我想首先为我的路由器编译一个基于 MIPS32 的简单 阶乘 二进制文件 在网上搜索了一下 我发现它是基于MIPS32 big endi
  • 在 CMake 中使用 -isystem 而不是 -I

    在使用 gcc 构建时 CMake 是否有任何方法可以强制通过 include directories 或者可能通过不同的函数 指定的路径使用 isystem 标志而不是 I 标志 See http gcc gnu org onlinedo
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc

随机推荐