關於gets函式的不安全說明與分析(41)

2021-09-29 12:03:01 字數 1802 閱讀 9910

很多不安全的函式我們在使用過程中會帶來一些致命性的錯誤,現在編譯器已經將很多函式進行了安全性的修改說明,甚至已經摒棄,這裡我們分析一下一些函式為什麼會在函式安全性上面出現一些問題。

**演示:

#include

intmain()

上面是通過scanf函式輸入乙個字串並且通過printf函式輸出字串。

我們給出以下輸入和結果:

arr定義的時候給了10個空間,也就是說字串的長度最長為9個,如果我們直接輸入9個連續的字元肯定沒有問題,我們在這裡只提出需要注意的情況

①上面我們輸入的長度小於最大長度,但是中間按下了空格,那麼在輸出的時候空格後面的輸入是不會被讀取到的。

第二種情況:輸入越界

我們可以看到輸入的長度大於字串所給的最大長度的就會直接報錯。

③我們有輸入字串的庫函式gets()

#include

intmain()

測試:

我們可以看到輸入的長度比要求的最長的字串小,即使中間輸入空格,空格一會被輸出列印。

我們再測試另一種情況:

gets 函式裡面輸入的字串過長也會出現直接崩潰的情況。

以上所有所有出現的錯誤都是因為越界,及就是輸入的字串長度比要求的字串長度長。這也就是不安全的原因,在實際開發中,使用者的輸入是隨機的。

所以gets函式現在已經被摒棄

我們現在用安全的輸入字串的函式:

fgets()函式

我們先給出fgets函式的基本用法和資訊:

更多詳細的資訊大家可以在幫助手冊中檢視。

那麼也就是說fgets函式一共有三個引數:

①:輸入的字串名

②:所要讀取的最大字元數

③:表示指向檔案的指標(這裡不用過多糾結,就是輸入的檔案,從鍵盤我們用stdin表示)

接下來我們演示以下使用fgets函式來輸入字串:

#include

intmain()

測試:

我們可以看到這裡即使我們輸入的長度比要求的長,但是只會讀取前9個字元,我們開始arr給的10個空間,最後乙個空間要儲存\0來標識字串的結束,所以只能讀取到9個字元。

測試:通過fget函式裡面,空格也是被輸入。

我們最後再解釋一下fgets函式的引數

當然還有其他不安全的函式,我們之後也會有更多的說明,函式的不安全性所帶來的危險值得我們在開發過程中隨時重視,因為:使用者輸入的資料是不確定的,記住,使用者不確定的時候,程式在編寫的過程就要考慮到把不利的一面解決。

gets 函式的不安全性

在linux下編譯c檔案時出現 warning the gets function is dangerous and should not be used問題在於gets 函式在獲取輸入時,不會對輸入有檢查,如果無限輸入會造成棧空間溢位,在程式返回時,不能正常的找到返回位址,程式將發生不可 行為。使...

執行緒安全與不安全

list介面下面有兩個實現 乙個是arraylist 另外乙個是vector 從原始碼的角度來看 vector的方法前加了,synchronized 關鍵字,也就是同步的意思,sun公司希望vector是執行緒安全的,而希望arraylist是高效的,缺點就是另外的優點。在 items size 的...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...