两种段错误(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