日月光华 -- SE精华区文章阅读
--------------------------------------------------------------------------------
发信人: jiachong (甲虫), 信区: SE
标 题: [转载]软件编程规范培训实例与练习
发信站: 日月光华 (2003年04月20日22:40:14 星期天), 站内信件
【 以下文字转载自 FDU_C.S. 讨论区 】
【 原文由 fdchosen 所发表 】
软件编程规范培训实例与练习
Ÿ 问题分类
1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制
等方面出现的问题,在系统中起关键作用,将导致软件死机、功能正常实现等严重问题;
接口类问题(B类)-指设计、编码中出现的函数和环境、其他函数、全局/局部变
量或数据变量之间的数据/控制传输不匹配的问题,在系统中起重要作用,将导致模块间配
合失效等严重问题;
维护类问题(C类)-指设计、编码中出现的对软件系统的维护方便程度造成影响的
问题,在系统中不起关键作用,但对系统后期维护造成不便或导致维护费用上升;
可测试性问题(D类)-指设计、编码中因考虑不周而导致后期系统可测试性差的问
题。
Ÿ 处罚办法
问题发生率:
P=D/S
D=DA+0.5DB+0.25DC
其中:
P -问题发生率
D -1个季度内错误总数
DA -1个季度内A类错误总数
DB -1个季度内B类错误总数
DC -1个季度内C类错误总数
S -1个季度内收到问题报告单总数
1)当D≥3时,如果P≥3%,将进行警告处理,并予以公告;
2)当D≥5时,如果P≥5%,将进行罚款处理,并予以公告。
目 录
一、逻辑类代码问题 第5页
1、变量/指针在使用前就必须初始化 第5页
【案例1.1.1】 第5页
2、防止指针/数组操作越界 第5页
【案例1.2.1】 第5页
【案例1.2.2】 第6页
【案例1.2.3】 第7页
【案例1.2.4】 第8页
3、避免指针的非法引用 第9页
【案例1.3.1】 第9页
4、变量类型定义错误 第10页
【案例1.4.1】 第10页
5、正确使用逻辑与&&、屏蔽&操作符 第17页
【案例1.5.1】 第17页
6、注意数据类型的匹配 第18页
【案例1.6.1】 第18页
【案例1.6.2】 第18页
7、用于控制条件转移的表达式及取值范围是否书写正确 第20页
【案例1.7.1】 第20页
【案例1.7.2】 第21页
【案例1.7.3】 第22页
8、条件分支处理是否有遗漏 第24页
【案例1.8.1】 第24页
9、引用已释放的资源 第26页
【案例1.9.1】 第26页
10、分配资源是否已正确释放 第28页
【案例1.10.1】 第28页
【案例1.10.2】 第29页
【案例1.10.3】 第30页
【案例1.10.4】 第32页
【案例1.10.5】 第33页
【案例1.10.6】 第35页
【案例1.10.7】 第38页
11、防止资源的重复释放 第39页
【案例1.11.1】 第39页
12、公共资源的互斥性和竞用性 第40页
【案例1.12.1】 第40页
【案例1.12.2】 第40页
二、接口类代码问题 第43页
1、对函数参数进行有效性检查 第43页
【案例2.1.1】 第43页
【案例2.1.2】 第43页
【案例2.1.3】 第44页
【案例2.1.4】 第46页
【案例2.1.5】 第47页
【案例2.1.6】 第48页
2、注意多出口函数的处理 第49页
【案例2.2.1】 第49页
三、维护类代码问题 第51页
1、 统一枚举类型的使用 第51页
【案例3.1.1】 第51页
2、 注释量至少占代码总量的20% 第51页
【案例3.2.1】对XXX产品BAM某版本部分代码注释量的统计 第51页
四、产品兼容性问题 第52页
1、系统配置、命令方式 第52页
【案例4.1.1】 第52页
【案例4.1.2】 第53页
2、设备对接 第54页
【案例4.2.1】 第54页
3、其他 第55页
【案例4.3.1】 第55页
五、版本控制问题 第58页
1、新老代码中同一全局变量不一致 第58页
【案例5.1.1】 第58页
六、可测试性代码问题 第59页
1、调试信息/打印信息的正确性 第59页
【案例6.1.1】 第59页
一、逻辑类代码问题
1、变量/指针在使用前就必须初始化
【案例1.1.1】
C语言中最大的特色就是指针。指针的使用具有很强的技巧性和灵活性,但同时也带来了
很大的危险性。在XXX的代码中有如下一端对指针的灵活使用:
... ...
_UC *puc_card_config_tab;
... ...
Get_Config_Table( AMP_CPM_CARD_CONFIG_TABLE,
&ul_card_config_num,
&puc_card_config_tab,
use_which_data_area
);
... ...
b_middle_data_ok = generate_trans_middle_data_from_original_data(
puc_card_config_tab,
Ul_card_config_num)
.... ...
其中红色部分巧妙的利用指向指针的指针为指针puc_card_config_tab赋值,而在兰色部分
使用该指针。但在Get_Config_Table函数中有可能失败返回而不给该指针赋值。因此,以
后使用的可能是一个非法指针。
指针的使用是非常灵活的,同时也存在危险性,必须小心使用。指针使用的危险性举世共
知。在新的编程思想中,指针基本上被禁止使用(JAVA中就是这样),至少也是被限制使
用。而在我们交换机的程序中大量使用指针,并且有增无减。
2、防止指针/数组操作越界
【案例1.2.1】
在香港项目测试中,发现ISDN话机拨新业务号码时,若一位一位的拨至18位,不
会有问题。但若先拨完号码再成组发送,会导致MPU死机。
处理过程:
查错过程很简单,按呼叫处理的过程检查代码,发现某一处的判断有误,本应为
小于18的判断,写成了小于等于18。
结 论:
代码编写有误。
思考与启示:
1、极限测试必须注意,测试前应对某项设计的极限做好充分测试规划。
2、测试极限时还要注意多种业务接入点,本例为ISDN。对于交换机来说,任何
一种业务都要分别在模拟话机、ISDN话机、V5话机、多种形式的话务台上做测试。对于中
继的业务,则要充分考虑各种信令:TUP、ISUP、PRA、NO1、V5等等。
【案例1.2.2】
对某交换类进行计费测试,字冠011对应1号路由、1号子路由,有4个中继群11,12,13,14
(都属于1#模块),前后两个群分别构成自环。其中11,13群向为出中继,12,14群向为入中继
,对这四个群分别进行计费设置,对出入中继都计费。电话60640001拨打01160010001两次
,使四个群都有机会被计费,取话单后浏览话单发现对11群计费计次表话单出中继群号不
正确,其它群的计次表中出中继群号正常。
处理过程:
与开发人员在测试组环境多次重复以上步骤,发现11群的计次表话单有时正常,有时其出
中继群号就为一个随机值,发生异常的频率比较高。为什么其它群的话单正常,唯独11群
不正常呢?11群是四个群中最小的群,其中继计次表位于缓冲区的首位,打完电话后查询
内存发现出中继群号在内存中是正确的,取完话单后再查就不正确了。
结 论:
话单池的一个备份指针Pool_head_1和中继计次表的头指针重合,影响到第一个中继计次
表的计费。
思考与启示:
随机值的背后往往隐藏着指针问题,两块内存缓冲区的交界处比较容易出现问题,在编程
时是应该注意的地方。
【案例1.2.3】
【正 文】
在接入网产品A测试中,在内存数据库正常的情况下的各种数据库方面的操作都
是正常的。为了进行数据库异常测试,于是将数据库内容人为地破坏了。发现在对数据库
进行比较操作时,出现程序跑死了现象。
经过跟踪调试发现问题出现在如下一段代码中:
1 for(i=0; i<pSysHead->dbf_count; i++)
2 {
3 pDBFat = (_NM_DBFAT_STRUC *)(NVDB_BASE + DBFAT_OFFSET + i*DBFAT_
LEN);
4 if(fat_check(pDBFat) != 0)
5 {
6 pSysHead->system_flag = 0;
7 head_sum();
8 continue;
9 }
10 if(strlen(dbf->dbf_name) != 0 && strncmp(dbf->dbf_name, pDBFat-
>dbf_name, strlen(dbf->dbf_name)) == 0)
11 {
12 dbf_ptr1 = (_UC *)pDBFat->dbf_head;
13 filesize = pDBFat->dbf_fsize;
14 break;
15 }
16 }
在测试时发现程序死在循环之中,得到的错误记录是"Bus Error"(总线出错),
由此可以说明出现了内存操作异常。
经过跟踪变量值发现循环变量i的阀值pSysHead->dbf_count的数值为0xFFFFFFFF,该值是
从被破坏的内存数据库中获取的,正常情况下该值小于127。而pDBFat是数据库的起始地址
,如果pSysHead->dbf_count值异常过大,将导致pDBFat值超过最大内存地址值,随后进行
的内存操作将导致内存操作越界错误,因而在测试过程中数据库破坏后就出现了主机死机
的现象。
上面的问题解决起来很容易,只需在第一行代码中增加一个判断条件即可,如下:
for(i=0; i<pSysHead->dbf_coun && i < MAX_DB_NUM; i++)
// MAX_DB_NUM=127
这样就保证了循环变量i的值在正常范围内,从而避免了对指针pDBFat进行内存越界的操
作。
从上面的测试过程中,我们可以看到:如此严重的问题,仅仅是一个简单的错误引起
的。实际上,系统的不稳定往往是由这些看似很简单的小错误导致的。这个问题给我们教
训的是:在直接对内存地址进行操作时,一定要保证其值的合法性,否则容易引起内存操
作越界,给系统的稳定性带来潜在的威胁。
【案例1.2.4】
近日在CDB并行测试中发现一个问题:我们需要的小区负荷话统结果总是为零,开始还以
为小区负荷太小,于是加大短消息下发
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
中文文本分类项目数据集.rar (2000个子文件)
195.txt 75KB
194.txt 62KB
1146.txt 39KB
5122.txt 38KB
1160.txt 36KB
1155.txt 29KB
6252.txt 28KB
6299.txt 27KB
192.txt 26KB
1141.txt 26KB
1121.txt 22KB
8188.txt 21KB
339.TXT 21KB
6231.txt 20KB
1124.txt 20KB
6260.txt 20KB
3206.txt 20KB
3206.txt 20KB
6265.txt 19KB
5135.txt 18KB
6302.txt 18KB
6232.txt 18KB
328.TXT 17KB
190.txt 17KB
6243.txt 17KB
6301.txt 16KB
88.TXT 16KB
1116.txt 16KB
6266.txt 16KB
1159.txt 15KB
5119.txt 15KB
4198.txt 15KB
6300.txt 15KB
1133.txt 15KB
6277.txt 15KB
6323.txt 14KB
1120.txt 14KB
1172.txt 14KB
5114.txt 14KB
6304.txt 14KB
2214.txt 13KB
1118.txt 13KB
1153.txt 13KB
1165.txt 13KB
6230.txt 13KB
6257.txt 13KB
1168.txt 13KB
1126.txt 13KB
2173.txt 12KB
6294.txt 12KB
6292.txt 12KB
6317.txt 12KB
6308.txt 12KB
6254.txt 12KB
6251.txt 12KB
6313.txt 12KB
6282.txt 12KB
2185.txt 12KB
316.TXT 12KB
1119.txt 12KB
2238.txt 12KB
2223.txt 11KB
134.TXT 11KB
81.TXT 11KB
1138.txt 11KB
137.TXT 11KB
6248.txt 11KB
8186.txt 11KB
8185.txt 11KB
3202.txt 11KB
3202.txt 11KB
332.TXT 11KB
1190.txt 11KB
2160.txt 11KB
1199.txt 10KB
8243.txt 10KB
55.TXT 10KB
1122.txt 10KB
1192.txt 10KB
2242.txt 10KB
3207.txt 10KB
3207.txt 10KB
1151.txt 10KB
5125.txt 10KB
4168.txt 10KB
87.TXT 10KB
561.TXT 10KB
2168.txt 9KB
3192.txt 9KB
24.TXT 9KB
21.TXT 9KB
2169.txt 9KB
5139.txt 9KB
1148.txt 9KB
6311.txt 9KB
6236.txt 9KB
2157.txt 9KB
2182.txt 9KB
13.TXT 9KB
7113.txt 9KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
wuhuaisj
- 粉丝: 2
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功