今天在VC2008环境下开发一小程序,本机用的是Windows Server 2003系统,开发完成后,在本机上Debug版与Release版运行都没有问题,而没有装任何开发环境的Windwos XP SP3系统上,Debug版可以正常运行,Release版在运行结束之前有时会弹出向微软发送错误报告对话框,但不是每次都会出现。从报告中没有看出什么有价值的信息。
由于在程序中使用了多线程,刚开始怀疑是在线程同步或退出时,与主线程产生了什么冲突,造成的问题,但另一模块同样也继承了该线程的实现,运行正常。然后考虑是不是执行的代码有问题,在执行代码部分退出前,用弹出对话框的方式调试,可以正常弹出对话框,貌似又不是本身代码的问题。然后又考虑是不是两个机子上提供的MFC DLLs版本差异造成的问题,将两个机子的MFC dLLs统一版本后,还是同样的现象。
迫不得已,又重新回到执行代码的地方,分析自己写的代码可能存在的问题。有以下代码:
int srcLength = 66;
int destLength = 74;
BYTE* pSrcData = new BYTE[srcLength];
BYTE* pDestData = new BYTE[destLength];
BYTE pHeader[8];
for(int i = 0; i < 10000; ++i)
{
// 为pHeader[0]到pHeader[7]赋某值
memcpy(pDestData, pHeader, 8);
memcpy(pDestData + 8, pSrcData, destLength);
}
不知道读者能不能看出这段代码的问题,问题就出在最后一个memcpy上,拷贝的长度为destLength, 而pSrcData的长度只有srcLength, pDestData + 8 剩余的空间也只有srcLength, 该操作实际上会将长度为8的未知内存数据拷贝至另一段未知的内存中。由于pDestData内的空间都进行了有效的赋值,所以从处理结果上并不能发现这个错误。正是由于这个错误,导致了文章开头提到的异常情况。
虽然是一个小Bug,体会还是挺深的:
1、不要轻易怀疑是系统的问题,还是要从自身程序找问题。虽然现象貌似不同系统不同的运行环境中才出现的。
2、执行良好且通过的代码不一定没有问题,如果将断点设在出现问题的代码行的话,永远看不出它会有问题。
3、出现问题时,还是要多仔细检查代码中内存读写越界、数组访问越界等常见的可能出现的情况。
本文探讨了一段代码中导致程序在不同系统环境下表现异常的原因,重点在于内存操作的不当,以及从自身程序中找问题的重要性。通过实例分析,强调了代码审查在排除系统性错误时的作用,并提醒开发者注意内存越界、数组访问等问题。
3838

被折叠的 条评论
为什么被折叠?



