正在加载图片...
if(strlen(dbf->dbf name)!=0 & strncmp(dbf->dbf name, pDBFat->dbf name, strlen(dbf->dbf name)==0) 123456 dbf ptrI=( UC *)pDB Fat->dbf head filesize=pDB Fat->dbf fsize, 在测试时发现程序死在循环之中,得到的错误记录是" Bus error"(总线 出错),由此可以说明出现了内存操作异常。 经过跟踪变量值发现循环变量i阀值 pSysHead-> dbf count的数值为 0 XFFFFFFFF,该值是从被破坏的内存数据库中获取的,正常情况下该值小于127。 而 pDBFat是数据库的起始地址,如果 pSysHead-> dbf count值异常过大,将导致 pDBFat1值超过最大内存地址值,随后进行的内存操作将导致内存操作越界错误, 因而在测试过程中数据库破坏后就出现了主机死机的现象。 上面的问题解决起来很容易,只需在第一行代码中增加一个判断条件即可, 如下 for(i=0; ipSysHead->dbf coun & i< MAX DB NUM: i++) ∥ MAX DB NUM=127 这样就保证了循环变量i的值在正常范围内,从而避免了对指针 pDBFat进行 内存越界的操作 从上面的测试过程中,我们可以看到:如此严重的问题,仅仅是一个简单的 错误引起的。实际上,系统的不稳定往往是由这些看似很简单的小错误导致的。 这个问题给我们教训的是:在直接对内存地址进行操作时,一定要保证其值的合 法性,否则容易引起内存操作越界,给系统的稳定性带来潜在的威胁 【案例124】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】
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有