簡體   English   中英

itoa()的安全對應物?

[英]Safe counterparts of itoa()?

我正在將一些舊的c程序轉換為更安全的版本。 以下功能被大量使用,有人能告訴我他們的安全對應物嗎? Windows函數或C運行時庫函數。 謝謝。

itoa()
getchar()
strcat()
memset()

itoa()是安全的,只要目標緩沖區足夠大以接收最大可能的表示(即具有尾隨NUL的INT_MIN)。 因此,您只需檢查緩沖區大小即可。 盡管如此,它不是一個非常好用的函數,因為如果你將數據類型更改為更大的整數類型,你需要更改為atolatollatoq等。如果你想要一個動態緩沖區來處理你拋出的任何類型考慮到維護問題較少,請考慮使用std::ostringstream (來自<sstream>標頭)。

getchar()沒有“安全對應物” - 開始時並不安全,並且沒有緩沖區溢出潛力。

Re memset() :它是危險的,因為它接受程序員判斷內存應該被覆蓋而沒有任何內容/地址/長度的確認,但是如果使用得當它沒有任何問題,有時它甚至是工作的最佳工具。現代C ++編程。 要檢查安全性問題,您需要檢查代碼並確保它針對合適的緩沖區或對象進行加密,並且正確計算長度(提示:盡可能使用sizeof)。

如果連接的字符串不知道是否適合目標緩沖區,則strcat()可能會很危險。 例如: char buf[16]; strcpy(buf, "one,"); strcat(buf, "two"); char buf[16]; strcpy(buf, "one,"); strcat(buf, "two"); 完全安全(但很脆弱,因為進一步操作或更改任一字符串可能需要超過16個字符而編譯器不會警告你),而strcat(buf, argv[0])則不是。 最好的替換往往是std :: ostringstream,盡管這可能需要對代碼進行大量的重寫。 你可以使用strncat() ,甚至 - 如果你有 - asprintf("%s%s", first, second) ,它將在堆上分配所需的內存量(請記住free()它) )。 您還可以考慮使用std :: string並使用operator +來連接字符串。

如果您了解行為和限制,這些功能都不會“不安全”。 itoa不是標准C,如果您擔心,應該用sprintf("%d",...)替換。

其他人對經驗豐富的從業者都很好。 如果您認為某些特定情況可能不安全,則應將其張貼。

我會改變itoa(),因為它不是標准的,如果你的目標是代碼安全性,那么使用sprintf或更好的snprintf。 我也想改變與strncat函數()的strcat(),但是,因為你指定的C ++語言也一樣,一個真正的更好的主意是使用std :: string類。

至於其他兩個函數,我看不出如何在不看代碼的情況下使代碼更安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM