簡體   English   中英

為什么strncpy標記為不安全?

[英]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.

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