软件代码检查单(C语言)

上传人:油条 文档编号:1619233 上传时间:2017-06-28 格式:PDF 页数:12 大小:332.81KB
返回 下载 相关 举报
软件代码检查单(C语言)_第1页
第1页 / 共12页
软件代码检查单(C语言)_第2页
第2页 / 共12页
软件代码检查单(C语言)_第3页
第3页 / 共12页
软件代码检查单(C语言)_第4页
第4页 / 共12页
软件代码检查单(C语言)_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《软件代码检查单(C语言)》由会员分享,可在线阅读,更多相关《软件代码检查单(C语言)(12页珍藏版)》请在金锄头文库上搜索。

1、软件代码检查单( C 语言) 项目名称 项目编码 检查方式 审查 走查 单人复审 检查人 检查对象 检查日期 执行类别说明 红色类:无条件执行 黑色类:建议执行 编号 检 查 项 结论 备 注 设计类 1 代码 与 详细 设计一致性 、完整性 检查 2 代码 与 协议一致性 检查 3 流程设计缺陷检查 4 关键算法 正确性检查 5 状态机机制是否有缺陷 6 数据结构设计合理性检查(包括复杂度检查) 7 异常处理是否全面 (各种异常 情况 都已处理) 接口类 8 跨模块消息接口是否有理解不一致问题 9 数据 类型是否与接口规范 一致 10 参数 取值 范围是否与 接口规范一致 11 跨模块 函数

2、接口 使用 正确性 检查 变量 检查 ( 语法 类 ) 12 全局变量声明检查: 全局变量应在头文件中声明 在一个公共的 .h 文件(所有 .c都包含该头文件 ) 中声明 13 变量重名检查: 函数内外、嵌套代码内外是否有变量同名。 是否有局 部变量与全局变量同名。 14 局部静态变量定义检查: 不建议使用局部静态变量 15 全局静态变量定义检查: 只在本 C 中使用的变量使用静态变量 (static)定义 16 系统级全局变量引用检查:鉴于系统级全局变量的重要性,建议:在文件的开始部分,显式列出本文件所引用的系统级全局变量;在函数的变量说明部分,显式列出本函 数所引用的系统级全局变量; 编号

3、 检 查 项 结论 备 注 17 文件级全局变量检查:文件级全局变量实际上是局部变量,由于文件级全局变量会减少程序的可读性,建议:尽可能少用文件级全局变量;在文件的开始部分,集中列出文件级全局变量的定义;在函数的变量说明部分,显式列出本函数所引用的文件级全局变量; 18 变量大小定义检查: 是否存在可能导致堆栈溢出的变量分配?避免出现比较 大的局部变量( 1K BYTES) 。 函数调用层次比较多时, 入参数应考虑采用传地址调用 (指针 )而不是传值调用 。 19 缓冲区定义检查: 缓冲区是否过小,对缓冲区赋值时,要注意缓冲区 的范围。另缓冲区过大,容易引起栈的崩溃。 20 宏定义中如果包含表

4、达式或变量,表达式和变量必须用小括号括起来。 21 数据类型问题: ()变量的数据类型有错误吗? ()存在不同数据类型的赋值吗?例如,无意中使代码为 BYTE 变量赋予一个 WORD 数值? ()存在不同数据类型的比较吗?例如对 DWORD 类型的 dwIndex 判断时,要写成 if(dwIndex!=0Xffffffff),而不能写成 if(dwIndex!=0xffff),否则程序会出错。 当返回值为指针时,需对返回值作仔细检查。 22 变量值问题: ()变量的初值或缺省值有错误吗? ()变量发生上溢或下溢吗? 不同类型的变量赋值必须使用显式类型强制转换,避免大范围的数据类型向小范围的数

5、据类型的赋值。 参考编译警告,检查强制转换,防止大的变量赋值给小的变量,在加减某变量时注意它的取值范围。如 A A B;或 A A B;有可能溢出 ()变量的精度够吗? 对于整型算术运算,某些计算,特别是除 法的代码处理是否会丢失精度? 解释:对于整形数之间的乘除运算尤其要注意两个问题:一个是溢出,一个是精度问题导致的计算错误。 23 变量初始化检查: 全局和局部变量在使用前必须声明和初始化(包括数组和结构);指针类型变量必须初始化为 NULL。 24 局部变量使用检查: 如果进程存在很多状态,要注意在其他状态初始化的变 量在本状态中还是未初始化的,不能拿来就用。 25 所有变量都赋予正确的长

6、度、类型和存储类型了吗? 26 是否 考虑到编 译器对高低字节顺序处理的差异和 Pack 描述的差异?参考: 当声明数据结构时,必须考虑机器的字节顺序、使用的位域及字节对齐等问题 ; 结构定义时 , 尽量做到 pack 1, 2, 4, 8 无关。 27 变量高低字节转换检查:高低字节转换除编解码外在 Power PC 下进行,即字 节序以 X86 字节序为准。 28 直接赋值检查: 尽量使用结构的直接赋值而不是使用 memcpy 编号 检 查 项 结论 备 注 29 连续赋值检查: 不能使用连续赋值语句 函数检查(语法类) 30 函数输入参数检查: 包括取值范围和类型的检查, 重要的输入参数

7、要检查后再用。尤其对于接口函数,输入参数的合法性、正确性检查极其重要,否则极可能引发灾难性后果 。 31 函数复合使用检查: 函数调用不要与其它语句复合使用 32 函数打印检查: 信息清晰明了,无废话。并包含模块信息和正确的打印 级别。 33 函数体返回值检查: ( 1)如果存在函数返回值,是否所有分支都有确定的返回值。 ( 2) return 语句不可返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。 ( 3)实际返回值类型是否和函数原型返回值类型匹配。 34 函数体一般性检查: 声明的函数必须使用 , 函数的每个参数都应该使用,如果 不用某些参数,应在注释中说明

