软件代码评审检查点CC

上传人:re****.1 文档编号:474108571 上传时间:2023-06-09 格式:DOC 页数:20 大小:112.50KB
返回 下载 相关 举报
软件代码评审检查点CC_第1页
第1页 / 共20页
软件代码评审检查点CC_第2页
第2页 / 共20页
软件代码评审检查点CC_第3页
第3页 / 共20页
软件代码评审检查点CC_第4页
第4页 / 共20页
软件代码评审检查点CC_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《软件代码评审检查点CC》由会员分享,可在线阅读,更多相关《软件代码评审检查点CC(20页珍藏版)》请在金锄头文库上搜索。

1、文档供参考,可复制、编制,期待您的好评与关注! 软件代码评审检查点-C-C+文件结构审查【检查点1 】文件名是否和实际内容相符?规范性说明文件名应该清晰说明出该文件的功能和作用。案例略【检查点2 】多个模块公用的定义和函数原型的说明是否放在“*.h”?说明一般来说,*.h文件是公用的头文件,文件中申明的宏、结构、函数原型等,一其他的模块需要引用。案例略【检查点3 】私有的申明和函数原型的说明是否放在“*.inc”?说明一般来说,*.inc文件是私有的头文件。文件中申明的宏、结构、函数原型等,是仅供本模块使用。案例略【检查点4 】头文件是否使用了#ifndef-#endif宏开关来防止重复引用?

2、说明一般来说,头文件通过如下方法避免重复引用:#ifndef _XXX_H_#define _XXX_H_/*文件主体*/#endif 【检查点5 】函数原型是否没有明确申明返回值类型说明虽然C语言并不需要精确定义和声明函数返回类型,如果函数没有返回值,则定义为类型void。如果函数没有定义返回类型,编译器将认为其返回类型为int。在这种情况,很难判断函数是否应该有返回值。为了避免这种情况,函数返回类型应该被定义和声明。案例错误书写:SSfunction() ;正确书写:void SSfunction() ;预处理【检查点1 】宏定义是否缺少了“( )”符号?说明对于表达式的宏定义,注意要对变

3、量和表达式本身使用“( )”,防止宏展开时出错。案例案例一注意下面的宏定义极易出现问题: #define ADD(x, y) x + y上面的宏在如下代码中出错: c = ADD(a, b) /2;宏展开后的形式为: c = a + b /2;而不是: c = (a + b) /2;案例二 #define MULTI(x, y) x*y在程序中代码如下: a = MULTI( b+c, 2);宏展开后为: a = b + c * 2 ;而不是: a = (b + c) * 2;【检查点2 】宏定义是否存在不期望或者意料之外的附加效应?说明宏是一个短行的文本,或者说文本模板,它可以被扩充为更长的

4、文本.通常由宏产生的问题并不在宏定义本身,而往往由其下面的程序引起. 采用宏可以使代码简化,但它也可能隐藏重要的细节和关键的操作.案例 #define SQUARE ( x ) ( ( x ) * ( x ) ) . . . w = SQUARE ( + value ); 实际对宏SQUARE的引用将导致value被增加两次 , 因为这个语句将被C预处理器扩充以下形式: w = ( ( + + value ) * ( + + value ) );【检查点3 】是否存在通过定义宏来改变程序控制流程?说明通过定义宏来改变程序控制流程实际上是很糟糕的编程技巧案例 错误形式: #define FOR_

5、ALL for ( i = 0; i cmd.req.req2, tmrc ) );正确形式: return ( & MLtisfail ( mltmsg - cmd.req.req2, tmrc ) );在如下这些情况下传送指针作为参数是更好的选择: - 需要传送大量的数据和大型的数据结构作为输入时, - 被调函数需要修改调用函数的数据时.【检查点4 】返回值的所携带的信息是否的确是调用函数所需要的? 说明略【检查点5 】函数入参是间接引用参数时候,当中是否漏掉一个层次? 说明 案例 错误形式: DXal_fndnxt ( . . . , ( DXALMDATA * ) & data_ptr

6、 );正确形式: DXal_fndnxt ( . . . , ( DXALMDATA * * ) & data_ptr );【检查点6 】函数退出时是否有正确的返回值?说明看到函数调用,要养成习惯,进入函数内部瞄一眼。看看函数的正常值和异常值都是什么。看看返回值需不需要判断。看看有没有参数理解不一致的地方。案例错误形式:if ( VOS_strnicmp(szFullName, DEV_ATM_NAME , DEV_ATM_NAMELEN) = 0 ) ulIfType = DEV_GetIfTypeFromIfName( szFullName );if ( ulIfType = -1 )EX

7、EC_OutString( ulExecID, rnUnknown interface type );return VOS_ERR;/*得到端口的索引*/ulRet = DEV_GetIfIndexFromIfName( szFullName, &ulIfIndex);if (SUCCESS != ulRet)EXEC_OutString( ulExecID, rnUnknown interface number );return VOS_ERR;/*判断端口是否已经存在*/ pIfIns = DEV_GetIfFromIndex(ulIfIndex);if(NULL = pIfIns) rc

8、 = DEV_Cnsl_CreateIf(ulExecID, ulIfType, ulIfIndex, ulSubType); if(SUCCESS != rc) return SUCCESS; pIfIns = DEV_GetIfFromIndex(ulIfIndex); if(NULL = pIfIns) COUT_OUTPUT_DIAG(MOD_DEV, COUT_LEVEL_WARNING, pIfIns = NULL is invalid %s.%d, _FILE_, _LINE_); return DEV_ERR_GEN; 函数使用-1作为非法值,而在DEV_GetIfTypeFr

9、omIfName函数中:U32 DEV_GetIfTypeFromIfName(CHAR *ifName)CHAR szIfType20; /接口的类型字符串U32ulIfType;U32 strLen;U32 i;if(NULL =ifName)COUT_OUTPUT_DIAG(MOD_DEV, COUT_LEVEL_WARNING, ifName = NULL in GetIfTypeFromIfName %s.%d, _FILE_, _LINE_); return DEV_ERR_VALUE; strLen = VOS_strlen(ifName); if(0 = strLen) /*字符串为空,返回

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号