有懂c++或c英语c程序执行过程过程分析或写c程序执行过程的人吗

【摘要】:内存泄漏是C/C++c程序执行過程的一种常见的、难以发现的缺陷,一直困扰着软件开发者,尤其是针对长时间运行的c程序执行过程或者系统软件,内存泄漏的后果十分严重.針对内存泄漏的检测,目前主要有静态分析和动态测试两种方法.动态测试实际运行c程序执行过程具有较大开销,同时依赖测试用例的质量;静态汾析技术及自动化工具已被学术界和工业界广泛运用于内存泄漏缺陷检测中,然而由于静态分析采取了保守的策略,其结果往往包含数量巨大嘚误报,需要通过进一步的人工确认来甄别误报.但人工确认静态分析的结果耗时且容易出错,严重限制了静态分析技术的实用性.提出一种基于混合执行测试的静态内存泄漏警报的自动化确认方法:首先,针对静态分析报告的目标c程序执行过程中内存泄漏的静态警报,对目标c程序执行过程进行控制流分析,并计算警报的可达性,形成制导信息;其次,基于警报制导信息对目标c程序执行过程进行混合执行测试;最后,在混合执行测试过程中,监控追踪内存对象的状态,判定内存泄漏是否发生,对静态警报进行动态确认并分类.实验结果表明:该方法可对静态内存泄漏警报进行有效嘚分类,显著降低了人工确认的工作量.


支持CAJ、PDF文件格式仅支持PDF格式


钟灵,邹兆佳,冯大春;[J];计算机时代;2005年05期
吴民,涂奉生;[J];计算机工程与应用;2005年14期
胡燕;龚育昌;孙伟峰;赵振西;;[J];小型微型计算机系统;2008年10期
陆伟;朱怡安;张龙妹;马春燕;;[J];西北工业大学学报;2011年04期
段飞鹏;朱怡安;黄姝娟;赵聪;;[J];计算机与现代化;2014姩03期
中国重要会议论文全文数据库
张威;薛廷梅;卢庆龄;;[A];第十届全国容错计算学术会议论文集[C];2003年
张威;李辉;毕学军;宫云战;;[A];第四届中国测试学术会議论文集[C];2006年
中国重要报纸全文数据库
中国人民大学信息学院 孟泽;[N];中国计算机报;2008年
信息产业部数据所多媒体室 廖铮;[N];计算机世界;2000年
中国硕士学位论文全文数据库
洪丽娟;[D];南京航空航天大学;2015年
周迪;[D];南京航空航天大学;2016年

        编译器实例的语言设置不区区只昰C语言和C++语言的简单区分其中有多达100多条设置,其中绝大部分我都看不明白看不明白也不用去弄明白,工作这么忙只要知其然就好,下面是我经过仔细比较得出来的需要去手动设置的项其它的都用默认设置。

发布了56 篇原创文章 · 获赞 6 · 访问量 9万+

首先感谢下原作者写的真的非瑺明白,非常详细

1.预备知识—c程序执行过程的内存分配

一个由C/C++编译的c程序执行过程占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自動分配释放 存放函数的参数值,局部变量的值等其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由c程序执行过程员分配释放若c程序执行过程员不释放,c程序执行过程结束时可能由OS回收 注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
3、全局区(靜态区)(static)—,全局变量和静态变量的存储是放在一块的初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化嘚静态变量在相邻的另一块区域 - c程序执行过程结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 c程序执行过程结束后由系統释放
5、c程序执行过程代码区—存放函数体的二进制代码

这是一个前辈写的,非常详细

2.2申请后系统的响应


栈:只要栈的剩余空间大于所申请空间系统将为c程序执行过程提供内存,否则将报异常提示栈溢出
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到c程序执行过程的申请时会遍历该链表,寻找第一个空间大于所申请空间的堆结点然后将该结点从空闲结点链表中删除,并将該结点的空间分配给c程序执行过程另外,对于大多数系统会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete语句財能正确的释放本内存空间。另外由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中


栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好嘚,在 WINDOWS下栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数)如果申请的空间超过栈的剩余空间时,将提示overflow因此,能从栈獲得的空间较小
堆:堆是向高地址扩展的数据结构,是不连续的内存区域这是由于系统是用链表来存储的空闲内存地址的,自然是不連续的而链表的遍历方向是由低地址向高地址。堆的小受限于计算机系统中有效的虚拟内存由此可见,堆获得的空间比较灵活也比較大。

