为什么告警warning implicit declaration of function必须修复
相关:《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>
问题
问题一:为什么编译器不报错?
- malloc在stdlib.h中声明,没有include为什么编译器没有报错。C Standard还没发布的时候,是允许不声明、不定义就使用函数的。为了适配这些老代码编译器是比较宽松的。
问题二:不管这个告警会发生什么?
- 编译器会从提供的参数类型中推断出函数的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必须修复相关推荐
- linux c warning: implicit declaration of function 'strtok_r'解决方案
解决方法:警告的文件头部 添加 #define _GNU_SOURCE 编译时出现警告 warning: implicit declaration of function 'strtok_r' war ...
- warning: implicit declaration of function导致core
centos上使用gcc编译某程序得到warning: implicit declaration of function 同时写了一个测试程序用到c++库, 因此使用g++编译. 测试程序无问题. ...
- warning: implicit declaration of function ‘sleep’(添加头文件: #include <unistd.h>)
ubuntu编译c程序报错: warning: implicit declaration of function 'sleep' 解决方法: 添加头文件: #include <unistd.h& ...
- keil写代码时遇到的问题——warning:implicit declaration of function XXXX is invalid in C99
在用keil4写实验的时候,遇到了如标题所示的警告,warning:implicit declaration of function "XXXX" is invalid in C9 ...
- 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 ...
- 隐形声明警告解决//warning: implicit declaration of function ‘XXX’; did you mean ‘YYY’?
The Problem warning: implicit declaration of function 'XXX'; did you mean 'YYY'? [-Wimplicit-functio ...
- 【C语言】warning: implicit declaration of function ‘xxx’ [-Wimplicit-function-declaration] 的解决方法
Linux开发C语言应用程序,编译出现以下四条warning: warning: implicit declaration of function 'strcmp' [-Wimplicit-funct ...
- 【C语言】warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration] 的解决方法
Linux环境下编译C语言程序,出现警告: warning: implicit declaration of function 'usleep' [-Wimplicit-function-declar ...
- 解决C语言函数调用warning: implicit declaration of function ‘‘
今天在学习函数调用时突然爆出了这个错误,经过查阅得以顺利解决,在此分享给大家. 问题:warning: implicit declaration of function '' 错误原因: 显示这类错误 ...
最新文章
- 只有20%的iOS程序员能看懂:详解intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance
- 阿里园区生态技术联盟启动大会
- 开始食用grpc(之一)
- Linux下社交平台,Linux 启动
- 【TensorFlow】TensorFlow从浅入深系列之二 -- 教你通过思维导图深度理解深层神经网络
- 2013年快要过去了,为新来的2104计划
- 关于ssm框架的全部整合(一) 2021.05.09
- 华为模拟器ensp与真实机器连接使用的配置内容一
- CopyTo 方法详解
- 网络安全:系统进程的基本概述
- angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传
- 舱机器人尾巴毛茸茸_这个毛茸茸的机器人不仅可撸,还会摇尾巴
- 苹果自带录屏在哪_苹果如何录屏?Mac录屏的专业方法
- SAS学习之基本统计过程
- 任天堂国行 Switch OLED 版 评测
- CGB2109-Day12-用户模块管理
- python mqtt tls_某些程序中TLS证书上的MQTT(Mosquitto)错误
- 如何批量创建文件夹并命名
- App-Charle抓包配置(https)
- 思科CCIE认证有必要考吗
热门文章
- python 自动点赞_用Python模拟技巧带你实现自动抽屉登录自动点赞
- android 4g手机6,6.5毫米4G智能手机 华为P7精美图赏
- 试图运行项目时出错,无法启动调试。没有正确安装调试器--很多次都是上网找了很多资料,都很难解决
- [ZT]WINDOWS域管理-备份域升为主域控制器
- 复旦-华盛顿大学EMBA二十年20人丨孙珏坚持与成长,女性领导力绽放内生光芒
- 【论文阅读】浏览器扩展危害-Helping or Hindering? How Browser Extensions Undermine Security
- just a life
- win102004优化_win102004有什么新功能
- 3 行代码 5 秒抠图的 AI 神器,根本无需 PS
- 转发文章:12306,我该不该相信你