linux c programming時,調用getenv函數時,程序會觸發segment fault。定位到的現象:
環境:amd64 ubuntu16.04 gcc-5
代碼1:
printf("pwd %p\n", getenv("PWD"));
對應彙編:
這裏我們可以看到,getenv返回的值保存在rax中,但是printf的參數是eax傳遞的。因此64bit的地址會被截斷成32位。
代碼2:
printf("pwd %p\n", (void *)getenv("PWD"));
這裏在getenv處加了強制類型轉換,成一個指針類型。彙編層面編譯器做了優化,cdqe代表擴展帶符號擴展,從32bit擴展到64bit符。因此結果可能是0xffffffffffffef79 。
解決方案:
產生問題的原因,在於沒有加頭文件。
#include <stdlib.h>
參考:
https://lauri.xn--vsandi-pxa.com/2010/06/getenv-segfaults.html