欢迎来到天天文库
浏览记录
ID:51477541
大小:875.00 KB
页数:115页
时间:2020-03-24
《C语言常见错误分析.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C语言常见错误及问题分析C语言编程常见错误分析C语言是目前世界上最通用的编程语言之一,也是目前研发使用最多的编程语言。同各种各样的bug作斗争,是每一个C程序员每天所面临的课题。本文将从微观角度出发,对一些常见出错类型的案例进行分析,希望大家今后能避免类似的错误。数字和表达式错误变量的错误数组和指针的错误逻辑和流程的错误数字和表达式的错误运算符和优先级的错误字节序的错误魔鬼数字宏定义的错误sizeof的错误最常见的运算符错误就是“=”和“==”的误用intmain(){intret;ret=GetVars();if(ret=VOS_OK){.....
2、.}return0;}错误后果:1.变量被错误赋值。2.逻辑判断不正确。建议和结论:尽管是初级bug但是还是常有发生,建议写成“VOS_OK==ret”的形式,这样在编译的时候即可发现这种错误。“++”和“--”在表达式中的应用#definemypower(a)((a)*(a))intmain(){inti=1,j=2;j=mypower(++i);printf("r%i=dj=%d",i,j);return0;}错误后果:结果与期望的不一致建议与结论:1.对于“++”和“--”这种基本的知识还是应该掌握的2.自增和自减变量在本表达式中不要再引
3、用,否则可能依赖编译器实现3.没有把握的用法千万不要用,否则可能导致意想不到的错误优先级问题也是编码初期容易出现的问题C语言有众多的运算符号,它们之间的优先级关系非常复杂,即使是一个熟练的C程序员,要清楚地记住这些优先级关系也绝非易事。if(high<<8
4、low)==>if((high<<8)
5、low)if(a
6、b&&a&c)==>if((a
7、b)&&(a&c))if(a
8、b==1)==>if((a
9、b)==1)建议和结论:不要使用默认优先级,使用括号来保证自己的运算优先级,不要考验字节的记忆力。字节序错误网络设备和网络协议的开发涉及到许多字节序问
10、题。网络序:所有设备、系统都一样,表示字节在网络中的传输顺序,也就是设备接收、发送数据的顺序。数据总是按照从“高字节”===>“低字节”的顺序发。主机序:依赖于CPU,表示的是字节在内存中的存放顺序。对于Intel系列CPU:高字节存放高位,低字节存放低位;和网络序相反;一般称为“小尾”或者“小端”(littleendian)对于PPC系列CPU:高字节存放低位,低字节存放高位;和网络序相同;一般称为“大尾”或者“打端”(bigendian)对于32位int型数0x12345678,intel和ppc系列CPU的存放格式分别如下:假定有一种协议报文,
11、报文类型为2个字节,某一特定类型为0xABCD两个因为字节序错误导致的真实案例案例一:某一种协议,其中一种报文类型是3,但是在代码中填写报文类型时没有进行字节序转换,导致对端总是识别报文类型为0x0300,于是对端认为是非法报文,直接作丢弃处理后果:当时使用的是Intel的CPU,这种错误类型的报文从来没有被处理过,当时也没有做单元测试,错误很久以后才被发现。因为这个报文是用来进行协议性能优化的,修改过后协议性能得到极大提升。案例二:某一种协议,报文中有一个字段用DWORD表示报文长度,但是在填写报文时遗漏了字节序转换,因为使用的是Intel的CPU
12、,导致对端从收到的报文中提取出的报文长度为类似0x4800000000的巨大数字。我们字节的设备在接收时也遗漏了字节序转换,所以从收到的报文中反而能正确提取出报文长度,该设备也一直没有与cisco的设备做互通测试,使该问题一直没有暴露出来。后果:该设备第一次开局时,与cisco设备互通,结果周边所有cisco的设备异常重启(cisco当年设备的鲁棒性也比较差劲!)。字节序错误不只在报文中存在一.联合域定义:union{ULONGulIP;UCHARszIP[4];}stIPAddr;如果赋值:stIPAddr.szIP[0]=192;stIPAddr
13、.szIP[1]=168;stIPAddr.szIP[2]=0;stIPAddr.szIP[3]=1;则大端和小端上stIPAddr.ulIP的值不同:大端:stIPAddr.ulIP=0xC0A80001;小端:stIPAddr.ulIP=0x0100A8C0;二.指针强转:定义如下变量:ULONGulTool=0x12345678;USHORT*pusTool=(USHORT*)&ulTool;UCHAR*pucTool=(UCHAR*)&ulTool;则在大端和小端上,*pusTool和*pucTool的值是不同的。大端系统:*pusTool=
14、0x1234*pucTool=0x12小端系统:*pusTool=0x5678*pucTool=0x78建议
此文档下载收益归作者所有