8、原因; 全局变量不要作 为函数参数;全局函数应在头文件中声明。 35 调用 函数时参数的类型、大小和次序 正确吗? 内存 、指针 检查( 语法类 ) 36 原则: 在通信程序中,为了保证高可靠性,一般不使用内存的动态分配。 37 必须对动态申请的内存做有效性检查,并进行初始化;动态内存的释放必须和分配成对以防止内存泄漏 ,释放后内存指针置为 NULL。 38 在使用 memcpy 时,注意检查 内存源 /目的地址 。 39 Memcpy 拷贝长度检查: 内存拷贝时长度是否直接使用假定大小,而不 使用 sizeof(),要检查 sizeof(struct)中 struct 是否正确,是否 超过目

9、的 BUFFER 大小。 40 内存越界检查: 使用 memcpy、 memset 对变量赋值时是否有可能越界? 使用 sprintf、 strcpy 向一字符串赋值时是否有可能越界? 41 内存泄漏: 释放一个含有指向其它内存块的指针的内存块。如果没有其它指针指向第二个内存块,它将永远地丢失。 42 空指针检查: 检查指针是否为空;避免悬挂指针出现; 是否 存在对未分配或者已释放的指针的操作。 43 字符串操作检查 字符串中是否考虑了结束符 0 44 指针 +操作检查: 注意检查指针类型。指针 +后实际地址移动的 数字 和指针类型有关 45 二级指针检查: 是否避免使用了二级指针 编号 检

10、查 项 结论 备 注 46 取出整个数组长度的时候,是否使用了 sizeof 操作,还是直接赋值(建议使用sizeof 操作)? 如果使用直接赋值的方式,当数组或结构的长度发生变化时就必须改程序,一旦忘记修改,很容易发生越界和错误。 控制流程检查 (语法类) 47 如果程序包 含象 switch case 语句这样的多个分支,索引变量能超出可能的分支 数 目吗?如果超出,该情况能否正确处理? 48 Switch语句中一定要有 default ,注意该有 break时不要漏掉 break。推荐使用 switch语句来替代多重 If 语句 。 49 循环语句与判断语句中,不允许对其它变量进行计算与

11、赋值。 50 循环问题: ()循环终止条件不正确吗? ()无法正常终止(死循环)吗? 例如,循环变量类型所能取的最大值小于循环上限宏值,容易引发导致死循环 。 ()错误地修改循环变量吗? 循环中的计数变量不能在循环体中被修改 ,防止循环失控 。 ( 4) 多重循环的循环变量是否错误 地 使用 了 相同的变量 。 ( 5) 循环变量是否少了 ( 7) 对于多重循环, 可以退出时立即退出, 以提高执行效率。 例如,在多重循环中查找匹配条件, 应用 Break 及时退出。 51 检查所有的跳转语句,包括 Break、 continue 等使用是否正确。 52 资源申请释放检查: 申请释放尽量在同一个

12、函数中,代码中必须匹配。 53 非常规语句检查: 不使用 goto 语句;不使用递归 54 无效语句 检查: 是否存在任何条件下都运行不到的语句? 55 控制语句嵌套深度检查:控制语句嵌套深度不宜超过三层,每一层 后要 加注释。 56 复合使用检查: 函数调用不要与其它语句复合使用。 比较检查(语法类) 57 比较的正确吗?虽然听起来简单,但是比较应该是小于还是小于等于常常发生混淆,重点考虑边界问题。 58 每一个逻辑表达式都正确表达了吗?逻辑计算如期进行了吗?求值次序有疑问吗? 59 异或的优先级特低,检查和其它 运算符结合时是否加括号? 60 不可将浮点变量用“ =”或“ !=”与任何数字

13、比较。 61 应当将指针变量用“ =”或“ !=”与 NULL 比较。 62 条件判断语句检查: 在条件判断语句使用时,建议写为常量变量的 形式,如果未这样写,是否有将误写为情况。 编号 检 查 项 结论 备 注 计算 检查(语法类) 63 运算优先级检查: 不太有把握的运算优先级最好要用括号。 64 赋值运算符检查: 不推荐使用复合赋值运算符,象 * , /, %, &等 65 “ + -“运算检查: “ +”和“ -”运算只能在简单的语句 中使用,不 应该再和其它运算符连用。 注意 *(p+)与 *p+的区别, 尤其当 p 是某一结构指针时。例如: *p = (*p+) & 0x1ff 一

14、定要写为 *p+;*p = (*p) & 0x1ff 形式。 禁止在同一个语句中对同一个变量作一次以上的 + - 操作 66 计算中是否使用了不同数据 类型的变量,例如将整数与浮点数相加 。 67 在数值计算过程中是否可能出现溢出? 68 除数或模是否可能为零? 69 对于整型算术运算,某些计算,特别是除法的代码处理是否会丢失精度? 70 计算时是否了解和考虑到编译器对高低字节顺序处理的差异和 Pack 描述的差异? 异常保护检查(保护类) 71 变量越界检查: 变量使用是否可能越界,数组下标是否越界 例如: unsigned char i; for (;ibyUlPhyCHState = FPM_PHYCH_IDLE; ptPhyCHPara-byDlPhyCHState = FPM_PHYCH_IDLE; 在无线链路建立函数 FpmRlSetup 中, 增加两句话: ptPhyCHPara-byUlPhyCHState = FPM_PHYCH_RUNNING; ptPhyCHPara-byDlPhyCHState = FPM_PHYCH_RUNNING; 代码故障类型 编号 3 流程设

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 电子/通信 > 综合/其它

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