




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、HUAWEI TECHNOLOGIES CO., LTDHuawei Confidential Security Level: 华为技术有限公司华为技术有限公司C C语言编程基础语言编程基础内部公开HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential
2、前言提高我司产品竞争力,研发要在以下几个方面下提高我司产品竞争力,研发要在以下几个方面下功夫功夫:提高规划水平,把握正确的方向(战略)提高设计水平,搭建合理的系统(战术)提高编码水平,开发稳定的代码(单兵作战技能)HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 前言l我们为什么要进行培训?我们为什么要进行培训?最好的医术是预防真正的难问题往往是低级错误引起的我们的编码水平不容乐观C是程序员的语言HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 前言l要提高编码水平,每个开发人员要要提高编码水平,每
3、个开发人员要做到做到:勤学苦练,提高编程技能前车之鉴,后世之师,不犯同样的错误;坚持代码Review、PC-LINT检查和单元测试;l总而言之,就是少犯错误,尽早发现错误总而言之,就是少犯错误,尽早发现错误HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TECHNOLOGIES CO., LTD.Huawei Confident
4、ial 基础篇之简单就是美If (a & b | c | d = e & f)If (a & b | c | d = e & f)这个表达式的正确运算顺序是什么?这个表达式的正确运算顺序是什么?test(a+, +a, a+, +a, a+, +a)test(a+, +a, a+, +a, a+, +a)a = 1;a = 1;实际函数调用时,传入的参数值分别是多少?实际函数调用时,传入的参数值分别是多少?(+(+* *p+) (-p+) (-* *q-)q-)语义是什么?语义是什么?a= b=1,c=2,d=3; e=4;a= b=1,c=2,d=3; e=4
5、;a a的值是多少?的值是多少?HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之简单就是美这里没有答案,只有问题:我们问什么要写这样的代码?工作太轻松?BUG不够多?水平显不出?如何改进?优先级搞不清楚用括号;复合语句太罗嗦,拆成几行来写;套用两句广告词:把简单的事情复杂化,太累把复杂的事情简单化,贡献!HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之简单就是美编码的三不原则不要挑战自己的记性不要挑战同事的耐心不要挑战编译器的水平编码的三用原则能用简单语句的,就不要用复杂的技巧能
6、用成熟代码的,就不要再来一套能用上工具的,就一定要机械化HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 我们要求什么?structstruct XXX XXX char char cAcA; ;short short sBsB; ;long long lClC; ; ;void main()void main() char char * *pCharpChar; ;pCharpChar = (char = (char * *) )mallocmalloc(7);(7);memcpymemcpy( (pCharpChar, , abcdefgha
7、bcdefgh, , sizeofsizeof(XXX);(XXX);printfprintf(%sn, (%sn, pCharpChar); ); return; return; HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 我们要求什么?续structstruct XXX XXX char char cAcA; ;short short sBsB; ;long long lClC; ; ;void main()void main() char char * *pCharpChar; ;pCharpChar = (char = (char
8、* *) )mallocmalloc(7); (7); / /* *0,0,魔鬼数字魔鬼数字; 1,; 1,未申请成功怎么办?未申请成功怎么办?* */ /memcpymemcpy( (pCharpChar, “, “abcdefghabcdefgh”, ”, sizeofsizeof(XXX); (XXX); / /* *2,2,内存越界内存越界* */ /printfprintf(“%sn”, (“%sn”, pCharpChar); ); / /* *3,3,没有字符串结束符没有字符串结束符* */ / return; return; / /* *4,4,没有释放内存没有释放内存* */
9、 / HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之sizeof数据结构是数据结构是C语言的基础语言的基础C语言的灵活性很大程度上在于其数据结构的灵活性语言的灵活性很大程度上在于其数据结构的灵活性要用好数据结构,首先要掌握数据结构大小的
10、计算要用好数据结构,首先要掌握数据结构大小的计算系统为每个数据结构、每个变量都会分配一个对应的存储空间,系统为每个数据结构、每个变量都会分配一个对应的存储空间,这个存储空间的大小就是数据结构的尺寸这个存储空间的大小就是数据结构的尺寸HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之sizeoftypedef union record LONG lIndex; SHORT sLevel6; CHAR cPos; REC_S;REC_SstMax,*pMax;CHARstr = “Hello” ;CHAR*pChar = str ;ULONG
11、ulGrade = 10;USHORTusClass 10;DOUBLEdWeightUCHAR*pCharArray1010;Sizeof(stMax/pMax/str/pChar/ulGrade/usClass/dWeight/pCharArray)的取值分的取值分别是多少?别是多少?HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之sizeoftypedef union record LONG lIndex; SHORT sLevel6; CHAR cPos; REC_S;REC_SstMax(12),*pMax(4);CHARst
12、r = “Hello”(516,不要忘了,不要忘了0) ;CHAR*pChar = str (4);ULONGulGrade = 10(4);USHORTusClass 10(2);DOUBLEdWeight(8);UCHAR*pCharArray1010(41010400);HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TE
13、CHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字节对齐随着半导体技术的发展,我们经历随着半导体技术的发展,我们经历8bit8bit、16bit16bit、32bit32bit乃至乃至64bit64bit的的CPUCPU,我们产品当前大多使用我们产品当前大多使用32bit CPU32bit CPU从内存存取效率来说,从内存存取效率来说,4 4字节对齐的存取速度是最快的,非对齐情况下,字节对齐的存取速度是最快的,非对齐情况下,CPUCPU需要分解成两次需要分解成两次32bit32bit操作;操作;缺省情况下,编译器自动对数据结构进行四字节对齐,以提高程序执
14、行缺省情况下,编译器自动对数据结构进行四字节对齐,以提高程序执行的效率,在特殊情况下,可以通过预编译指定指定数据结构为的效率,在特殊情况下,可以通过预编译指定指定数据结构为1 1字节对齐字节对齐或者其他;或者其他;对于对于Power PC/IntelPower PC/Intel系列系列CPUCPU,在非四字节对齐情况下,由,在非四字节对齐情况下,由CPUCPU自动完自动完成两次操作,对上层应用透明;对于成两次操作,对上层应用透明;对于MIPS CPUMIPS CPU,则需要通过编译选项进,则需要通过编译选项进行干预,或者调整数据结果避免出现这种情况,否则会产生例外;行干预,或者调整数据结果避免
15、出现这种情况,否则会产生例外;字节对齐对数据结构的尺寸(字节对齐对数据结构的尺寸(sizeofsizeof)直接产生影响)直接产生影响HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字节对齐typedef struct Head CHAR src 6; ULONG ulType; HEAD_S;VOID Encapsulation(CHAR* pBuf) ULONG ulLen, ulDestIP; CHAR* pData = pBuf; ulLen = sizeof(HEAD_S); pData += ulLen; ulDestIP
16、= VOS_NTOHL(IP_S *)pData-ulDestIP); return;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字节对齐#pragma pack(push)#pragma pack(1)typedef struct Head CHAR src 6; ULONG ulType; HEAD_S;#pragma pack(pop)VOID Encapsulation(CHAR* pBuf) ULONG ulLen, ulDestIP; CHAR* pData = pBuf; ulLen = sizeof(HEAD_S);
17、 pData += len; ulDestIP = VOS_NTOHL(IP_S *)pData-ulDestIP); (MIPS CPU 异常异常) return;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字节对齐数据结构内部对齐,下面数据结构内部对齐,下面2种定义哪个好?种定义哪个好?typedef struct example USHORT usA; ULONG ulA; USHORT usB; UCHAR ucA; USHORT usC; EXAMPLE_SVStypedef struct example ULONG ul
18、A; USHORT usA; USHORT usB; USHORT usC; UCHAR ucA; UCHAR ucReserved; EXAMPLE_S HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字节对齐案例点评案例点评在定义数据结构时(尤其是涉及协议和在定义数据结构时(尤其是涉及协议和IPC通讯的时候),没有特通讯的时候),没有特殊理由的话,都定义成四字节对齐;这样做可能浪费几个字节,殊理由的话,都定义成四字节对齐;这样做可能浪费几个字节,但是不会出问题;但是不会出问题;除了数据结构总长度是四字节对齐外,每一个部分也要保证它是
19、除了数据结构总长度是四字节对齐外,每一个部分也要保证它是四字节对齐的(可以按照四字节、两字节、一字节的顺序排放数四字节对齐的(可以按照四字节、两字节、一字节的顺序排放数据结构中的各个域);据结构中的各个域);对于无法定义成四字节对齐的数据结构,如以太网对于无法定义成四字节对齐的数据结构,如以太网II、HDLC等,等,则将它们强行定义成一字节对齐,以规避这个问题;则将它们强行定义成一字节对齐,以规避这个问题;对于对于MIPS CPU,在必须面对非四字节对齐情况时,采用编译选项,在必须面对非四字节对齐情况时,采用编译选项方式加以解决;方式加以解决;HUAWEI TECHNOLOGIES CO.,
20、LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字节序X86系统:系统:VOID QosConfigPolicy() ulDestIP = 从命令行读取用户配置的参数;从命令行读取用户配置的参数; pQosPolicy-ulDestIP = ulDestIP; return;主机处理:主
21、机处理:VOID QosClassify() pIp = (IP_S *)pData; if (pIp-ulDestIp = pQosPolicy-ulDestIP) DoSomething(); return ;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字节序X86系统:系统:VOID QosConfigPolicy() ulDestIP = 从命令行读取用户配置的参数;从命令行读取用户配置的参数; pQosPolicy-ulDestIP = ulDestIP; return;主机处理:主机处理:VOID QosClassify
22、() pIp = (IP_S *)pData; if (VOS_HTONL(pQosPolicy-ulDestIP) = pIp-ulDestIp ) DoSomething(); return ;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字节序由于历史的原因,业界存在两种字节序标准:由于历史的原因,业界存在两种字节序标准:BigEndian和和LittleEndian,Power PC是大头,是大头,X86是小头,有些是小头,有些CPU可以通过寄存器设置支持不同的字节序,例如可以通过寄存器设置支持不同的字节序,例如MIPS;所谓
23、大头就是高位在低字节,低位在高字节;小头则与此相反,以所谓大头就是高位在低字节,低位在高字节;小头则与此相反,以0 x345678为例,为例,大头内存从低到高的存放次序为大头内存从低到高的存放次序为00,34,56,78,小头内存从低到高的存放次序为,小头内存从低到高的存放次序为78,56,34,00;(上面的数值统一为;(上面的数值统一为16进制表示形式)进制表示形式)字节序问题广泛存在于设备与设备之间、单板与单板之间、单板与底层芯片之间,字节序问题广泛存在于设备与设备之间、单板与单板之间、单板与底层芯片之间,只要两个处理单元的字节序不同,这个问题就存在,为了解决不同字节序的处理只要两个处理
24、单元的字节序不同,这个问题就存在,为了解决不同字节序的处理单元之间的通信问题,业界定义了主机序和网络序的概念,网络序主要用于信息单元之间的通信问题,业界定义了主机序和网络序的概念,网络序主要用于信息传递,一般不用于计算,其字节顺序与大头一致;传递,一般不用于计算,其字节顺序与大头一致;除了在编码时绷紧这根弦以外,我们在器件选择时尽量选择主机序与网络序一致除了在编码时绷紧这根弦以外,我们在器件选择时尽量选择主机序与网络序一致的芯片,同一设备的不同单板使用相同的字节序,并优先选择支持大头的芯片,的芯片,同一设备的不同单板使用相同的字节序,并优先选择支持大头的芯片,这样,即使不能彻底解决问题,也可以
25、彻底规避问题。这样,即使不能彻底解决问题,也可以彻底规避问题。HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之函数参数在在C语言中,函数通过返回值和参数与调用者交换信息,对参数理语言中,函数通过返回值和参数与调用者交换信息,对参数理解和使
26、用的正确与否,直接影响到函数功能能否正确实现;解和使用的正确与否,直接影响到函数功能能否正确实现;函数参数自身占用的存储单元在函数参数自身占用的存储单元在堆栈堆栈中分配,入口参数指向的数中分配,入口参数指向的数值或者地址在函数入口处拷贝到堆栈区中,因此对函数参数所在值或者地址在函数入口处拷贝到堆栈区中,因此对函数参数所在存储单元的直接修改不会作用到函数之外,而对参数存储单元中存储单元的直接修改不会作用到函数之外,而对参数存储单元中存放的地址指向的存储空间的修改,则会在函数之外其作用;存放的地址指向的存储空间的修改,则会在函数之外其作用;调用者在进行函数调用之前,必须事先申明被调用函数的原型,调
27、用者在进行函数调用之前,必须事先申明被调用函数的原型,包括返回值类型和参数类型;包括返回值类型和参数类型;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之函数参数BOOL GetMemory(CHAR *p) /* 申请内存申请内存 */ p = (CHAR *)malloc(100); if (NULL = p) return FALSE; else return TRUE; VOID Test(void) CHAR *str = NULL; If (GetMemory(str) strcpy(str, hello world); p
28、rintf(str); return;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之函数参数CHAR* GetMemory(CHAR *p) /* 申请内存申请内存 */ *p = (CHAR *)malloc(100); return *p;VOID Test(void) CHAR *str = NULL; If (NULL != GetMemory(&str) strcpy(str, hello world); printf(str); free(str); str = NULL; return;HUAWEI TECHNO
29、LOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之返回值在在C语言中,函数的调用者通过返回值了解函数的执行情况;语言中,函数的调用者通过返回值了解函数的执行情况;函数缺省的返回值类型为函数缺省的返回值类型为int,编程规范要求必须显示定义函数的,编程规范要求必须显示
30、定义函数的返回类型;返回类型;对于反映了函数执行状态的返回值,调用者必须依据返回值进行对于反映了函数执行状态的返回值,调用者必须依据返回值进行相应的处理,尤其是对于函数执行异常的情形;相应的处理,尤其是对于函数执行异常的情形;函数的出口参数能够起到与返回值类似的作用,上面一条规则对函数的出口参数能够起到与返回值类似的作用,上面一条规则对出口参数同样适用;出口参数同样适用;对于函数返回值为恒值的函数,建议使用对于函数返回值为恒值的函数,建议使用VOID类型的返回值;类型的返回值;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之返回值有什么
31、问题?有什么问题?#includestdlib.h“VOID main() CHAR *p; p=(CHAR *)malloc(100); VOS_Strcpy(p, “Hello World!n”); printf(p); free(p); return;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之返回值#includestdlib.h“VOID main() CHAR *p; p=(CHAR *)malloc(100); if (NULL != p) strcpy(p, “Hello World!n”); printf(p);
32、free(p); return;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之返回值LONG A() if (条件条件1) return; return VOS_OK;VOID B() if (A() DoSomeThing1(); else DoSomeThing2(); return;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之返回值LONG A() if (条件条件1) return VOS_ERROR; return VOS_OK;VOID B() if (A()
33、DoSomeThing1(); else DoSomeThing2(); return;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之强制类型转换强制类型转换给强制类型转换给C语言编程带来了极大的灵活性,也正是这种灵活语言编程带来了极大
34、的灵活性,也正是这种灵活性,也埋下了无数的隐患;性,也埋下了无数的隐患;当目的结构的空间大于源结构的空间时,要重点关注内存访问超当目的结构的空间大于源结构的空间时,要重点关注内存访问超过源结构范围的情形,可能越界;过源结构范围的情形,可能越界;当目的结构的空间小于源结构的空间时,要重点关注对目的结构当目的结构的空间小于源结构的空间时,要重点关注对目的结构赋值不能完全覆盖源结构范围的情形,可能遗漏;赋值不能完全覆盖源结构范围的情形,可能遗漏;与结构体之间的强制类型转换相比,基本数据结构的强制类型转与结构体之间的强制类型转换相比,基本数据结构的强制类型转换更容易出现上面描述的情况,使用的时候,一定
35、要慎之又慎;换更容易出现上面描述的情况,使用的时候,一定要慎之又慎;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之类型转换目的结构小于源结构VOID B(CHAR *p) *p =1; return;VOID A() ULONG a; B(CHAR *)(&a); return;a = ? ,是,是1吗?吗?HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之类型转换目的结构小于源结构VOID B(CHAR *p) *p =1; return;VOID A() ULONG
36、a; B(CHAR *)(&a); return;a = ? ,是,是1吗?吗?不可预知。不可预知。HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之类型转换目的结构大于源结构VOID B(ULONG *p) *p =1000; return;VOID A() UCHAR a 10; B(ULONG *)(&a); return;在函数在函数B给给*p赋值之前,赋值之前,*p的值是多少?的值是多少?*p赋值之后,会出现什么样的情形?赋值之后,会出现什么样的情形?HUAWEI TECHNOLOGIES CO., LTD.Hu
37、awei Confidential 基础篇之类型转换目的结构大于源结构VOID B(ULONG *p) *p =1000; return;VOID A() UCHAR a 10; B(ULONG *)(&a); return;在函数在函数B给给*p赋值之前,赋值之前,*p的值是多少?的值是多少?不可预知不可预知*p赋值之后,会出现什么样的情形?赋值之后,会出现什么样的情形?越界越界HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch ca
38、se9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之switchcaseC语言使用语言使用switchcase处理一个条件的多个取值有不同的处理分处理一个条件的多个取值有不同的处理分支的情形;支的情形;当所有的当所有的case都匹配不成功时,进入都匹配不成功时,进入default分支,编程规范要求分支,编程规范要求switchcase必须显示设置必须显示设置default分支,如果程序从逻辑上不可能分支,如果程序从逻辑上不可能走到这个分支,可以在
39、该分支中使用断言;走到这个分支,可以在该分支中使用断言;结束结束case分支的执行最常用的办法是使用分支的执行最常用的办法是使用break/return,否则程序,否则程序将自动进入下一个将自动进入下一个case分支继续执行;分支继续执行;编译器对编译器对switchcase可以做优化,用空间换取时间;可以做优化,用空间换取时间;default分支按照编程规范,要求放在分支按照编程规范,要求放在switch case的末尾,的末尾,C语言本语言本身不做强制要求;身不做强制要求;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之switch
40、caseVOID main( ) LONG ulCnt1=0,ulCnt2=0; CHAR* ch = “aha!” ; while (*ch) switch (*ch ) case a: case h: ulCnt2+; default: ulCnt1+; ch+; printf(%u,%un,ulCnt1,ulCnt2); return; ulCnt1和和ulCnt2分别是多少?分别是多少?HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之switchcaseVOID main( ) LONG ulCnt1=0,ulCnt2=0; C
41、HAR* ch = “aha!” ; while (*ch) switch (*ch ) case a: case h: ulCnt2+; default: ulCnt1+; ch+; printf(%u,%un,ulCnt1,ulCnt2); return; ulCnt14 ulCnt2=3HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美H
42、UAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字符串ULONG BuildRun(CHAR* ppBuildrun) ULONG ulLen; CHAR* pBuf; ulLen = CalculateBuildRunLen(); if (0 = ulLen) *ppBuildrun = NULL; return B_ZERO_LENGTH; pBuf = VOS_malloc(0, ulLen); if (NULL = pBuf) *ppBuildrun = NULL; return B_MALLOC_FAILED; VOS_StrC
43、py(pBuf, BuildRunInfo); *ppBuildrun = pBuf; return VOS_OK; HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字符串ULONG BuildRun(CHAR* ppBuildrun) ULONG ulLen; CHAR* pBuf; ulLen = CalculateBuildRunLen(); if (0 = ulLen) *ppBuildrun = NULL; return B_ZERO_LENGTH; pBuf = VOS_malloc(0, ulLen + 1); if (N
44、ULL = pBuf) *ppBuildrun = NULL; return B_MALLOC_FAILED; VOS_StrCpy(pBuf, BuildRunInfo); *ppBuildrun = pBuf; return VOS_OK; HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字符串案例点评:案例点评:作为信息输出,字符串必不可少;作为信息输出,字符串必不可少;字符串在动态申请时少分配一个字符是非常普遍的一个错误;字符串在动态申请时少分配一个字符是非常普遍的一个错误;strlen等计算字符串长度的函数都是不考虑字符串的等
45、计算字符串长度的函数都是不考虑字符串的0结束符的;结束符的;代码代码Review时,字符串越界问题是一个大客户,要盯紧看严;时,字符串越界问题是一个大客户,要盯紧看严;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字符串(续)再看一个例子:再看一个例子:LONG GetXYZHead(CHAR* pData, CHAR* pBuf) ULONG ulLen; CHAR* pTmpData = *pData, *pTmpBuf = *pBuf; ulLen = AnalysisHead(pTmpBuf); /* strcpy(pTmpD
46、ata, pTmpBuf); */ /* sprintf(pTmpData, “%s”, pTmpBuf); */ /* memcpy(pTmpData,pTmpBuf, ulLen); */ return ulLen;*pBuf中存放是是中存放是是XYZ协议的协议的Peer发送过来的一段报文,这个函数负责将协议发送过来的一段报文,这个函数负责将协议头拷贝到头拷贝到pData指向的空间中;指向的空间中;假设空间是足够的,打算选择哪条语句;假设空间是足够的,打算选择哪条语句;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字符串(续)LO
47、NG GetXYZHead(CHAR* pData, CHAR* pBuf) ULONG ulLen; CHAR* pTmpData = *pData, *pTmpBuf = *pBuf; ulLen = AnalysisHead(pTmpBuf); /* strcpy(pTmpData, pTmpBuf); */ /* sprintf(pTmpData, “%s”, pTmpBuf); */ memcpy(pTmpData,pTmpBuf, ulLen); return ulLen;使用使用memcpy,因为没有人保证协议头中不出现,因为没有人保证协议头中不出现0,而且协议头非常,而且协议头
48、非常容易出现这个值,这个时候它就不再是字符串,字符串工具函数容易出现这个值,这个时候它就不再是字符串,字符串工具函数必须是专款专用,而必须是专款专用,而memcpy则要宽泛得多;则要宽泛得多;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字符串(再续)VOID GetDigitString(CHAR* pData, CHAR* pBuf) CHAR *pTmpData = pData, *pTmpBuf = pBuf; while (0 != (*pTmpBuf) if (0 = *pTmpBuf) *pTmpData = *pTmp
49、Buf; pTmpData+; else break; pTmpBuf+; return;该函数的功能是将该函数的功能是将pBuf中的连续数字拷贝到中的连续数字拷贝到pData中生成一个新的字符串中生成一个新的字符串HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之字符串(再续)VOID GetDigitString(CHAR* pData, CHAR* pBuf) CHAR *pTmpData = pData, *pTmpBuf = pBuf; while (0 != (*pTmpBuf) if (0 = *pTmpBuf) *pTmp
50、Data = *pTmpBuf; pTmpData+; else break; pTmpBuf+; *pTmpData = 0; /* 没有尾字符,就不是字符串没有尾字符,就不是字符串 */ return;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源保护14. 简单既是美HUAWEI TECHNOLOGIES CO., LTD.Huawei Confident
51、ial 基础篇之溢出#define DEFAULT_EXPIRE_TIME 300000 /* 5分钟分钟 */VOID ARPRecordExpireTime(ARP_Entry_S *pArpEntry) /* 计算表项预计老化时的时间,以系统启动以来的毫秒数表示计算表项预计老化时的时间,以系统启动以来的毫秒数表示 */ pARPEntry-ulExpireTime = GetBootTime()+DEFAULT_EXPIRE_TIME; return;VOID* ARPExpire( ARP_Entry_S *pArpEntry) ARP_Entry_s* pArpNext; while
52、(pArpEntry) if (GetBootTime() ulExpireTime) break; pArpNext = pArpEntry-pNext; Free(pArpEntry); pArpEntry = pArpNext; return (VOID *)pArpEntry;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之溢出#define DEFAULT_EXPIRE_TIME 300000 /#define DEFAULT_EXPIRE_TIME 300000 /* * 5 5分钟分钟 * */ /VOID VOID AR
53、PRecordExpireTimeARPRecordExpireTime( (ARP_Entry_SARP_Entry_S * *pArpEntrypArpEntry) ) / /* * 计算表项预计老化时的时间,以系统启动以来的毫秒数表示计算表项预计老化时的时间,以系统启动以来的毫秒数表示 * */ / pARPEntrypARPEntry-ulExpireTimeulExpireTime = = GetBootTimeGetBootTime()+ DEFAULT_EXPIRE_TIME;()+ DEFAULT_EXPIRE_TIME; return; return; VOIDVOID* *
54、 ARPExpireARPExpire( ( ARP_Entry_SARP_Entry_S * *pArpEntrypArpEntry) ) ARP_Entry_sARP_Entry_s* * pArpNextpArpNext; ; while( while(pArpEntrypArpEntry) ) if (if (GetBootTimeGetBootTime() () -ulExpireTimeulExpireTime) ) / /* * ULONG ULONG溢出如何处理?包括溢出如何处理?包括ExpireTimeExpireTime溢出、溢出、GetBootTimeGetBootTim
55、e溢出溢出* */ / / /* * 解决方案作为思考题解决方案作为思考题 * */ / break; break; pArpNextpArpNext = = pArpEntrypArpEntry-pNextpNext; ; Free( Free(pArpEntrypArpEntry); ); pArpEntrypArpEntry = = pArpNextpArpNext; ; return (VOID return (VOID * *) )pArpEntrypArpEntry; ; HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之溢出
56、案例点评:案例点评:在我们的系统中,溢出通常出现在时间处理上;在我们的系统中,溢出通常出现在时间处理上;系统时钟一般使用两个系统时钟一般使用两个ULONGULONG表示时间,精确到毫秒;表示时间,精确到毫秒;上层软件使用时间时一般忽略掉高位,只保留低上层软件使用时间时一般忽略掉高位,只保留低3232位。对于位。对于LONGLONG的情的情况,况,2525天后翻转;对于天后翻转;对于ULONGULONG的情况,的情况,4949天后翻转;天后翻转;如果没有特殊的需要,建议使用系统提供的精确到秒的如果没有特殊的需要,建议使用系统提供的精确到秒的3232位时钟,在位时钟,在LONGLONG情况下情况下
57、6060年翻转,基本可以不考虑这件事情;年翻转,基本可以不考虑这件事情;如果一定要使用毫秒钟,就需要考虑时钟翻转的情况;如果一定要使用毫秒钟,就需要考虑时钟翻转的情况;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之溢出(续)ULONG SequenceAdd(ULONG ulCount) ULONG ulSum = 0; while (0 = ulCount ) ulSum += ulCount; ulCount-; return ulSum;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidenti
58、al 基础篇之溢出(续)ULONG SequenceAdd(ULONG ulCount) ULONG ulSum = 0; while (0 pBody = pBody; pNode-ulNType = ulNType; return pNode;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之资源释放(续)Node_Head_S* CreateNode(ULONG ulNType) Node_Head_S *pNode; Node_Body_S *pBody; pNode = (Node_Head_S *)malloc(sizeof(
59、Node_Head_S); if (NULL = pNode) return NULL; pBody = (Node_Body_S *)malloc(sizeof(Node_Body_S); if (NULL = pBody) Free(pNode); /* 异常分支最容易忘记打扫战场,顾头也要顾尾异常分支最容易忘记打扫战场,顾头也要顾尾 */ return NULL; pNode-pBody = pBody; pNode-ulNType = ulNType; return pNode;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 基础篇之资
60、源释放案例点评案例点评资源泄漏是代码资源泄漏是代码Review中最常见的错误之一中最常见的错误之一申请的每个资源必须明确由谁负责释放,何时释放,在何处释放;申请的每个资源必须明确由谁负责释放,何时释放,在何处释放;在异常分支中,保持清醒的头脑,清理战场;在异常分支中,保持清醒的头脑,清理战场;在特定功能去使能时,需要完成的主要工作就是资源清退;在特定功能去使能时,需要完成的主要工作就是资源清退;HUAWEI TECHNOLOGIES CO., LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10. 溢出11. 资源释放12. If规范13. 临界资源
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 磁悬浮轴承支撑高速永磁转子系统动力学特性分析
- 杏鲍菇的乳酸菌发酵特性研究及产品开发
- 保育员的卫生管理课件
- 奶牛健康与人类福祉
- 初中合理膳食健康课课件
- 万圣节融合营销策略
- 初中劳动课说课课件
- S-Menthiafolic-acid-生命科学试剂-MCE
- 交通运输与物流:物流行业物流园区智能化物流技术应用与市场前景分析报告
- 交通运输行业人才需求预测与培养模式创新实践研究报告
- 2025年湖南省中考历史试卷真题(含答案)
- 数学 2024-2025学年人教版七年级数学下册期末+试卷
- T/CNFAGS 16-2024绿色甲醇分级标准(试行)
- T/DGGC 022-2023盾构机保养与维修技术规范
- 江苏省南京市鼓楼区金陵汇文中学2025年七下数学期末监测试题含解析
- 2024年宁夏妇女儿童医院招聘事业单位工作人员真题
- 国家开放大学《药物治疗学(本)》形考作业1-4参考答案
- 电网工程设备材料信息参考价2025年第一季度
- 成都设计咨询集团有限公司2025年社会公开招聘(19人)笔试参考题库附带答案详解
- 灭火器培训试题及答案
- 女性不孕症中西医结合诊疗指南
评论
0/150
提交评论