gpt4 book ai didi

iphone - strncpy 对 iPhone 开发安全吗?

转载 作者:太空宇宙 更新时间:2023-11-04 16:27:52 25 4
gpt4 key购买 nike

strncpy() 对 iPhone 开发安全吗?

如果不是,推荐使用哪种更好的字符串 API 是安全的?

最佳答案

如果您知道 strncpy() 的局限性,那就没问题了。我避免使用它是因为我不喜欢它的局限性,这有两个方面:

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

这意味着如果你写:

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

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

然后 little 不是空终止字符串,虽然没有发生缓冲区溢出,并且 large 有 20454 个空值复制到它的尾端。两者都很麻烦。

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

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

如果您使用 Objective-C 编码,您将使用 NS* 字符串。

因此,如果您使用 C 编写代码,则只考虑 strncpy()。即便如此,也要谨慎对待。

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

  • 如果您知道字符串的长度,目标缓冲区和源字符串(并且您知道您正在调用的函数的缺点 - 很快,传递给 strcpy() 的长度代表什么?(1)).
  • 如果你知道每件事有多长,你就不需要使用像 strncpy() 这样的函数;您可以使用 strcat()(或 strncat())。
  • 所以字符串复制和移动函数应该是无关紧要的;您不需要在安全代码中使用它们,因为您知道所有内容的长度,因此可以改用内存例程。

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

strncpy(target + curr_target_strlen, source, target_size - curr_target_strlen);

这会“更有效率”,因为它不涉及跳过字符串的前导部分(顺便说一下,如果您正在构建一个包含大量 memmove()memcpy() 操作的长字符串,这可能会导致二次行为) .或者,假设您知道所有尺寸,您可以使用 strncat() :

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,那么它有其用途(并且可以在汇编器中进行优化。否则,这不是一个好的选择 — 恕我直言。

关于iphone - strncpy 对 iPhone 开发安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10202266/

25 4 0
文章推荐: javascript - 如何跨 Controller 和模块动态地将指令添加到 AngularJS 中的所有输入元素
文章推荐: javascript - 有条件地使用 STUN 服务器
文章推荐: html -