【Error】記一次缺失頭文件的導致的getenv segment fault

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章