warning: the 'gets' function is dangerous and should not be used.的解决办法

编译器安全防线:从告警到静态分析守护代码安全 代码安全是软件工程中不可忽视的基石,而漏洞往往隐藏于函数调用、内存布局和隐式类型转换等细节中。编译器作为代码诞生的第一道关口,不仅能完成语法与语义分析,更能通过告警、运行时保护和静态分析机制,在代码运行前识别缓冲区溢出、空指针解引用、未初始化变量等高风险问题。理解编译器的工作原理与安全切入点是利用其守护质量的前提,合理配置GCC、Clang或MSVC的安全选项,结合路径敏感的静态分析工具,能够将大部分可被预知的风险拦截在开发阶段。无论是刚入门的开发者还是项目负责人,掌握安全编译选项与警告分级策略,都可在CI 阅读详情

在Linux下,使用

gets(cmd)

函数报错:warning: the 'gets' function is dangerous and should not be used.

 

解决办法:采用

fgets(cmd,100,stdin);//100为size

问题解决!

 

fgets从stdin中读字符,直至读到换行符或文件结束,但一次最多读size个字符。读出的字符连同换行符存入缓冲区cmd中。返回指向cmd的指针。

gets把从stdin中输入的一行信息存入cmd中,然后将换行符置换成串结尾符NULL。用户要保证缓冲区的长度大于或等于最大的行长。

 

gets的详细解释:

char * gets ( char * str );//Get string from stdin

Reads characters from stdin and stores them as a string into str  until a newline character ('\n') or the End-of-File is reached.
The ending newline character ('\n') is not included in the string.

A null character ('\0') is automatically appended after the last character copied to str to signal the end of the C string.

Notice that gets does not behave exactly as fgets does with stdin as argument: First, the ending newline character is not included with gets while with fgets it is. And second, gets does not let you specify a limit on how many characters are to be read, so you must be careful with the size of the array pointed by str to avoid buffer overflows.

 

说明:红色部分很好地解释了“the 'gets' function is dangerous and should not be used”这个warning的原因。

参考链接:http://www.cplusplus.com/reference/clibrary/cstdio/gets/

 

====

http://hi.baidu.com/ca94305/item/bb60f2a6d96f462c8919d3c3

 

------------------------------------------------------------------------------------------------------------------------------------------------

 

今天在LINUX下编译C程序时,出现了:
warning: the `gets' function is dangerous and should not be used.

这个warning。

百度之后,得知

问题出在程序中使用了 gets  ,Linux 下gcc编译器不支持这个函数,解决办法是使用 fgets


  1. fgets()函数的基本用法为:  
  2.   
  3. fgets(char * s,int size,FILE * stream);//eg:可以用fgets(tempstr,10,stdin)//tempstr 为char[]变量,10为要输入的字符串长度,stdin为从标准终端输入。  
fgets()函数的基本用法为:

fgets(char * s,int size,FILE * stream);//eg:可以用fgets(tempstr,10,stdin)//tempstr 为char[]变量,10为要输入的字符串长度,stdin为从标准终端输入。

  1. /*   代码实现     */  
  2.   
  3. #include <stdio.h>   
  4. int main ( ) {  
  5.   
  6.    char name[20];  
  7.   
  8.    printf("\n 输入任意字符 : ");  
  9.   
  10.    fgets(name, 20, stdin);//stdin 意思是键盘输入   
  11.   
  12.    fputs(name, stdout); //stdout 输出   
  13.   
  14.    return 0;  
  15. }  
/*   代码实现     */

#include <stdio.h>
int main ( ) {

   char name[20];

   printf("\n 输入任意字符 : ");

   fgets(name, 20, stdin);//stdin 意思是键盘输入

   fputs(name, stdout); //stdout 输出

   return 0;
}

根据以上改动后,果然没有了warning,但是调试了n久的一个程序,确实怎么也没有正确结果,最后step跟踪,才发现了问题所在!那就是:
gets从终端读入是的字符串是用\0结束的,而fgets是以\n结束的(一般输入都用ENTER结束),然后strcmp两者的时候是不会相等的!

所以建议大家还是继续让它warning吧。。为了正确性!


这个问题主要应该是因为linux 和 windows的文件在换行符上编码不一样导致的,linux的换行是\0,windows的换行是\13\0,是两个字符。

但是的文件应该是在windows下编译的,所以导致会出现两字符不匹配。建议可以在linux终端下,利用dos2unix filename,来将换行符处理一下,应该就OK了


参考:

http://hi.baidu.com/zojoyo/blog/item/134874c89b9b94107f3e6fc3.html


http://hi.baidu.com/laoniaoyiren/blog/item/95a0862b291c5124d42af1cd.html/cmtid/e89b2c1fd0c330fb1ad57625

 

====

http://blog.youkuaiyun.com/zx824/article/details/6859930

Linux C语言中解决gets函数的警告问题 函数存在一些安全性问题,容易导致缓冲区溢出和安全漏洞,因此在许多C编译器中已经被弃用。函数,我们可以避免缓冲区溢出和安全漏洞的风险,并消除编译器警告。此外,我们还可以通过其他安全的输入函数,如。函数的代码,并建议开发者不要使用该函数。是一个常见的函数,用于从标准输入读取用户的输入并存储到字符数组中。函数在读取用户输入时会指定缓冲区的大小,避免了缓冲区溢出的风险。用于指定缓冲区的大小,确保输入的字符串不会超过缓冲区的容量。函数等来获取用户输入,以提高程序的安全性。函数的警告问题,并提供相应的源代码示例。 阅读详情

相关推荐

单细胞分析(五)——使用Harmony进行数据整合和去批次

为了保证单细胞RNA测序数据的准确性和可靠性,需要对数据进行样本去批次处理。去批次的方法包括Harmony,SeuratV3等,这些方法可以有效地消除批次效应和技术噪声,并提高单细胞RNA测序数据的质量,为后续的数据分析提供更加可靠的基础。

阅读文献,记录学习笔记 3万+

warning: the `gets' function is dangerous and should not be used.

