C/C++中容易造成内存溢出的函数

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. }

建议使用 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. }

如果输入的字大于 buf 的大小,则有溢出的情况.

另还有几种情况:

a) 使用"%x"或"%d",但最后一个参数是char,也可能导致溢出,因"%x"或"%d"是读取4个字节,char只有一个字节,因此有可能会覆盖后面的内容。

b) 使用"d%"读取64位的数字也可能导致溢出

c) 使用为int定义的bool型时,若赋值为char型时,亦会出现溢出的现象

6. strdup()

strdup()函数是复制输入字符串,返回新申请内存的字符串。它是调用malloc,因此调用strdup后,需free来释放申请的内存。

  1. #include
  2. #include
  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. }
时间: 2024-12-15 07:21:50

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

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

更多 10 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识. 在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识.jvm管理的内存大致包括三种不同类型的内存区 域:Permanent Generation space(永久保存区域).Heap space(堆区域).Java Stacks(Java栈).其中永久保存区域主要

记程序员生涯中第一次遇到内存溢出错误

情景: 在我使用Hibernate使用2个表[客户表,订单表]进行联表查询时,发生的StackOverflowError. 问题: 我两个实体类中都重写了toString()方法,并且相互调用了彼此,导致我println(客户)时,一直会相互调用彼此的toString()方法,导致栈溢出错误. 解决: 去掉订单类toString()方法中的客户类. 分析: 在<深入理解Java虚拟机>一书中,是这么介绍的(Page 26) Java虚拟机栈---在Java虚拟机规范中,对这个区域规定了两种异常

病中吟之内存溢出

感冒了,在家里休息,打开电脑随便看看,想起前两天有人问的一个事情:"内存溢出怎么分析和处理?"方案有很多了,基本上的思路就是获取系统状态,内存变化方向,内存对象等之类的,profile,debug,jmx,dump等等. 我更想说的是,为什么会内存溢出呢? 在我看来,干活有两种方式: 没想清楚了,贸贸然开干,然后各处救火各种解决问题 想清楚了再开干,无惊无险,安然做完 一般来说,我都是后者,所以真的很少碰到各种莫名其妙的问题,比如自己实现排序算法.在内存中处理有100000个值的列表.

hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select * from  wizad_mdm_dev_lmj_20141120 as w JOIN wizad_mdm_main as a ON (a.rowkey = w.guid); 程序启动后,死循环,无反应.最后在进行到0.83时,内存溢出失败. 原因: 默认情况下,Hive会自动将小表加到DistributeCa

JQuery使用Ajax内存溢出问题总结

最近做一个项目,环境是struts2.3.16,spring3.0,mybatis2.3 当我使用JQuery的ajax方法提交请求返回个对象时,遇到了内存泄露的问题,这个问题困扰了我一个多星期: 开始调用ajax方法,反应比较慢,大概4~5秒之后才会出现效果. 重复几次调用之后,浏览器直接崩溃,系统开始卡,一步一卡... 打开cpu监视情况发现,当调用ajax方法,内存从百分之56直接飞到87.. 随之MyEclipse后台爆出java.lang.OutOfMemoryError: PermG

JVM高级特性与实践(一):Java内存区域 与 内存溢出异常

对于从事C.C++的开发人员而言,在内存管理领域,他们具有绝对的“权利”——拥有每个对象的控制权,并担负着每个对象生命周期的维护责任.而对于Java开发人员而言,在虚拟机自动内存管理机制的帮助下,无需为每一个创建new操作去配对 delete/free 代码,减少内存泄漏和内存溢出的问题,这些都交给了Java虚拟机去进行内存控制,但是正因如此,当出现相关问题时,若不了解JVM使用内存规则,就难以排查错误.接下来以此篇文章记录学习Java虚拟机内存各个区域概念.作用.服务对象以及可能产生的问题.

JVM(三)-内存溢出OutOfMemoryError

一.内存溢出OutOfMemoryError (1)java堆溢出 ①Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常. 代码清单1中代码限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出

内存溢出的预防及解决汇总

内存溢出是一个非常隐式的问题,经过相关资料的查询,先总结一下内存溢出的关键字:what(溢出表现).origin(内存分配及回收).where(溢出类型).why(泄露原因).how(预防及解决方案). 一.what(溢出表现) 1. 服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位: 2. 服务器极为不稳定,几乎每两天重新启动一次,有时甚至每天重新启动一次: 3. 服务器经常做 Full GC(Garbage Collection),而且时间很长,大约需要 30-40秒,应用服务

java虚拟机-(二)-java内存区域与内存溢出异常

1.简述:java虚拟机在执行java程序的过程中,会把他所管理的内存分为以下几个区域, 1.1.程序计数器 1.2.虚拟机栈 1.3.本地方法栈 1.4.java堆 1.5.方法区 如图所示: 2.各个区域的主要功能介绍 2.1.程序计数器:它可以看成是当前线程所执行的字节码的行号指示器,在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,   分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖计数器来完成,程序计数器是线程私有的内存,各线