对于iPhone开发,strncpy是否安全?
如果您知道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。
指定您的安全意味着什么,无论如何iPhone上的strncpy
与其他平台上的安全一样。
由于您需要strncpy
我想你没有使用NSString
s,所以我没有看到使用它的任何问题。
它会更多如果你指定了更多的上下文,那么它会有帮助......你想拷贝什么,为什么它需要安全,等等...... – Timmerz 2012-04-18 03:17:03