工作中负责开发一个dll模块,导出几个extern C的函数供其他模块回调。其中主要函数的签名如下:
int DoResponse(const CAlert* pAlert);
函数接收一个报警结构体指针pAlert,记录报警内容到数据库。
昨天加班的时候,测试提了一个bug,数据中时间字段出现了异常的"1970-1-1 08:00:01".我的模块在06.30的Daily Build安装包是好的,但是打上07.10的patch,更新了和我的模块交互的几个dll之后,就发生了问题。
分析之后,发现是数据库中记录的CAlert结构体字段发生了错位,该字段记录了值为1的time_t。
经过半天的调试,发现原因出在报警结构体文件定义上。我负责的模块在06.30之后就没有更改过,07.10的patch中也没有更新我的模块;在07.01之后,定义CAlert的头文件中,CAlert结构体成员字段的位置被调整了一次,07.10的sp1中其他几个和我的模块交互的模块被更新,而我的模块没有更新。因此从其他模块传递过来的报警结构体的成员位置也就不再和我的模块的结构体成员位置一致,因此记录到数据中的字段发生了错位。
代码示例:
原来代码定义:
class CAlert
{
int m_nId; //编号
int m_nTime: // 时间
int m_nCount; // 计数
}
被改为:
class CAlert
{
int m_nId; //编号
int m_nCount; // 计数
int m_nTime; // 时间
}
则时间字段和count字段将会颠倒。
在解下了一个patch中更新一下这个模块,问题解决。
分析发生问题的主要原因在于沟通不利,象这种公用接口的变化,需要通知相关受影响人员。此外,结构体成员位置的调整,也会引起接口的变化,这一点要注意。