C/C++中容易造成内存溢出的函数
1.strcpy()
strcpy()函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目。复制字符的数目直接取决于源字符串中的数目。如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会陷入大的麻烦中!
建议使用strncpy.
2.strcat()
strcat()函数非常类似于 strcpy(),除了它可以将一个字符串合并到缓冲区末尾。它也有一个类似的、更安全的替代方法 strncat()。如果可能,使用 strncat() 而不要使用 strcat()。
3. gets
- void main()
- {
- char buffer[5];
- /* DON'T DO THIS */
- while ((buffer[i++] = getchar()) != '\n')
- {
- };
- }
void main() { char buffer[5]; /* DON'T DO THIS */ while ((buffer[i++] = getchar()) != '\n') { };}
建议使用 fgets
4.sprintf() vsprintf()
函数 sprintf()和 vsprintf()是用来格式化文本和将其存入缓冲区的通用函数。它们可以用直接的方式模仿 strcpy() 行为。换句话说,使用 sprintf() 和 vsprintf() 与使用 strcpy() 一样,都很容易对程序造成缓冲区溢出。
5.scanf() 系列
scanf() sscanf() fscanf() vfscanf() vscanf() vsscanf()
scanf系列的函数也设计得很差。在这种情况下,目的地缓冲区会发生溢出。考虑以下代码:
- void main(int argc, char **argv)
- {
- char buf[256];
- sscanf(argv[0], "%s", &buf);
- }
void main(int argc, char **argv) { char buf[256]; sscanf(argv[0], "%s", &buf);}
如果输入的字大于 buf 的大小,则有溢出的情况.
另还有几种情况:
a) 使用"%x"或"%d",但最后一个参数是char,也可能导致溢出,因"%x"或"%d"是读取4个字节,char只有一个字节,因此有可能会覆盖后面的内容。
b) 使用"d%"读取64位的数字也可能导致溢出
c) 使用为int定义的bool型时,若赋值为char型时,亦会出现溢出的现象
6. strdup()
strdup()函数是复制输入字符串,返回新申请内存的字符串。它是调用malloc,因此调用strdup后,需free来释放申请的内存。
- #include <string.h>
- #include <stdio.h>
- void main( void )
- {
- char buffer[] = "This is the buffer text";
- char *newstring;
- printf( "Original: %s\n", buffer );
- newstring = strdup( buffer );
- free( newstring );
- }
C/C++中容易造成内存溢出的函数相关推荐
- 一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer
一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer. 墨眉无锋墨家代码 2020-11-22 20:16:50 10525 收藏 56 分类专栏: Java ...
- 关于android相机开发中遇到的内存溢出的问题
2019独角兽企业重金招聘Python工程师标准>>> BitmapFactory时务必要尽快的使用Bitmap.recycle(); 方法进行内存回收, 在java中,一般都很少有 ...
- 在开发中遇到过内存溢出么?原因有哪些?解决方法有哪些?
引起内存溢出的原因有很多种,常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得 JVM 不能回收: 3.代码中存在死循环 ...
- java中三种常见内存溢出错误的处理方法
转载自http://blog.csdn.net/zmken497300/article/details/52496189 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError ...
- java中三种常见内存溢出错误的处理方法(good)
相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识. 在解决j ...
- C/C++中容易造成缓冲区溢出的函数
1.strcpy():字符串复制 2.strcat():字符串连接 3.gets():从输入流读取字符串到缓冲区 4.sprintf():打印字符串到缓冲区 5.vsprintf():打印字符串到缓冲 ...
- linux java的启动内存溢出,java - Java的R代码可在Linux上运行,但不能在Windows中运行 - 堆栈内存溢出...
我在做什么? 我正在用Java编写一个数据分析程序,该程序依赖R的arulesViz库来挖掘关联规则. 我想要什么? 我的目的是将规则存储在Java中的String变量中,以便以后进行处理. 它是如何 ...
- android 不同项目代码合并在一块,android - 是否可以将两个(正在积极开发中的)Android应用程序模块合并到同一个Android Studio项目中? - 堆栈内存溢出...
我有两个工作正常的Android应用程序模块A和B,与同一个Android Studio项目相同. 它们每个都可以单独构建和运行. 但是如果我通过指定将模块A添加为"模块依赖项" ...
- android 数据库 字节数组,java - 如何使用活动的android序列化字节数组并将其存储到数据库中? - 堆栈内存溢出...
我有一个图像作为byte[] ,我需要将此图像保存在数据库中. 我为此使用Active Android库. 我知道db中用于此目的的数据类型应该是BLOB. 我知道byte[]不能直接存储,我知道它应 ...
最新文章
- Linux统计行数命令wc(转)
- 阿里正式向 Apache Flink 贡献 Blink 源码
- python 字符编码
- java实现次方的运算_Java中对于位运算的优化以及运用与思考
- 「CodePlus 2017 12 月赛」火锅盛宴
- java22:API-Object-String
- windows live 2012发布文章解决办法??
- 此图片来自微信公众平台未经允许不可引用 解决方法
- 【操作系统/OS笔记01】课程概要、什么是操作系统
- 01 unity初识和素材导入
- 缠中说禅图解分析示范
- Git 设置SSH key
- 第二周学习记录之面向对象
- 字母对应的日期 moment Element JAVA oracle mysql的日期格式
- javaScript的时间操作
- 计算机的基础操作知识试题,计算机操作基础知识试题(220道)
- Android自定义控件增加xml标签属性、取值等
- 谷歌(Google)的新魔法——云计算
- 《面试题》一、Java基础
- ftp上传工具 多线程,5款多线程 ftp上传工具