繁体   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