strcpy 在 ios7 上的行为不同

Posted

技术标签:

【中文标题】strcpy 在 ios7 上的行为不同【英文标题】:strcpy behaving differently on ios7 【发布时间】:2013-09-20 11:40:48 【问题描述】:

ios7 似乎带有字符串 strcpy 的新实现(可能是优化)。在我能够从数组的任何位置复制字符串之前,但现在如果我从 (i % 4 != 0) 的任何位置开始复制,它将崩溃。

为了证明这一点,我在 iOS6 和 7 中都运行了这段代码,但它在 7 上使应用程序崩溃:

  char *x = malloc(1024);
  strcpy(x, "hello world");
  char *x2 = x + 1;
  strcpy(x, x2);

我做错了什么?

【问题讨论】:

正在运行 valgrind Source and destination overlap in strcpy 【参考方案1】:

C11 标准在 §7.24.2.3 中说:

The strcpy function copies the string pointed to by s2 (including the terminating 
null character) into the array pointed to by s1. If copying takes place between 
objects that overlap, the behavior is undefined.

未定义的行为意味着任何事情都可能发生——代码可以完美运行,它可能会崩溃,或者它可以在一天正常工作,然后在下一天崩溃。由于xx2 在您的代码中重叠,它在iOS 6 中工作的事实只是运气好。

【讨论】:

我认为它运行良好的事实运气,因为它是一个严重的错误,直到很久以后才被发现。

以上是关于strcpy 在 ios7 上的行为不同的主要内容,如果未能解决你的问题,请参考以下文章

由 xcode 4.6 与 xcode 5.0 创建时,iOS 应用程序在 iOS 7.0 设备上的行为不同

带有iOS7的iphone上的UIDocumentInteractionController奇怪的行为

UITableView 在 IOS 7 与 IOS 6 中的行为不同

iOS7 智能横幅消失

UIPopoverController 的大小调整行为在 iOS 7.0 和 iOS 7.1 之间有所不同

iOS 7 到 iOS 8 中当前位置纬度和经度的不同行为