2012-04-18 54 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,所以我没有看到使用它的任何问题。