記錄一個詭異的函式呼叫返回錯誤的指標bug
阿新 • • 發佈:2018-12-25
//main.c#include "test.h"
void main(){
S* s = get_struct_s();
printf("%s\n",s->name);
return 0;
}//test.h
typedef struct S_{
...
char name[8];
} S;S* s_array[10];
//test.c
#include "test.h"
S* get_struct_s(){ return s_array[0];}
在大型程式中,複雜的Makefile可能會通過上面這種project(即能夠編譯成功),但是在執行過程中printf語句會crush,經過gdb定位,是get_struct_s返回了一個錯誤的指標。但是,這個指標在get_struct_s內部的時候是正確的。例如正確的指標是0xaa12345678,返回之後變成了0xffffffff12345678,經過比較可以明顯看出後四個位元組是相同的,函式返回時正確的指標被截斷為4個位元組了。原因是test.h中沒有宣告get_struct_s函式,編譯器為get_struct_s函式的返回值預留了4個位元組,但是實際返回的指標大於4個位元組,產生了截斷,這種bug很不容易察覺。
解決方法是在test.h中宣告函式。
解決方法是在test.h中宣告函式。