sprintf引發的死迴圈

2021-07-25 03:21:43 字數 658 閱讀 5215

呼叫了不安全的sprintf,一開始自信滿滿覺得反正自己知道源和目的變數的記憶體,複製過去不會溢位的,所以就用這個不安全的函式吧

錯誤**:

int get_len(char *buffer, int len);

int dig = 0;

if(sprintf(temp,"%x",buffer[i]) == -1)

if(temp[0] >= 'a')else

sleep(1);

printf("afi:%d\n",i);

printf("num:%d %d\n",dig,num);

num = num*16 + dig;

} return num;

}

printf("bei:%d\n",i);printf("afi:%d\n",i);
分別列印sprinf語句執行前後的i值,列印出來結果可以觀察到sprintf後i值被修改了,原因是
sprintf(temp,"%x",buffer[i])

buffer[i]雖然是乙個位元組但是"%x"後變為4位元組,而temp就乙個位元組,所以產生溢位,而溢位時候又恰好修改了區域性變數i,所以最終死迴圈

shell 死迴圈if判斷 shell 死迴圈

例1 執行指令碼後會自動載入firefox瀏覽器,並開啟指定網頁。如果使用者關閉firefox,指令碼會再次自動重新開啟firefox。如需結束迴圈,中止t2.sh程序即可。注意不要同時執行兩個t1.sh指令碼,否則 若事先不知道指令碼名,也可以通過類似於 pstree grep firefox 的...

死迴圈和巢狀迴圈

死迴圈 也就是迴圈中的條件永遠為true,死迴圈的是永不結束的迴圈。例如 while true 在後期的開發中,會出現使用死迴圈的場景,例如 我們需要讀取使用者輸入的輸入,但是使用者輸入多少資料我們並不清楚,也只能使用死迴圈,當使用者不想輸入資料了,就可以結束迴圈了,如何去結束乙個死迴圈呢,就需要使...

死迴圈中的cin

在編寫程式時,遇到了乙個致命的問題,原本是想使用cin輸入乙個int型的數值,但是錯誤的輸入了char或者string型,導致程式進入死迴圈。類似程式如下 include using namespace std int main while i 0 return 0 定義了乙個int型的 i 但是當...