其他分享
首页 > 其他分享> > 两种段错误(Segment Fault)(SIGSEGV)

两种段错误(Segment Fault)(SIGSEGV)

作者:互联网

近期调试过程中,遇到两种段错误(Segment Fault)

(一)数组越界

void func2(uint8_t* array)
{
    uint8_t size = readfromoutside();
    uint8_t* buff = readfromoutside();
    memcpy(array,  buff, size);
    return;   
}

void func1()
{
  uint8_t array[32]={0};
  func2(array);
  return;
}    

在上述代码中,size一般情况下只可能是2、4、8、16、32,因为这是预先配置的。

但是在非正常测试(地址线信号干扰)过程,size的值会异常,不再是预配置中的一个,比如100,168等。

这样就造成了memcpy时数组array的越界。从而造成段错误,并发出SIGSEGV的signal。

Debug时这种段错误往往会指向func2()跳出后的一个指针变量为0或者异常值。

(二)函数调用堆栈溢出

void func1()
{
    if(cond1)
         func2()
    else
        other_handle1();
    return;
}
void func2()
{
    if(cond2)
       func1();
    else
        other_handle2();
    return;
}    

比如上述代码,测试过程中,出现cond1和cond2同时成立的情况,造成了func1()和func2()在循环调用。

这种只会发生段错误,但是不会发出SIGSEGV的signal(至少没有捕捉到)。

Debug时这种段错误往往会指向系统函数,还是汇编,不好排查。

 

标签:func2,func1,return,SIGSEGV,Fault,void,array,Segment,size
来源: https://www.cnblogs.com/threegatesblog/p/16676263.html