问题今天在LINUX下编译C程序时,出现了main.c:29:5: warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration] gets(buffer); 和warning: the `gets' function is dangerous and should not be u

OSKernelLAB(gatieme) 2万+

ROS中tf2_ros::Buffer.lookupTransform的正确使用姿势:从踩坑到填坑

本文深入解析了ROS中tf2_ros::Buffer.lookupTransform接口的正确使用方法,重点剖析了因tf2_ros::TransformListener生命周期管理不当导致的经典问题。文章提供了从理解Buffer与Listener共生关系、类成员设计黄金法则到参数详解与异常处理的完整避坑指南,并给出了构建健壮坐标变换工具类的实战方案,帮助开发者稳定实现机器人坐标系变换。

weixin_29253711的博客 133

warning: the ‘gets' function is dangerous and should not be used

今天在LINUX下编译C程序时,出现了: warning: the 'gets' function is dangerous and should not be used. 这样的一个警告,在经过查阅资料以及自己的努力之后,才得知问题出在程序中使用了 gets  ,Linux 下gcc编译器不支持这个函数,解决办法是使用 fgets,同时对程序做稍微的修改即可. [cpp]

小白的IT旅程 8364

MCU中GPIO口的驱动方式

MCU中GPIO口的驱动方式 导读: MCU芯片中GPIO口的驱动方式大的可分为输出和输入两类,小的分可以分为8种。 一、四种输入方式 ①上拉输入: 上拉输入抗干扰能力强,特别适合接地信号的输入(比如低电平有效的按键信号输入)。其工作原理如图1所示。 I/O 端口与TTL 施密特触发器之前接入了一个30K~50K 欧姆的上拉电阻,当I/O 端口悬空时,此时MCU 也能读到稳定的高电平状态,...

优快云Frewen的博客 3372

计组实验4 控制冒险与分支预测

目录前言实验内容背景知识分支预测技术⭐阻塞周期计算方法不开启 BTB开启 BTBpart 1 矩阵乘法与优化未开启 BTB 的分析开启 BTB 的分析part 2 设计代码使 BTB 无效part 3 循环展开优化矩阵乘法未开启 BTB开启 BTB结束语结论 前言 上一篇博客:计组实验3 mips冒险之流水线冒险 摸了半个月了。。。咕咕咕 今天来写计组实验 4 这个实验非常简单,就是有点难。 这个实验比较容易算错,或者是被模拟器出人意料的结果搞的神神叨叨的,所以今天来记录并且详细分析该实验。 注:请务必阅

AKGWSB 's blog 5666

Linux系统下运行C语言程序gets函数警告的原因和解决

Linux系统下使用 gets函数,通常会有警告提示: warning: the 'gets' function is dangerous and should not be used. 是说,gets 函数的功能危险, 不应该被使用。 导致gets函数警告提示的原因是: ...

weixin_44566432的博客 3091

Pixel 4/4 XL 刷机小白必看:Magisk Root 全流程详解(附电信网络适配技巧)

本文为Pixel 4/4 XL用户提供了一份详尽的Magisk Root全流程指南。从解锁Bootloader、刷入Magisk,到解决电信网络VoLTE适配问题,再到隐藏Root以通过银行App检测,手把手教你安全获取系统最高权限并优化日常使用体验。

weixin_29310605的博客 264

Linux编程时使用gcc编译.c出现以下问题warning: the `gets' function is dangerous and should not be used.

Linux编程时使用gcc编译.c出现以下问题 [root@localhost final1]# gcc -pthread client.c /tmp/ccSuK4v5.o: In function `writedata': client.c:(.text+0xb2a): warning: the `gets' function is dangerous and should not be us...

qq_40120951的博客 1723

Python爬虫实战:5分钟搞定大众点评评论数据抓取(附完整代码)

