对于iPhone开发来说,strncpy安全吗?

Ken*_*Lim 0 c++ string iphone printf

strncpy()安全的iPhone发展?

如果没有,建议使用哪种更好的String API是安全的?

Jon*_*ler 5

如果您知道其局限性strncpy(),那就没关系.我避免它,因为我不喜欢它的局限性,这有两个方面:

  • 它不保证空终止
  • 它总是写入目标缓冲区的每个字节

这意味着如果你写:

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

strncpy(little, sizeof(little), "abcdefghijklmnopqrstuvwxyz");
strncpy(large,  sizeof(large),  "abcdefghijklmnopqrstuvwxyz");
Run Code Online (Sandbox Code Playgroud)

然后little不是以空字符结尾的字符串,虽然没有发生缓冲区溢出,并且大的20454空值被复制到其尾端.两者都很麻烦.

  • 考虑是否strlcpy()strlcat()可用iOS上; 它们在Mac OS X上.

如果您使用C++进行编码,则根本不应该使用C字符串,或者仅在系统服务需要使用的最有限的情况下使用,然后您应该有一个带有C++字符串的封面函数(内联)并将somestring.c_str()值传递给系统服务.

如果您使用Objective-C进行编码,则将使用NS*字符串.

所以,只考虑strncpy()你是否在C编码.即使这样也要小心.

我有一篇论文(我并没有在其中提出任何新颖性 - 我从其他人那里收集了这个想法):

  • 如果你知道字符串的长度,目标缓冲区和源字符串(你知道你正在调用的函数的缺点 - 很快,代表的长度代表什么strcpy(),你只能使用strncpy(),strcat()strncat()安全的函数)strncat()(1)).
  • 如果你知道一切都有多久,你就不需要使用像这样的函数strcpy(); 你可以使用memmove()(或memcpy()).
  • 所以字符串复制和移动功能应该是无关紧要的; 你不需要安全代码,因为你知道一切都是多久,因此可以使用内存例程.

(1)长度是在考虑当前字符串之后目标缓冲区中可用的空间.因此,为了能够使用strncat(),您必须知道字符串在目标字符串中的长度以及可用的总长度,以便您可以strncat()跳过字符串的初始段然后连接部分或全部第二个字符串.但是,如果您知道,您可以使用:

strncpy(target + curr_target_strlen, source, target_size - curr_target_strlen);
Run Code Online (Sandbox Code Playgroud)

这将是"更有效",因为它不涉及跳过字符串的前导部分(顺便说一句,如果您正在构建一个包含大量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);
Run Code Online (Sandbox Code Playgroud)

而且,除非我在一时冲动的代码中出现一个一个一个错误,否则会避免大多数问题strncat().如果你总是使用strncat()指向字符串末尾的null的第一个参数,它有它的用途(并且可以在汇编程序中进行优化.否则,它不是一个好的选择 - IMNSHO.