簡體   English   中英

strncpy對於iPhone開發是否安全?

[英]Is strncpy secure for iPhone development?

對於iPhone開發, strncpy()安全嗎?

如果不是,那么建議使用哪種更好的String API以確保安全?

如果您知道strncpy()的局限性,那就可以了。 我避免使用它是因為我不喜歡它的局限性,它有兩個方面:

  • 它不保證空終止
  • 它總是寫入目標緩沖區的每個字節

這意味着如果您編寫:

char little[10];
char large[20480];

strncpy(little, sizeof(little), "abcdefghijklmnopqrstuvwxyz");
strncpy(large,  sizeof(large),  "abcdefghijklmnopqrstuvwxyz");

然后,即使沒有發生緩沖區溢出, little是一個以空字符結尾的字符串,並且大的字符串有20454個空值被復制到其尾端。 兩者都很麻煩。

  • 考慮一下strlcpy()strlcat()在iOS上是否可用; 它們在Mac OS X上。

如果您使用C ++進行編碼,則根本不應該使用C字符串,或者僅在系統服務需要使用的最有限的情況下使用C字符串,然后才應該具有使用C ++字符串的Cover函數(內聯)。並將somestring.c_str()值傳遞給系統服務。

如果在Objective-C中進行編碼,則將使用NS *字符串。

因此,如果您使用C語言進行編碼,請僅考慮strncpy()

我有一篇論文(我並沒有主張新穎性,而是從別人那里收集了這個想法):

  • 如果您知道字符串的長度(目標緩沖區和源字符串)(並且知道該函數的缺點strcpy() ,則只能安全地使用strcpy()strncpy()strcat()strncat()之類的函數。重新調用—很快,傳遞給strncat()的長度代表什么? (1) )。
  • 如果您知道所有內容有多長時間,則無需使用strcpy()類的函數; 您可以使用memmove() (或memcpy() )。
  • 因此,字符串復制和移動功能應該無關緊要; 您不需要使用安全的代碼,因為您知道所有內容有多長時間,因此可以改用內存例程。

(1)長度是考慮到當前字符串后目標緩沖區中的可用空間。 因此,要使用strncat() ,您必須知道字符串在目標字符串中的長度以及可用的總長度,以便您可以讓strncat()跳過字符串的初始段,然后連接一些字符串或所有第二個字符串。 但是,如果您知道這一點,則可以使用:

strncpy(target + curr_target_strlen, source, target_size - curr_target_strlen);

這將是“更有效的”,因為它不涉及跳過字符串的前導部分(順便說一句,如果您要構建帶有許多strncat()strcat()操作的長字符串,則可能導致二次行為)。 或者,如果您知道所有大小,則可以使用memmove()

size_t copy_length = target_size - curr_target_strlen;
if (copy_length > source_strlen)
    copy_length = source_strlen + 1;
memmove(target + curr_target_strlen, source, copy_length);

而且,除非我一時沖動編寫的代碼出現一個錯誤,否則可以避免strncat()大多數問題。 如果您始終使用strncat() ,並且第一個參數指向字符串末尾的null,則它有其用途(並且可以在匯編程序中進行優化。否則,這不是一個好選擇-IMNSHO。

指定安全性的含義,無論如何,在iPhone上的strncpy都與在其他平台上一樣安全。

由於您需要strncpy我想您不是在使用NSString所以使用它不會出現任何問題。

暫無
暫無

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

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