程序发生空指针错误,定义空指针会导致程序异常
[摘要]
在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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。