1 现象:问题描述
在单元测试中,发现系统无论实际需要发送多少数据到接收者,实际上都只发送一批数据,然后就进入死循环状态。经过两天跟踪,才发现问题所在。
2 关键过程:根本原因分析
系统的处理流程如下:
系统的状态有5个:IDLE、INIT、START、PROCESS、FINISH,其中PROCESS状态是发送数据的状态,每次会发送一批数据,数据发送完后进入FINISH状态,然后进入下一轮处理或者结束。
经过长时间走读代码,终于发现问题不是状态机的实现上,而是状态值的定义出了问题。状态值用一个枚举类型来表示:
enum TNotifySenderState
{
STATE_IDLE = 0,
STATE_INIT = 1,
STATE_START = 2,
STATE_PROCESS = 3,
STATE_FINISH = 3
};
由于上面的STATE_PROCESS和STATE_FINISH的值相同,导致程序的处理不会进入STATE_FINISH状态,永远在STATE_PROCESS状态进行处理,因此出现了死循环。
3 结论:解决方案及效果
解决方案:
将TNotifySenderState类型定义为
enum TNotifySenderState
{
STATE_IDLE = 0,
STATE_INIT = 1,
STATE_START = 2,
STATE_PROCESS = 3,
STATE_FINISH = 4
};
4 经验总结:预防措施和规范建议
对于枚举类型,如果需要赋值,除非应用需要,要求防止出现枚举常量重复的情况。
5 备注
6 考核点
枚举常量的赋值。
7 试题
下面是使用定义状态机的不同状态,哪种定义方式可能导致程序出现问题?
(1)
enum TNotifySenderState
{
STATE_IDLE,
STATE_INIT,
STATE_START,
STATE_PROCESS,
STATE_FINISH
};
(2)
enum TNotifySenderState
{
STATE_IDLE = 0,
STATE_INIT = 1,
STATE_START,
STATE_PROCESS,
STATE_FINISH
};
(3)
enum TNotifySenderState
{
STATE_IDLE = 0,
STATE_INIT = 1,
STATE_START = 2,
STATE_PROCESS = 2,
STATE_FINISH = 3
};
(4)
enum TNotifySenderState
{
STATE_IDLE = 0,
STATE_INIT = 1,
STATE_START = 2,
STATE_PROCESS = 3,
STATE_FINISH = 4
};
答案:(3)
阅读(770) | 评论(0) | 转发(0) |