gcc - gcc 7.4.0 中关于 gcc 5.4.9 的新警告
问题描述
几天前,我将我的 UBUNTU 发行版从 16.04.12 更新到了 18.04.01。
此更新导致从 gcc-5.4.0 过渡到 gcc-7-4-0。
在这个系统中,我用 c 语言开发了一个应用程序,以前使用 -Wall 选项编译,不会产生警告。
现在我收到以下警告:
src/load_input_file.c: In function ‘load_input_file’:
src/load_input_file.c:60:23: warning: ‘%s’ directive writing up to 499 bytes into a region of size 196 [-Wformat-overflow=] o
sprintf(str,"cp %s %s",fileName,inputData.outDir);
^~ ~~~~~~~~~
In file included from /usr/include/stdio.h:862:0,
from hdr/load_input_file.h:3,
from src/load_input_file.c:1:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:33:10: note: ‘__builtin___sprintf_chk’ output 5 or more bytes (assuming 504) into a destination of size 200
return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
__bos (__s), __fmt, __va_arg_pack ());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
你能帮我理解这个警告是什么以及如何解决它吗?谢谢
为了解决这个问题,按照 KamilCuk 的建议,我按照以下方式转换了代码
sprintf(str,"cp %s %s",fileName,inputData.outDir);
到
sprintf(str,"cp ");
snprintf(str+strlen(str),strlen(fileName),"%s ",fileName);
snprintf(str+strlen(str),strlen(inputData.outDir),"%s",inputData.outDir);
谢谢
解决方案
正如您可以在此处阅读GCC 7.1 引入Wformat-overflow
的选项。这就是为什么现在给你这个警告。
最可能
sprintf(str,"cp %s %s",fileName,inputData.outDir);
可能会溢出,因为
sizeof(fileName)+sizeof(inputData.outDir) > sizeof(str)
推荐阅读
- yii2 - 我无法从我的 yii 框架后端访问 Gii 界面
- swiftui - 有没有办法在针对 iOS 13 时有条件地使用 @StateObject?
- javascript - 赛普拉斯测试自动化中的 CORS 问题。"chromeWebSecuirty": false 在 Chrome 最新版本中不起作用
- javascript - 如何从 woocommerce 订单中删除“价格后缀”
- .net - 2020 年 7 月更新后的 SQL CLR 错误
- python-3.x - 将数字转换为日期时间格式
- python - 将属性传递给类方法
- velo - 如何访问 Wix 数据库中的类别
- tcl - 如何将字符串连接到列表元素的末尾?
- python - 如何在 Python 中访问多个打开的 Excel 文件