为什么gets如此危险?

这一段搬运自stackoverflow:
Why is gets() dangerous
The first internet worm (the Morris Internet Worm) escaped about 30 years ago (1988-11-02), and it used gets() and a buffer overflow as one of its methods of propagating from system to system. The basic problem is that the function doesn’t know how big the buffer is, so it continues reading until it finds a newline or encounters EOF, and may overflow the bounds of the buffer it was given.

You should forget you ever heard that gets() existed.

The C11 standard ISO/IEC 9899:2011 eliminated gets() as a standard function, which is A Good Thing™ (it was formally marked as ‘obsolescent’ and ‘deprecated’ in ISO/IEC 9899:1999/Cor.3:2007 — Technical Corrigendum 3 for C99, and then removed in C11). Sadly, it will remain in libraries for many years (meaning ‘decades’) for reasons of backwards compatibility.

以上:蠕虫病毒就是来自与gets无限读取的问题 由于gets不会判断缓冲区有多大 所以会一直读到EOF或者是’\n’ 这就有可能导致缓冲区溢出的问题

在C11(2011)标准中删除了gets,但由于向下兼容导致这个函数一直存在库里
更安全的用法是用fgets指定读取范围 或是 用getline

另外:
有的时候写题目用gets会导致WA 可能是由于

windows的换行符是\r\n,linux的换行符只有\n,在windows系统下用gets会吞掉每一行最后面的\r\n,但是linux下用gets只会吞掉最后一个\n
那么问题来了,如果数据是在windows环境下构造的,换行符用的是\r\n,但是服务器是linux,管理员直接把windows下生成的数据没经过任何处理就移动到了linux的服务器里
, 那么在oj的测评时,每一行的最后都会多一个\r,所以有时候会稀里糊涂的wa
--------------------- 逍遥丶綦 来源:CSDN 原文:https://blog.csdn.net/qwb492859377/article/details/48323443
版权声明:本文为博主原创文章,转载请附上博文链接!

所以如此不安全的gets还是少用为妙…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leetcode][第329题][JAVA][矩阵中的最长递增路径][DFS][拓扑排序]

