1.strcpy()

strcpy()函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目。复制字符的数目直接取决于源字符串中的数目。如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会陷入大的麻烦中!

建议使用strncpy.

2.strcat()

strcat()函数非常类似于 strcpy(),除了它可以将一个字符串合并到缓冲区末尾。它也有一个类似的、更安全的替代方法 strncat()。如果可能,使用 strncat() 而不要使用 strcat()。

3. gets

  1. void main()
  2. {
  3. char buffer[5];
  4. /* DON'T DO THIS */
  5. while ((buffer[i++] = getchar()) != '\n')
  6. {
  7. };
  8. }

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系列的函数也设计得很差。在这种情况下,目的地缓冲区会发生溢出。考虑以下代码:

  1. void main(int argc, char **argv)
  2. {
  3. char buf[256];
  4. sscanf(argv[0], "%s", &buf);
  5. }

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来释放申请的内存。

  1. #include <string.h>
  2. #include <stdio.h>
  3. void main( void )
  4. {
  5. char buffer[] = "This is the buffer text";
  6. char *newstring;
  7. printf( "Original: %s\n", buffer );
  8. newstring = strdup( buffer );
  9. free( newstring );
  10. }

C/C++中容易造成内存溢出的函数相关推荐

  1. 一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer

    一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer. 墨眉无锋墨家代码 2020-11-22 20:16:50 10525 收藏 56 分类专栏: Java ...

  2. 关于android相机开发中遇到的内存溢出的问题

    2019独角兽企业重金招聘Python工程师标准>>> BitmapFactory时务必要尽快的使用Bitmap.recycle(); 方法进行内存回收, 在java中,一般都很少有 ...

  3. 在开发中遇到过内存溢出么?原因有哪些?解决方法有哪些?

    引起内存溢出的原因有很多种,常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得 JVM 不能回收: 3.代码中存在死循环 ...

  4. java中三种常见内存溢出错误的处理方法

    转载自http://blog.csdn.net/zmken497300/article/details/52496189 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError ...

  5. java中三种常见内存溢出错误的处理方法(good)

    相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识. 在解决j ...

  6. C/C++中容易造成缓冲区溢出的函数

    1.strcpy():字符串复制 2.strcat():字符串连接 3.gets():从输入流读取字符串到缓冲区 4.sprintf():打印字符串到缓冲区 5.vsprintf():打印字符串到缓冲 ...

  7. linux java的启动内存溢出,java - Java的R代码可在Linux上运行,但不能在Windows中运行 - 堆栈内存溢出...

    我在做什么? 我正在用Java编写一个数据分析程序,该程序依赖R的arulesViz库来挖掘关联规则. 我想要什么? 我的目的是将规则存储在Java中的String变量中,以便以后进行处理. 它是如何 ...

  8. android 不同项目代码合并在一块,android - 是否可以将两个(正在积极开发中的)Android应用程序模块合并到同一个Android Studio项目中? - 堆栈内存溢出...

    我有两个工作正常的Android应用程序模块A和B,与同一个Android Studio项目相同. 它们每个都可以单独构建和运行. 但是如果我通过指定将模块A添加为"模块依赖项" ...

  9. android 数据库 字节数组,java - 如何使用活动的android序列化字节数组并将其存储到数据库中? - 堆栈内存溢出...

    我有一个图像作为byte[] ,我需要将此图像保存在数据库中. 我为此使用Active Android库. 我知道db中用于此目的的数据类型应该是BLOB. 我知道byte[]不能直接存储,我知道它应 ...

最新文章

  1. Linux统计行数命令wc(转)
  2. 阿里正式向 Apache Flink 贡献 Blink 源码
  3. python 字符编码
  4. java实现次方的运算_Java中对于位运算的优化以及运用与思考
  5. 「CodePlus 2017 12 月赛」火锅盛宴
  6. java22:API-Object-String
  7. windows live 2012发布文章解决办法??
  8. 此图片来自微信公众平台未经允许不可引用 解决方法
  9. 【操作系统/OS笔记01】课程概要、什么是操作系统
  10. 01 unity初识和素材导入
  11. 缠中说禅图解分析示范
  12. Git 设置SSH key
  13. 第二周学习记录之面向对象
  14. 字母对应的日期 moment Element JAVA oracle mysql的日期格式
  15. javaScript的时间操作
  16. 计算机的基础操作知识试题,计算机操作基础知识试题(220道)
  17. Android自定义控件增加xml标签属性、取值等
  18. 谷歌(Google)的新魔法——云计算
  19. 《面试题》一、Java基础
  20. ftp上传工具 多线程,5款多线程 ftp上传工具

热门文章

  1. 图片存储解决方案的分析
  2. Redis分布式锁原理解析
  3. 文件系统对性能的影响
  4. Hive--优化参数
  5. python 预编译加速_让Python代码运行更快的最佳方式
  6. flyway版本号_数据库版本管理工具-flyway
  7. mac自带python怎么用_怎么在mac上使用python
  8. 奥特曼系列ol光元在哪个服务器,奥特曼系列ol光元怎么合理使用
  9. 【报错笔记】sturts2程序运行出现错误:Struts has detected an unhandled exception
  10. 一个小米SRE的日常问题排查记录