程序发生空指针错误,定义空指针会导致程序异常

  程序发生空指针错误,定义空指针会导致程序异常

  [摘要]

  在C程序中,指针操作是难点和精髓。一旦指针使用不当,很有可能导致程序崩溃。

  本文详细介绍了由空指针引起的程序问题的故障排除过程,为相关软件问题的分析和解决提供了有益的参考。

  一、问题描述最近一个程序在测试时突然死机。日志中会出现以下内容:

  src/A.c:6838处函数a中的# 00x f 64 F2 B3 a(event=666,dlgindex=0,ucErrNo=1 \001 )

  src/A.c:2781处函数b中的# 10x f 64 E3 a4 f(in=0x 80 EFD 4d )

  src/A.c:303时函数c中的# 20x f 64 DBA 3b(in=0x 80 EFD 4d ",out=0x0,dataPtr=0x0)

  二。日志内容分析通过上面的日志文件内容,我们可以看到以下信息:

  首先,程序最终在FunctionA函数中崩溃,该函数有三个参数:event、dlgindex和ucErrNo。其中,出错时,event为666,dlgindex为0,ucErrNo为1。

  其次,调用FunctionA的是FunctionB函数,它只有一个参数:in。

  三、故障排除流程。通过对日志内容的分析,我们检查了带有事件666的程序代码,它主要用于从数据库中获取一些系统参数的值。整个执行过程如图1所示。

  图1程序执行流程

  从图1可以看出,程序问题发生在数据库在设定时间内没有响应,进入超时流程的过程中。

  我们再次仔细检查了日志信息,发现问题出在“A.C .”文件的6838行。这一行和前一行的代码如下:

  pReq=(T _ RetInfoFromReqMsg *)DLG buf[dlgindex]。第段;(代码在第6837行)

  flowid=pReq-flowid;(代码在第6838行)

  第6837行分配pReq指针,第6838行将pReq对应的结构中的flowid变量分配给整数变量flowid。

  DlgBuf[dlgindex]的值有问题。para”指针。我们仔细看了一下程序代码,发现这个指针是在向数据库发送消息的函数中赋值的。其代码如下:

  UINT32 SendToDB(…,UINT8 *para,UINT32 paraLen)

  {

  ……

  如果((para!=NULL) (paraLen 0))

  {

  memcpy(DlgBuf[iDlgIndex].para,para,(int)paraLen);

  }

  ……

  }DlgBuf在程序刚启动时初始化。我们再次查看了调用SendToDB函数的代码行,如下所示:

  SendToDB(…,NULL,0);

  para指针的值为空,paraLen的值为0。根据SendToDB函数的代码流程,DlgBuf[iDlgIndex]。para将不被赋值,那么它将为空。

  DlgBuf[dlgindex]。para指针为空,所以在处理数据库超时的过程中,由于序列号相同,dlgbuf [dlgindex]。para指针也为空,这也导致pReq指针为空。如果以后想用这个指针对应的结构中的值,找不到,程序就崩溃了。

  不传递空指针的SendToDB函数代码如下:

  t _ RetInfoFromReqMsg tRetInfoFromReqMsg={ 0 };

  ……

  SendToDB(…,tRetInfoFromReqMsg,sizeof(T _ RetInfoFromReqMsg));测试修改后的程序,不会有问题。

  四。通过这次问题调查,我们总结了以下经验:

  (1)小心使用指针。对于重要的指针,使用前一定要检查是否有准确的值,避免使用空指针。

  (2)无论在哪个函数中,使用之前一定要检查指针是否为空。这也是对程序的异常保护。

  程序是不可避免的,但解决的方法也是千变万化的。的确,只要善于总结分析,任何程序性问题都是可以解决的。

  版权归作者所有:原创作品来自博主赵雄_IT,转载授权请联系作者,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: