[英]Why is strncpy marked as unsafe?
我收到警告:
warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
F:\vuStudio\VC\include\string.h(188) : see declaration of 'strncpy'
我在stackoverflow.com上讀到strcpy
不安全,我應該使用strncpy
代替。 但是現在我為什么要警告strncpy是不安全的?
我稱之為:
strncpy(this->title, title.c_str(), sizeof(this->title));
strncpy
有一些危險的怪癖。
首先,它將目標緩沖區歸零到副本的末尾,這可能會令人驚訝。
其次,如果沒有足夠的空間目標緩沖區,它不空終止目標緩沖區。
第三,如果它被截斷,它“主要起作用”。 這會阻止錯誤處理(截斷的字符串通常比無用的更糟糕,但乍一看似乎沒有比無用更差)。
strncpy_s
需要一個輸入長度(或顯式截斷請求),如果沒有足夠的空間來終止null(在輸出中只寫一個零長度的字符串),則需要輸入錯誤。 輸入長度有時提供效率低(並且對於某些更改不是必需的),但它確實保證了空終止輸出緩沖區(只要它不是nullptr或零長度),即使在錯誤條件下也是如此。 我不確定它是否會復制到復制字符串的末尾。
此行為可防止或減輕字符串代碼中的一些常見fenceposting錯誤。
Visual Studio編譯器有自己的strncpy
實現,你不會用gcc或clang得到這個警告。 使用strncpy
是安全的,更便攜(因為strncpy_s
不是標准的)。
如果你不關心可移植性, strncpy_s
確實更安全,因為它有一個額外的長度檢查(但是像strncpy
一樣,如果傳遞壞參數,它將無法保存你)。
str函數的“n”變體(如strncmp,strncpy等)是“安全”的選擇,因為它們都限制了所使用的字符串緩沖區的大小。 “舊的”str函數(不是“n”變體,如strcpy)都受到許多編程錯誤和內存攻擊(一個關閉,堆重寫等)。
您應該在Visual C ++中使用strncpy_s。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.