C语言进阶-第八讲编写安全无错的代码

C语言进阶-第八讲编写安全无错的代码

ID:37322919

大小:292.28 KB

页数:9页

时间:2019-05-21

C语言进阶-第八讲编写安全无错的代码_第1页
C语言进阶-第八讲编写安全无错的代码_第2页
C语言进阶-第八讲编写安全无错的代码_第3页
C语言进阶-第八讲编写安全无错的代码_第4页
C语言进阶-第八讲编写安全无错的代码_第5页
资源描述:

《C语言进阶-第八讲编写安全无错的代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第八讲代码的调试凌明trio@seu.edu.cn东南大学国家专用集成电路系统工程技术研究中心www.cnasic.com目录BugsvsDebugging!!断点,单步,变量的观察与修改,内存观察与修改,调用栈Bug的定位关注代码的层次与接口关注内存的访问越界(堆栈溢出,缓冲区溢出,数组越界)关注边界情况Bug的修正让代码检查自己的错误利用断言利用调试宏参数的合法性检查堆栈的监控(溢出?)内存数据结构的监控(Audit)调试信息的记录与输出其他的方法和工具代码检查(CodeRevieworCodeInspection)编译器的警告与Lint工具好的Coding

2、Stylewww.cnasic.com1BugsvsDebugging没有Bug的就不是软件☺核心的问题是:怎样发现程序错误的根源?怎样在软件中自动地查出这个错误?怎样修正这个错误?怎样避免这个错误?www.cnasic.com初学者的困惑在错误面前一筹莫展拼命的单步,但却不知道该关心什么?根本就不单步跟踪程序,或者不敢往下层函数跟踪总是发现编译器的“Bug”随便的,没有目的的修改代码,祈求奇迹的出现www.cnasic.com2Debugging的手段和工具一般的Debug工具都提供以下功能断点与数据观测点(BreakpointandWatchpoint)单步

3、(Step)寄存器的观察与修改(Register)变量的观察与修改(Watch)程序的可观测性与内存观察与修改(Memory)可控制性调用栈(CallStack)www.cnasic.comBug的定位-关注接口好的软件架构总是基于层次性的架构,通过相对单纯的数据结构和接口函数与外界交互。应用程序应用程序应用程序用户编程接口API以及接口数据结构文件系统的核心文件系统GUI硬件的驱动接口OS内核网络系统Flash驱动MMC卡驱动底层硬件驱动www.cnasic.com3Bug的定位-关注接口因次Bug的定位首先应该从上层逐渐往下层排查,将断点设在上层函数的入口,

4、单步执行跟踪程序的流程,特别关注底层函数的执行是否正确(主要是观察他的返回值是否正确),将搜索的方位逐渐缩小,最后定位在一个函数内部。www.cnasic.comBug的定位-关注内存的访问越界C语言的灵活性,指针的应用,以及C语法的宽容性很容易造成代码的错误,这其中最主要的就是内存单元的溢出堆栈溢出缓冲区溢出数组越界因此在将错误局限在一个函数中的时候,应该关注内存的问题了www.cnasic.com4堆栈溢出高地址已用主要现象:堆栈1,某些全局变量莫名其妙被改空间2,其他任务工作不正常,比如:SP堆栈指针函数调用不正常(PrefechAbort)剩余的局部变量

5、莫名其妙被改堆栈的底部栈空间其他所有的死机与崩溃其他的堆栈溢出冲掉了其他数据已用空间主要原因:1,任务的堆栈预留的太小2,任务中开设了大的临时变量低地址3,过深的函数递归,消耗了堆栈假设:我们的堆栈是满递减堆栈www.cnasic.com堆栈的缓冲区溢出高地址传入参数主要现象:1,某些局部变量莫名其妙被改返回地址A[8]2,函数返回的时候崩溃A[7]返回地址和保存保存的A[6]的寄存器值被冲寄存器A[5]主要原因:A[4]1,临时数组变量越界A[3]2,注意strcpy();sprintf();临时变量A[2]memcpy()函数的目的缓冲区数组A[5]是否越界

6、,strycpy()函数的A[1]原字符串是否正常以’’结A[0]SP堆栈指针束;memcpy()函数的拷贝数是否正常低地址www.cnasic.com5全局变量和动态缓冲区溢出低地址A[0]主要现象:A[1]1,某些全局变量莫名其妙被改A[2]2,如果被冲的部分是动态分配的A[3]缓冲区,一方面会造成其他数据A[4]的错误;另一方面会造成无法释放被冲的动态内存从而造成内存A[5]泄漏其他全局A[6]其他全局变量A[7]变量A[7]变量被冲主要原因:A[8]1,全局数组变量越界2,注意strcpy();sprintf();memcpy()函数的目的缓冲区是否

7、越界,strycpy()函数的高地址原字符串是否正常以’’结束;memcpy()函数的拷贝数是否正常www.cnasic.com关注边界情况程序中需要考虑的边界情况数组的上限循环的次数链表的头部和尾部在插入新节点,或删除的情况下的特殊处理输入参数的极限情况(0,指针为空,复数,最大的情况等等)www.cnasic.com6Bug的修正别急着改,想想,再想想,想清楚了再动手。考虑所作的修改可能会对系统造成的新的影响是什么?我的修改会对其他人的代码造成影响吗?是否会对全局的数据结构或者函数接口定义作修改?如果是,如何通知所有的其他人?修改完了,应该有详细的文档,

8、代码注释,并对修改过的代

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。