在iOS中除-o0之外的任何优化级别崩溃

时间:2012-02-24 13:30:41

标签: ios xcode optimization llvm

当优化级别为-o0时,以下两段代码可以正常工作。 但是,当优化级别不是-o0时,第一个代码会在某个时刻崩溃,但秒数不会崩溃。你能解释一下原因吗?

1

unsigned char* _pos = ...;

double result;

*((int*)&result) = *((int*)_pos;

2

unsigned char* _pos = ...;
double result;

int* curPos = (int*)_pos;
int* resultPos = (int*)&result;
*resultPos = *curPos;

编辑: 顺便说一下,这段代码是内联函数。当函数没有内联时,即使使用优化也不会崩溃。

1 个答案:

答案 0 :(得分:4)

这里的代码实际上会同时产生几个问题。 首先,如前所述,代码违反了别名规则,因此每个标准的结果是不确定的。因此,严格地说,编译器可以在优化时做一堆事情(当上面提到的代码被内联时,这实际上是你的情况)。

其次(我相信这是实际问题) - 将char *转换为int *将增加指针的假定对齐方式。根据您的平台ABI,char可以是1字节对齐,但int - 至少4(double是8字节对齐,顺便说一句)。系统可以容忍未对齐的负载,但并非总是如此,例如,在arm / darwin上,它可以容忍4个字节的未对齐加载,但不能容忍8。后一种情况可能发生在编译器决定合并两个连续加载/存储为1.因为你碰到指针编译器的实际对齐可能会推断出一切都是适当对齐并生成这样的8字节加载。

所以,简而言之 - 修复你的代码:)在这个特殊情况下,memcpy / memmove会帮助你。