最近再寫一個hsf的代理程式。需要使用libcurl與後端的nginx通信。程式編寫過程中遇到一個蹊跷的問題。
調用 code = curl_easy_getinfo(curl, curlinfo_response_code, &rsp_code); 後會報段錯誤。
示例代碼如下:
問題:
int rsp_code;
code = curl_easy_getinfo(curl, curlinfo_response_code, &rsp_code);
當rsp_code設定為int類型 會有段錯誤。如果long類型沒問題。
分析:
下載下傳了libcurl的代碼,查找原因。
原來curl_easy_getinfo的實作使用了可變參數。即,在編譯時不進行參數個數和參數類型檢測。這樣,在使用這個函數時,無論你傳入的類型是int還是long,都不會報錯。雖然,它要求的是long類型。不過,在指派的時候,他可是按long類型指派的。這樣就導緻棧被破壞了。當然就報段錯誤了。
相關代碼如下:
驗證:
編寫了示例代碼,驗證了假設。注意此代碼在32位作業系統上不會報錯,在64位作業系統上會報段錯誤。注意隻有在int和long類型長度不一緻時才會出現段錯誤。如在64位作業系統。
輸出:
看來,寬松意為着需要更加嚴謹。沒有條條框框的限制,得做好自我限制。