ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-09-10 12:33:22  阅读:229  来源: 互联网

标签:func2 func1 return SIGSEGV Fault void array Segment size


近期调试过程中,遇到两种段错误(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有