void类型指针使用
2015-08-06 15:17
323 查看
1. 在调用设置IP地址问题现象
在设置VLAN后会调用SetOnuPonIpAddress函数去设置IP地址,函数代码实现过程如下
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen = 0;
intip;
int mask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP stAddr;
/*取出ip地址和mask*/
rcDbGet(SipSys_IpAddr,POTS_SYS_NUM,&ipLen,(char**)&p_ponIp);
rcDbGet(SipSys_IpMask,POTS_SYS_NUM,&maskLen,(char**)&p_ponMask);
ip= *p_ponIp;
mask=*p_ponMask;
/*setvlan*/
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
stAddr.dwIp = ip;
stAddr.dwMask = mask;
SetOnuPonIpAddress(&stAddr);
return;
}
设置IP函数代码实现过程如下:
void SetOnuPonIpAddress(void * inAddr)
{
/*define var*/
…
STRU_OMCI_VOIP_SYS_IP*pAddr = (STRU_OMCI_VOIP_SYS_IP *)inAddr;
if(NULL==pAddr)
return;
printf("7777ip:%d mask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
但在执行过程当中出现以下错误,导致系统重启。
ip-bc0aa8c0,mask-ffffff
777Alignment trap:pasuser (92) PC=0x0006bacc Instr=0xe5922000 Address=0x0024bcee FSR 0x013
7 ip:-1140152128mask:16777215
?
2. 其它测试问题现象
针对以上问题分别对以下情况测试
l 修改SetOnuPonIpAddress(STRU_OMCI_VOIP_SYS_IP*pinAddr)输入参数为(STRU_OMCI_VOIP_SYS_IP*)类型指针,
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen = 0;
int ip;
intmask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP stAddr;
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
stAddr.dwIp = ip;
stAddr.dwMask= mask;
SetOnuPonIpAddress(&stAddr);
return;
}
SetOnuPonIpAddress1(STRU_OMCI_VOIP_SYS_IP *pinAddr)
{
/*definevar*/
…
STRU_OMCI_VOIP_SYS_IP *pAddr =
pinAddr;
if(NULL==pAddr)
return;
printf("ip:%dmask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
但在执行过程同样会出现上述错误提示,导致系统重启。
ip-6401000a,mask-ffffff
INPUT:stAddr=24cAlignmenttrap: pasuser (92) PC=0x0006be7cInstr=0xe5922000 Address=0x0024c4d6 FSR 0x013
4d61.output inAddr:0x24c4d6
2.output pnAddr:0x6b950
3.output inAddr:0x24c4d6
4.output pnAddr:0x24c4d6
在STRU_OMCI_VOIP_SYS_IP stAddr; stAddr地址值0x24c4d6是一个不对齐的地址值,输入到SetOnuPonIpAddress1(0x24c4d6)出现Alignment trap异常提示错误。
l 修改SetOnuPonIpAddress(STRU_OMCI_VOIP_SYS_IP**pinAddr)输入参数为(STRU_OMCI_VOIP_SYS_IP**)类型指针,
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen =0;
int ip;
intmask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP *pstAddr;
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
pstAddr->dwIp = ip;
pstAddr->dwMask = mask;
SetOnuPonIpAddress(&pstAddr);
return;
}
SetOnuPonIpAddress1(STRU_OMCI_VOIP_SYS_IP **pinAddr)
{
/*definevar*/
…
STRU_OMCI_VOIP_SYS_IP *pAddr = *pinAddr;
if(NULL==pAddr)
return;
printf("ip:%dmask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
可以正确执行。
l 修改SetOnuPonIpAddress(STRU_OMCI_VOIP_SYS_IPinAddr)输入参数为(STRU_OMCI_VOIP_SYS_IP**)类型指针,
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen = 0;
int ip;
intmask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP stAddr;
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
stAddr.dwIp = ip;
stAddr.dwMask = mask;
SetOnuPonIpAddress(stAddr);
return;
}
SetOnuPonIpAddress1(STRU_OMCI_VOIP_SYS_IP inAddr)
{
/*definevar*/
…
STRU_OMCI_VOIP_SYS_IP *pAddr =
&inAddr;
if(NULL==pAddr)
return;
printf("ip:%dmask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
可以正确执行。
l 修改类型指针,
3. 几点总结:
1) 对于以上发生问题情况,只针对特定编译环境下的测试分析结果,对于其它类型的CPU,编译环境以下总结不一定成立。
2) 在STRU_OMCI_VOIP_SYS_IP stAddr; stAddr地址值0x24c4d6是一个不对齐的地址值,输入到SetOnuPonIpAddress1(0x24c4d6)出现Alignment trap异常提示错误,建议对定义的结构体中检查是否有不对齐的定义。
3) 对于用(void*)类型作为输入参数,因这个地址所指向类型及空间并不能确定,只表明这个地址是可以指向任何数据类型的指针,而它是作为一个输入参数,是不可以对其地址空间进行变化的,而在函数内部还需要对其进行强制类型转化,尤其对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针参数所指向的空间是不允许对其重新检查修改。
4) 对于用(STRU_OMCI_VOIP_SYS_IP*)类型作为输入参数,只表明这个地址是指向STRU_OMCI_VOIP_SYS_IP*类型的指针,而它是作为一个输入参数,是不可以对其地址空间进行变化的,对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针参数所指向的空间是不允许对其重新检查修改。
5) 对于用(STRU_OMCI_VOIP_SYS_IPinAddr)对象变量类型作为输入参数,表明对象变量地址空间大小完全能确定,对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个对象变量参数所占用的空间是允许对其重新检查修改。
6) 对于用(STRU_OMCI_VOIP_SYS_IP **pinAddr) 指向指针的指针类型作为输入参数,表明*pinAddr里是一个地址值,是指向STRU_OMCI_VOIP_SYS_IP *类型的指针,而它并不是作为一个输入参数,而是作为一个指针变量,可以对其地址空间是可以变化。对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针变量参数所指向的空间是允许对其重新检查修改。
在设置VLAN后会调用SetOnuPonIpAddress函数去设置IP地址,函数代码实现过程如下
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen = 0;
intip;
int mask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP stAddr;
/*取出ip地址和mask*/
rcDbGet(SipSys_IpAddr,POTS_SYS_NUM,&ipLen,(char**)&p_ponIp);
rcDbGet(SipSys_IpMask,POTS_SYS_NUM,&maskLen,(char**)&p_ponMask);
ip= *p_ponIp;
mask=*p_ponMask;
/*setvlan*/
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
stAddr.dwIp = ip;
stAddr.dwMask = mask;
SetOnuPonIpAddress(&stAddr);
return;
}
设置IP函数代码实现过程如下:
void SetOnuPonIpAddress(void * inAddr)
{
/*define var*/
…
STRU_OMCI_VOIP_SYS_IP*pAddr = (STRU_OMCI_VOIP_SYS_IP *)inAddr;
if(NULL==pAddr)
return;
printf("7777ip:%d mask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
但在执行过程当中出现以下错误,导致系统重启。
ip-bc0aa8c0,mask-ffffff
777Alignment trap:pasuser (92) PC=0x0006bacc Instr=0xe5922000 Address=0x0024bcee FSR 0x013
7 ip:-1140152128mask:16777215
?
2. 其它测试问题现象
针对以上问题分别对以下情况测试
l 修改SetOnuPonIpAddress(STRU_OMCI_VOIP_SYS_IP*pinAddr)输入参数为(STRU_OMCI_VOIP_SYS_IP*)类型指针,
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen = 0;
int ip;
intmask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP stAddr;
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
stAddr.dwIp = ip;
stAddr.dwMask= mask;
SetOnuPonIpAddress(&stAddr);
return;
}
SetOnuPonIpAddress1(STRU_OMCI_VOIP_SYS_IP *pinAddr)
{
/*definevar*/
…
STRU_OMCI_VOIP_SYS_IP *pAddr =
pinAddr;
if(NULL==pAddr)
return;
printf("ip:%dmask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
但在执行过程同样会出现上述错误提示,导致系统重启。
ip-6401000a,mask-ffffff
INPUT:stAddr=24cAlignmenttrap: pasuser (92) PC=0x0006be7cInstr=0xe5922000 Address=0x0024c4d6 FSR 0x013
4d61.output inAddr:0x24c4d6
2.output pnAddr:0x6b950
3.output inAddr:0x24c4d6
4.output pnAddr:0x24c4d6
在STRU_OMCI_VOIP_SYS_IP stAddr; stAddr地址值0x24c4d6是一个不对齐的地址值,输入到SetOnuPonIpAddress1(0x24c4d6)出现Alignment trap异常提示错误。
l 修改SetOnuPonIpAddress(STRU_OMCI_VOIP_SYS_IP**pinAddr)输入参数为(STRU_OMCI_VOIP_SYS_IP**)类型指针,
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen =0;
int ip;
intmask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP *pstAddr;
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
pstAddr->dwIp = ip;
pstAddr->dwMask = mask;
SetOnuPonIpAddress(&pstAddr);
return;
}
SetOnuPonIpAddress1(STRU_OMCI_VOIP_SYS_IP **pinAddr)
{
/*definevar*/
…
STRU_OMCI_VOIP_SYS_IP *pAddr = *pinAddr;
if(NULL==pAddr)
return;
printf("ip:%dmask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
可以正确执行。
l 修改SetOnuPonIpAddress(STRU_OMCI_VOIP_SYS_IPinAddr)输入参数为(STRU_OMCI_VOIP_SYS_IP**)类型指针,
void SetOnuPonVlan(Word wVlanID, int Cos)
{
charszVlanCmd[100] = {0};
int *p_ponIp = NULL;
ushort_t ipLen = 0;
int ip;
intmask;
int *p_ponMask = NULL;
ushort_t maskLen = 0;
STRU_OMCI_VOIP_SYS_IP stAddr;
…
/*setip address*/
printf("\r\nip-%x,mask-%x\r\n",ip,mask);
stAddr.dwIp = ip;
stAddr.dwMask = mask;
SetOnuPonIpAddress(stAddr);
return;
}
SetOnuPonIpAddress1(STRU_OMCI_VOIP_SYS_IP inAddr)
{
/*definevar*/
…
STRU_OMCI_VOIP_SYS_IP *pAddr =
&inAddr;
if(NULL==pAddr)
return;
printf("ip:%dmask:%d\r\n", pAddr->dwIp, pAddr->dwMask);
/*Set ip */
…
return;
}
可以正确执行。
l 修改类型指针,
3. 几点总结:
1) 对于以上发生问题情况,只针对特定编译环境下的测试分析结果,对于其它类型的CPU,编译环境以下总结不一定成立。
2) 在STRU_OMCI_VOIP_SYS_IP stAddr; stAddr地址值0x24c4d6是一个不对齐的地址值,输入到SetOnuPonIpAddress1(0x24c4d6)出现Alignment trap异常提示错误,建议对定义的结构体中检查是否有不对齐的定义。
3) 对于用(void*)类型作为输入参数,因这个地址所指向类型及空间并不能确定,只表明这个地址是可以指向任何数据类型的指针,而它是作为一个输入参数,是不可以对其地址空间进行变化的,而在函数内部还需要对其进行强制类型转化,尤其对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针参数所指向的空间是不允许对其重新检查修改。
4) 对于用(STRU_OMCI_VOIP_SYS_IP*)类型作为输入参数,只表明这个地址是指向STRU_OMCI_VOIP_SYS_IP*类型的指针,而它是作为一个输入参数,是不可以对其地址空间进行变化的,对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针参数所指向的空间是不允许对其重新检查修改。
5) 对于用(STRU_OMCI_VOIP_SYS_IPinAddr)对象变量类型作为输入参数,表明对象变量地址空间大小完全能确定,对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个对象变量参数所占用的空间是允许对其重新检查修改。
6) 对于用(STRU_OMCI_VOIP_SYS_IP **pinAddr) 指向指针的指针类型作为输入参数,表明*pinAddr里是一个地址值,是指向STRU_OMCI_VOIP_SYS_IP *类型的指针,而它并不是作为一个输入参数,而是作为一个指针变量,可以对其地址空间是可以变化。对于对对齐要求严格的系统,是要对内存空间做对齐处理(是不是这个引起?),而这个地址指针变量参数所指向的空间是允许对其重新检查修改。
|
相关文章推荐
- 记忆的品质
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
- Jackson 框架,轻易转换JSON
- 数据结构基础(8) --单链表的设计与实现(1)之基本操作
- Eclipse 4.5.0 离线安装 Veloeclipse 插件
- Adb refused a command 解决方法
- AX2009报表发送邮件(一)
- iOS des加密
- Linxu的struct ifaddrs 与getifaddrs()函数
- Reachability判断网络是否连接
- InterfaceConnect
- 用CocoaPods做iOS程序的依赖管理
- JS实现从网页顶部掉下弹出层效果的方法
- Oracle异常整理
- 推荐算法工程师
- 第一章:taglib 原理和实现
- 数据结构基础(7) --循环队列的设计与实现
- 酷炫图片展示特效
- 【hibernate】spring+ jpa + hibername 配置过程遇到的问题
- DZY Loves Chemistry