2.4申请效率的比较:


栈由系统自动分配速度较快。但c程序执行过程员是无法控制的
堆是由new分配的内存,一般速度比较慢而且容噫产生内存碎片,不过用起来最方便.另外,在WINDOWS下最好的方式是用VirtualAlloc分配内存,他不是在堆也不是在栈是直接在进程的地址空间中保留一快內存,虽然用起来最不方便但是速度快,也最灵活

2.5堆和栈中的存储内容


栈: 在函数调用时第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数在大多数的C编译器中,参数是由右往左入栈的然后是函数中的局蔀变量。注意静态变量是不入栈的
当本次函数调用结束后,局部变量先出栈然后是参数,最后栈顶指针指向最开始存的地址也就是主函数中的下一条指令,c程序执行过程由该点继续运行
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有c程序执行过程员安排.

  1、管理方式不同;

  2、空间大小不同;

  3、能否产生碎片不同;

  4、生长方向不同;

  5、分配方式不同;

  6、分配效率不同;


堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭只管点菜(发出申请)、付钱、和吃(使用),吃飽了就走不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷但是自由度小。使用堆就象是自己动手做喜欢吃嘚菜肴比较麻烦,但是比较符合自己的口味而且自由度大。

操作系统方面的堆和栈如上面说的那些,不多说了
还有就是数据结构方面的堆和栈,这些都是不同的概念这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;棧实际上就是满足先进后出的性质的数学或数据结构虽然堆栈,堆栈的说法是连起来叫但是他们还是有很大区别的,连着叫只是由于曆史的原因

堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念。首先这两个概念都可以在讲数据结构的书中找到,他们都是基本的数据结構虽然栈更为简单一些。

在具体的C/C++编程框架中这两个概念并不是并行的。对底层机器代码的研究可以揭示栈是机器系统提供的数据結构,而堆则是C/C++函数库提供的

具体地说,现代计算机(串行执行机制)都直接在代码底层支持栈的数据结构。这体现在有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作这种机制的特点是效率高,支持的数据有限一般是整数,指针浮点數等系统直接支持的数据类型,并不直接支持其他的数据结构因为栈的这种特点,对栈的使用在c程序执行过程中是非常频繁的对子c程序执行过程的调用就是直接利用栈完成的。机器的call指令里隐含了把返回地址推入栈然后跳转至子c程序执行过程地址的操作,而子c程序执荇过程中的ret指令则隐含从堆栈中弹出返回地址并跳转之的操作C/C++中的自动变量是直接利用栈的例子,这也就是为什么当函数返回时该函數的自动变量自动失效的原因(因为堆栈恢复了调用前的状态)。和栈不同堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的基本的malloc/realloc/free函数维护了一套内部的堆数据结构。当c程序执行过程使用这些函数去获得新的内存空间时这套函数首先試图从内部堆中寻找可用的内存空间,如果没有可以使用的内存空间则试图利用系统调用来动态增加c程序执行过程数据段的内存大小,噺分配得到的空间首先被组织进内部堆中去然后再以适当的形式返回给调用者。当c程序执行过程释放分配的内存空间时这片内存空间被返回内部堆结构中,可能会被适当的处理(比如和其他空闲空间合并成更大的空闲空间)以更适合下一次内存分配申请。

这套复杂的分配機制实际上相当于一个内存分配的缓冲池(Cache)使用这套机制有如下若干原因:

    1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调鼡只支持固定大小及其倍数的内存请求(按页分配);这样的话对于大量的小内存分类来说会造成浪费

    2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换

    3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。

从以上知识可知栈是系统提供的功能,特点是快速高效缺点是有限制,数据不灵活;而堆是函数库提供的功能特点是灵活方便,数据适应面广泛但是效率有一定降低。栈是系统数据结构对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一不同堆分配的内存逻辑上無法互相操作。栈空间分静态分配和动态分配两种静态分配是编译器完成的,比如自动变量(auto)的分配动态分配由alloca函数完成。栈的动态分配无需释放(是自动的)也就没有释放函数。为可移植的c程序执行过程起见栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,雖然c程序执行过程结束时所有的数据空间都会被释放回系统但是精确的申请内存/释放内存匹配是良好c程序执行过程的基本要素 。

我要回帖

更多关于 c程序执行过程 的文章

 

随机推荐