2012-04-18 58 views
0

strncpy() secure的iPhone版?對於iPhone開發,strncpy是否安全?

如果不是,建議使用哪種更好的字符串API以確保安全?

+0

它會更多如果你指定了更多的上下文,那麼它會有幫助......你想拷貝什麼,爲什麼它需要安全,等等...... – Timmerz 2012-04-18 03:17:03

回答

5

如果您知道strncpy()的限制,那麼它是可以的。我不去,因爲我不喜歡它的侷限性,這有兩方面:

  • 它並不能保證空終止
  • 它總是寫入到目標緩衝區

這的每個字節也就是說,如果你寫:

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

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

然後little不是一個空結束的字符串,雖然沒有發生緩衝區溢出,並有較大的空20454複製它的T結束了。兩者都很麻煩。

  • 請考慮strlcpy()strlcat()是否適用於iOS;它們在Mac OS X上。

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

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

所以,如果你用C編碼,只考慮strncpy()。即使如此,也要謹慎對待。

我有一個論點(我不生任何要求的新穎性在它—我收集別人的想法):

  • 您只能使用功能,如strcpy()strncpy()strcat()strncat()安全如果你知道字符串的長度,目標緩衝區和源字符串(你知道你快速調用的功能的弱點,那麼傳遞給strncat()的長度代表什麼?(1))。
  • 如果你知道一切都是多久,你不需要使用像strcpy()這樣的函數;您可以使用memmove()(或memcpy())。
  • 所以字符串複製和移動功能應該是不相關的;你不需要它們在安全的代碼中,因爲你知道一切都是多久,因此可以使用內存例程。

(1)長度在當前字符串是佔後目標緩衝器中的可用空間。因此,要使用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(),並且第一個參數指向字符串末尾的空值,則它有其用處(並且可能會在彙編程序中進行優化。否則,它不是一個好的選擇IMNSHO。

0

指定您的安全意味着什麼,無論如何iPhone上的strncpy與其他平臺上的安全一樣。

由於您需要strncpy我想你沒有使用NSString s,所以我沒有看到使用它的任何問題。