1. 程式人生 > >記錄一個詭異的函式呼叫返回錯誤的指標bug

記錄一個詭異的函式呼叫返回錯誤的指標bug

//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中宣告函式。