本文详细介绍了使用Python爬虫高效获取大众点评评论数据的5个关键技巧,包括环境配置、智能页面解析、反反爬策略、数据存储与容错设计以及性能优化。通过实战案例和完整代码,帮助开发者快速掌握文本挖掘技术,适用于市场分析和商业决策。

weixin_30660027的博客 290

码农新宠大对决:GitHub Copilot、通义灵码和CodeLlama谁主沉浮?

本文对三款主流AI编程工具GitHub Copilot、通义灵码和CodeLlama进行了全面对比分析。GitHub Copilot在多语言支持和代码质量上表现突出;通义灵码在中文理解和阿里云生态集成方面优势明显;CodeLlama则以开源可定制见长。文章从代码生成、理解能力、多语言支持、使用体验等维度展开评测,并结合实际案例说明不同开发者群体的适用选择。建议新手可优先考虑通义灵码,经验开发者适合GitHub Copilot,而有定制需求的企业团队则可选择CodeLlama。随着AI技术发展,这些工具将持续

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 675

warning: the `gets' function is dangerous and should not be used.(转)

今天在LINUX下编译C程序时,出现了:warning: the `gets' function is dangerous and should not be used. 这个warning。 百度之后,得知 问题出在程序中使用了 gets  ,Linux 下gcc编译器不支持这个函数,解决办法是使用 fgets 1 fgets()函数的基本用法为: 2 3 fgets(char * s,in...

weixin_33936401的博客 227

【软考之软件设计师】学习笔记

interface 接口implements 实现接口(与接口配套使用)接口里要是有方法定义,子类就会实现。

云轩阁 2532

应用程序使用getc时报警告: ‘gets’ is deprecated...

警告: ‘gets’ is deprecated (declared at /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/stdio.h:638) [-Wdeprecated-declarations] gets(str);

weixin_42721128的博客 3863

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

在C语言中如何去掉gets的警告

也就是gets()获取了输入字符,存到给定的地址里面,到换行符时候截止,因此我们可以模拟一个gets()函数,并且加一个条件,如果越界了就停止获取输入字符代码如下。这样就可以避免越界,避免警告了,所以在C语言中去掉gets的警告的最好方法就是不使用gets()[狗头][狗头][狗头]。在C语言中使用gets会出现下面的警告,意思是:“警告:‘gets’函数是危险的,不应该使用。目前还没有复习到函数,复习到函数之后可以将这段代码放在函数里面,就可以方便的复用了。为了避免这种警告,在菜鸟教程(

weixin_50933109的博客 884

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux下输入函数fgetc, fgets, getc, getchar, gets使用

函数算在头文件:#include 函数原型:        int fgetc(FILE *stream);        char *fgets(char *s, int size, FILE *stream);        int getc(FILE *stream);        int getchar(void);        char *gets(char *s)

sea_dream的专栏 3177

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Sonar&&Fortify漏洞修复

Sonar&&Fortify漏洞修复

遇到对你这么好的女孩,唯有在她一丈之内。 6917

Linux下开发warning:"the `gets' function is dangerous and should not be used"

菜鸟(当然指的是笔者)最近在Linux下开发:socket异步通信。 client端实现输入时用了gets(),就出现感叹号:“the `gets' function is dangerous and should not be used.” while (gets(sendbuf) != NULL) { //...... write(s

不一样的空间 1705

gets()函数已经被弃用:warning: the ‘gets‘ function is dangerous and should not be used.

gets()函数已经被弃用:warning: the ‘gets’ function is dangerous and should not be used. 今天写题目的时候用c++环境下,然后用了gets()函数,竟然给我报错了说这个函数没有声明,后来我换了C语言环境下编译,过是过了,但是给了我一个warning,说gets()函数不安全。我上网查了查果然如此。C 标准 (2011) 的最新修订版已明确地从其规范中删除了此功能。该函数在 C++ 中已被弃用(从 2011 标准开始,遵循 C99+TC3

独自莫凭欗的博客 4591

“warning: the `gets' function is dangerous and should not be used.

在编译到时候碰到如下问题: “warning: the `gets' function is dangerous and should not be used. 在另外一个环境下编译到时候是没有问题到,现在搬到另外一个环境下出该问题,可能是环境问题 在网上查了下,说是“ Linux 下gcc编译器不支持这个函数,解决办法是使用 fgets” fgets()函数的基本用法为: fget

白永辉的专栏 1766

linux的gets函数,Linux 下使用C语言 gets()函数报错

在Linux下,使用gets(cmd)函数报错:warning: the 'gets' function is dangerous and should not be used.解决办法:采用fgets(cmd,100,stdin);//100为size问题解决!fgets从stdin中读字符,直至读到换行符或文件结束,但一次最多读size个字符。读出的字符连同换行符存入缓冲区cmd中。返回指向c...

weixin_39788382的博客 1438
上一篇: undefined reference to 'pthread_create'问题解决
下一篇: SecureCRT按退格键出现^H问题
Alan0521
博客等级 码龄19年 77粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值