所在的位置: c++ >> 培训学校 >> CC程序coredump分析二

CC程序coredump分析二

一、前言

在《C/C++程序coredump分析(一)》中,我们对程序coredump的问题分类方案及部分案例进行了介绍。本次,我们依然要给大家分享几类程序出core的问题:

(1)程序设计不合理

(2)系统库中的问题

二、案例分析

2.1程序设计不合理

很多时候,算法设计或实现上考虑不周,会直接导致程序出问题。

(1)程序OOM

最常见的问题,就是申请内存却忘记释放,导致内存泄漏,最终OOM出core。这包括直接的new出对象没有free,或者创建vector不断添加元素却忘记在该清空时进行清空。

代码片段1就是一个没有释放内存的例子,在函数调用失败时,没有进行适当的操作,导致内存泄露。快速的内存泄露会导致程序OOM,从而出core。

(2)数值类型错误

类型问题也是程序设计中容易出错的地方。

比如在有符号和无符号整数之间转换,很可能导致丢失状态。代码片段2是一个案例中导致程序出core的原因。

在代码片段2中,lmpos是无符号类型,取值永远不会小于0,所以第17行中的条件判断永远不成立。一旦create_dynword函数调用失败,将给程序的运行引入不确定性的影响。

(3)pthread_t的类型

对于pthread_t等类型,在不同位数的机器上,其占用的内存是有差异的,如果将其强制转换为32位整数,则在64位机器上会出错。

在代码片段3中,pthread_t类型赋值给了u_int32,而pthread_t的类型为long,在32为系统中long与int型都存储为4字节,取值范围相同。而在64微系统上,long类型存储为8字节。在64位系统中,当线程id的数值大于MAX_INT时,转换为int时会出现负数,从而导致程序出core。

(4)死循环

涉及递归和循环时,如果设置的退出条件不合理,很可能引起无限递归或者死循环,一方面造成性能下降,另一方面,由于代码中或多或少,经常涉及到内存申请,无限次的执行会很快导致栈溢出或OOM,程序会直接崩溃。

代码片段4中,使用u_int8类型的下标遍历vector,由于u_int8的最大取值为,如果vector.size()大于,那么此处将形成死循环。如果在死循环内部有内存申请操作,将导致OOM(堆上申请内存)或者栈溢出(栈上申请空间),这可能导致内存泄露和程序出core。

(5)程序的初始化和退出逻辑

程序的初始化和退出逻辑,如果不精心设计,也可能存在问题,比如全局变量初始化顺序和退出时的资源释放顺序,一旦与依赖关系不一致,就会导致程序崩溃。

代码片段5中的代码,在实际执行的过程中有很大的概率会出core。根本原因为,main函数在退出时,先关闭主线程的句柄,然后再清理子线程。在子线程中使用了已经关闭了的句柄,导致程序出core。

2.2系统库

C/C++提供了很多非常方便的基础库,但是在使用过程中,如果用法不当,也很容易引发问题。

(1)排序函数

最常见的一种错误就是排序函数,用户自定义的cmp函数,必须保证两个相等的值比较时返回false,否则将导致快排过程中不断自增,直至越界。在我们收集的案例中,与sort函数相关的问题就有4例。希望大家特别的注意。

(2)printf函数的使用

printf是一个常用的函数,很多人用它输出一个字符串变量内容时,会直接写printf(str),这是很危险的,如果字符串中包含了%,将被识别为格式化参数,并可能输出预期外的值甚至直接出core,正确的写法是传入%s作为fmt,将要输出的字符串作为参数:printf(“%s”,str)。

(3)C语言库的字符串函数

字符串拷贝是个很常见的操作,我们也有strcpy、strncpy等系统库来完成相关工作,但是,这些函数都是很危险的,在有些场合下会出core。在代码片段6中的两个case中,如果拷贝或输出的源数据大于目标地址空间,那么就出出现数据越界。幸运的话,程序会core出来。通常,我们应当使用更安全的snprintf来实现相关的功能。

(4)容器的迭代器失效

vector等容器都提供了迭代器以方便遍历操作,必须注意的是,不能在迭代过程中对容器进行增删操作,这会导致迭代器失效。

比如代码片段7所示的这段代码,程序在遍历vector中数据元素的同时,会删除vector中的元素。每一次删除数据时,都会导致迭代器失效,从而可能产生越界访问或漏掉数据的可能性。当需要对数据进行删除时,可以考虑使用list,map等不存在迭代器失效的数据结构。另外,从效率方面考虑,对vector类型进行大量的删除操作,也是一种非常低效的做法。

(5)select函数的使用

因为linux上的fd从1开始,使用中可能会使用1-,但是,select通常只能处理到,一旦传入,将可能出core。

三、总结

本文对收集到的C/C++程序出core的案例进行了分类和整理,给出了一些建议,希望对大家有所启发。另外,也希望大家开发程序进行,做到规范开发。后续,FourExperts小组还会对其他类型的问题进行分析整理,希望大家持续







































福州治白癜风最好的医院
北京哪家皮肤病医院好



转载请注明:http://www.nydjfy.com/pxxx/1349.html