【问题描述】[中等] 【解答思路】 1. 记忆化深度优先搜索 复杂度 class Solution {public int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int rows, columns;public int longestIncreasingPath(int[][] matrix) {if (matrix null || matrix.length 0 || matri…

code1928: 日期差值 技巧模拟

1928: 日期差值 时间限制: 1 Sec 内存限制: 32 MB 题目描述 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。 输入 有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMD…

第二十八期:阿里云VS腾讯云 谁才是中国未来的云计算之王?

阿里云早在 2009 年就已经开始布局云计算领域,具有先发优势。据统计,40% 的中国 500 强企业、近一半中国上市公司、80% 中国科技类公司是阿里云的客户。而腾讯云基于腾讯自身在游戏、视频、社交、出行等业务的强势地位,一路奋起直追&#xff…

[小技巧][JAVA][转换]字符数组char[]与字符串String之间互相转换

1.字符数组转为字符串 方法1:直接在构造String时转换。 char[] data {‘a’, ‘b’, ‘c’}; String str new String(data);方法2:调用String类的方法转换。 String s String.valueOf(char[] ch)2.字符串转为字符数组 情况一:如果是”a…

CentOS 7 Apache服务的安装与配置(转)

https://blog.51cto.com/13525470/2070375 一、Apache简介 Apache 是一个知名的开源Web服务器。早期的Apache服务器由Apache Group来维护,直到1999年6月Apache Group在美国德拉瓦市成立了非盈利性组织的公司,即Apache软件基金会(Apache Softw…

第二十九期:全球首部AI交响变奏曲问世,AI技术应用再拓边界

人工智能技术,史上第一次升级到了复杂音乐的创作领域:交响曲。 全球首部 AI 交响变奏曲《我和我的祖国》,昨晚已由深圳交响乐团全球首演,它的出品方是中国平安人工智能研究院。 此前,你可能了解过 Google 的 Magenta、…

[小技巧][JAVA][转换]整型int与字符串String相互转换

字符串转换整型String - >Int 1). int i Integer.parseInt([String]); 或者 //radix 进制 int i Integer.parseInt([String],[int radix]); //intValue() 输出int数据。 2). int i Integer.valueOf(String).intValue(); 或者 int i Integer.valueOf(String);整型转换字…

codeup 2044 暴力搜索

2044: 神奇的口袋 时间限制: 1 Sec 内存限制: 32 MB 提交: 735 解决: 333 [提交][状态][讨论版][命题人:外部导入] 题目描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到…

MySql DDL语言(数据库和数据表的管理)

数据定义语言,负责数据库和数据表的管理 ⒈数据库的管理 1.创建数据库    1 create database if not exists DatabaseName; #if not exists可以省略 2.修改数据库 ①重命名数据库名称(已经废弃,强制修改只能到数据库指向的文件夹重命名…

第三十期:BAT 为什么都看上了重庆?

一个城市朝向智能化创新的方向发展,一把手的重视是非常重要的。 文:I/O 重庆,作为我国中西部地区唯一的直辖市和国家中心城市,正在新一轮科技发展浪潮中扮演着越来越亮眼的角色。 尤其是近两个月来,重庆在推动科技创新…

codeup 1128: 出租车费 贪心|找规律

1128: 出租车费 时间限制: 1 Sec 内存限制: 32 MB 提交: 871 解决: 299 [提交][状态][讨论版][命题人:外部导入] 题目描述 某市出租车计价规则如下:起步4公里10元,即使你的行程没超过4公里;接下来的4公里,每公里2元;之…

[Java基础][Java]toString()方法

【原理解析】 toString()方法返回反映这个对象的字符串 因为toString方法是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”。 它通常只是为了方便输出,比如System.out.println(xx),括号里面的…

MySQL系列--4.使用Python3访问数据库

1、安装MySQL驱动 pip install mysql-connector 安装完成后进入命令行模式,导入驱动,如果不报错,说明安装成功 Python 3.6.7 (default, Oct 22 2018, 11:32:17) [GCC 8.2.0] on linux Type "help", "copyright", "…

第三十一期:世界上有四类人永远不可能成为编程界牛人(个人见解,欢迎补充)

本人歌谣,出来工作也有两年了。大学挂科无数,出来想搞技术。平时也就是以工作学习的知识为主,无聊的时候就会学习一些关于科技的知识。 在这本人给大家传授一些学习编程的心得体会,供大家分享交流: 1.没有专注力和恒心…

[Java]==和equals()的区别(按照数据类型区分)

背景知识 【引用类型】 复合数据类型是引用类型 **1.基本数据类型,也称原始数据类型。**byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(),比较的是他们的值。 基本数据类型比较, 和 …

某简单易懂的人脸识别 API 的开发环境搭建和简易教程

最近接了个人脸识别相关的项目,是基于某个非常简单易懂的人脸识别 API:face_recognition 做的。这个库接口非常傻瓜,很适合新手上手,而且可以研究其源码来学习 dlib 这个拥有更加灵活、强大的人脸识别功能的库。本文介绍了该 API …

第三十二期:如何摆脱「技术思维」的惯性?

虽然从标题上看,这篇文章是写给“技术人”的,但 从广义上来说,只要你是一位以理性见长的人,那么这篇文章要讲的东西可能会与你有关。 虽然从标题上看,这篇文章是写给“技术人”的,但 从广义上来说&#xff…

[Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]

【问题描述】[中等] 【解答思路】 1. 拓扑排序 复杂度分析 HashSet[] 数组 import java.util.HashSet; import java.util.LinkedList; import java.util.Queue;public class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {if (numCourses &l…

codeUp 2031 To fill or not to fill 复杂贪心

2031: To Fill or Not to Fill 时间限制: 1 Sec 内存限制: 32 MB 提交: 599 解决: 132 With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way fro…

RabbitMQ(1) - win+rabbitMQ

rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。 1.安装Erlang 所以在安装rabbitMQ之前&…