相关:《C指针截断问题(形如0xaaaabbbbccccdddd > 0xffffffffccccdddd)》

本篇送给每一位写C/C++的朋友。

实例

试着编译这样一段程序

#include <stdio.h>int *arr;int main()
{arr = malloc(sizeof(int));return 0;
}

编译报错:

$ gcc -g a.c
a.c: In function 'main':
a.c:7:10: warning: implicit declaration of function 'malloc' [-Wimplicit-function-declaration]7 |    arr = malloc(sizeof(int));|          ^~~~~~
a.c:7:10: warning: incompatible implicit declaration of built-in function 'malloc'
a.c:2:1: note: include '<stdlib.h>' or provide a declaration of 'malloc'1 | #include <stdio.h>+++ |+#include <stdlib.h>

问题

问题一:为什么编译器不报错?

  1. malloc在stdlib.h中声明,没有include为什么编译器没有报错。C Standard还没发布的时候,是允许不声明、不定义就使用函数的。为了适配这些老代码编译器是比较宽松的。

问题二:不管这个告警会发生什么?

  1. 编译器会从提供的参数类型中推断出函数的prototype(定义)。在上面例子中,malloc被推断为:int malloc(int, size_t)这是非常危险的!

    • 因为函数指针从int64被截断为int32,而你没收到任何错误提示(只有告警),只有在运行时才会踩坑(发现指针截断了)。
    • 运行时也不一定总会报错,因为如果截断后,指针地址在低地址,32位int能装下,程序是没有任何问题的。
    • 但是一旦函数返回地址在高地址,截断后的int32指向就会有问题,运气好是个非法地址会core,运气不好直接拿到一个能写的地址,就把别的内存踩坏了,非常难查,因为报错的位置逻辑本身应该没有任何问题,内存是被隔空踩坏了!

解决:建议把告警升级为报错(-Werror)

即从gcc -g a.c 升级为 gcc -g a.c -Werror

$ gcc -g a.ca.c: In function 'main':
a.c:7:10: warning: implicit declaration of function 'malloc' [-Wimplicit-function-declaration]7 |    arr = malloc(sizeof(int));|          ^~~~~~
a.c:7:10: warning: incompatible implicit declaration of built-in function 'malloc'
a.c:2:1: note: include '<stdlib.h>' or provide a declaration of 'malloc'1 | #include <stdio.h>+++ |+#include <stdlib.h>2 |

$ gcc -g a.c -Werror
a.c: In function 'main':
a.c:7:10: error: implicit declaration of function 'malloc' [-Werror=implicit-function-declaration]7 |    arr = malloc(sizeof(int));|          ^~~~~~
a.c:7:10: error: incompatible implicit declaration of built-in function 'malloc' [-Werror]
a.c:2:1: note: include '<stdlib.h>' or provide a declaration of 'malloc'1 | #include <stdio.h>+++ |+#include <stdlib.h>2 |
cc1: all warnings being treated as errors

为什么告警warning implicit declaration of function必须修复相关推荐

  1. linux c warning: implicit declaration of function 'strtok_r'解决方案

    解决方法:警告的文件头部 添加 #define _GNU_SOURCE 编译时出现警告 warning: implicit declaration of function 'strtok_r' war ...

  2. warning: implicit declaration of function导致core

    centos上使用gcc编译某程序得到warning: implicit declaration of function 同时写了一个测试程序用到c++库, 因此使用g++编译. 测试程序无问题.  ...

  3. warning: implicit declaration of function ‘sleep’(添加头文件: #include <unistd.h>)

    ubuntu编译c程序报错: warning: implicit declaration of function 'sleep' 解决方法: 添加头文件: #include <unistd.h& ...

  4. keil写代码时遇到的问题——warning:implicit declaration of function XXXX is invalid in C99

    在用keil4写实验的时候,遇到了如标题所示的警告,warning:implicit declaration of function "XXXX" is invalid in C9 ...

  5. warning: implicit declaration of function ‘XXX’; did you mean ‘YYY’? [-Wimplicit-function-declarati

    1. 问题: warning: implicit declaration of function 'XXX'; did you mean 'YYY'? [-Wimplicit-function-dec ...

  6. 隐形声明警告解决//warning: implicit declaration of function ‘XXX’; did you mean ‘YYY’?

    The Problem warning: implicit declaration of function 'XXX'; did you mean 'YYY'? [-Wimplicit-functio ...

  7. 【C语言】warning: implicit declaration of function ‘xxx’ [-Wimplicit-function-declaration] 的解决方法

    Linux开发C语言应用程序,编译出现以下四条warning: warning: implicit declaration of function 'strcmp' [-Wimplicit-funct ...

  8. 【C语言】warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration] 的解决方法

    Linux环境下编译C语言程序,出现警告: warning: implicit declaration of function 'usleep' [-Wimplicit-function-declar ...

  9. 解决C语言函数调用warning: implicit declaration of function ‘‘

    今天在学习函数调用时突然爆出了这个错误,经过查阅得以顺利解决,在此分享给大家. 问题:warning: implicit declaration of function '' 错误原因: 显示这类错误 ...

最新文章

  1. 只有20%的iOS程序员能看懂:详解intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance
  2. 阿里园区生态技术联盟启动大会
  3. 开始食用grpc(之一)
  4. Linux下社交平台,Linux 启动
  5. 【TensorFlow】TensorFlow从浅入深系列之二 -- 教你通过思维导图深度理解深层神经网络
  6. 2013年快要过去了,为新来的2104计划
  7. 关于ssm框架的全部整合(一) 2021.05.09
  8. 华为模拟器ensp与真实机器连接使用的配置内容一
  9. CopyTo 方法详解
  10. 网络安全:系统进程的基本概述
  11. angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传
  12. 舱机器人尾巴毛茸茸_这个毛茸茸的机器人不仅可撸,还会摇尾巴
  13. 苹果自带录屏在哪_苹果如何录屏?Mac录屏的专业方法
  14. SAS学习之基本统计过程
  15. 任天堂国行 Switch OLED 版 评测
  16. CGB2109-Day12-用户模块管理
  17. python mqtt tls_某些程序中TLS证书上的MQTT(Mosquitto)错误
  18. 如何批量创建文件夹并命名
  19. App-Charle抓包配置(https)
  20. 思科CCIE认证有必要考吗

热门文章

  1. python 自动点赞_用Python模拟技巧带你实现自动抽屉登录自动点赞
  2. android 4g手机6,6.5毫米4G智能手机 华为P7精美图赏
  3. 试图运行项目时出错,无法启动调试。没有正确安装调试器--很多次都是上网找了很多资料,都很难解决
  4. [ZT]WINDOWS域管理-备份域升为主域控制器
  5. 复旦-华盛顿大学EMBA二十年20人丨孙珏坚持与成长,女性领导力绽放内生光芒
  6. 【论文阅读】浏览器扩展危害-Helping or Hindering? How Browser Extensions Undermine Security
  7. just a life
  8. win102004优化_win102004有什么新功能
  9. 3 行代码 5 秒抠图的 AI 神器,根本无需 PS
  10. 转发文章:12306,我该不该相信你