Alf*_*lli 5 iphone crash objective-c memory-alignment
我的应用程序中有一个EXC_ARM_DA_ALIGN崩溃.这是Xcode标记为"恶意"的代码.在模拟器上我没有这个崩溃,只在设备上,所以我认为这是一个内存对齐问题.有谁知道如何修复此代码?非常感谢.
-(int) Save:(void*) pBuf {
int nNeedSize = sizeof(fType) + sizeof(sizeBrush) + sizeof(nBrushType) + sizeof(rcImage) + sizeof(count) + sizeof(data[0]) * count;
if (pBuf == nil)
return nNeedSize;
*(NSInteger*)pBuf = count; pBuf += sizeof(count);
*(BOOL*)pBuf = fType; pBuf += sizeof(fType);
(*(CGSize*)pBuf).width = sizeBrush.width;
(*(CGSize*)pBuf).height = sizeBrush.height;
pBuf += sizeof(sizeBrush);
*(NSInteger*)pBuf = nBrushType; pBuf += sizeof(nBrushType);
(*(CGRect*)pBuf).size.width = rcImage.size.width;
(*(CGRect*)pBuf).size.height = rcImage.size.height;
(*(CGRect*)pBuf).origin.x = rcImage.origin.x;
(*(CGRect*)pBuf).origin.y = rcImage.origin.y;
pBuf += sizeof(rcImage);
for (int i = 0; i < count; i++)
{
(*(CGPoint*)pBuf).x = data[i].x;
(*(CGPoint*)pBuf).y = data[i].y;
pBuf += sizeof(data[0]);
}
return nNeedSize;}
Run Code Online (Sandbox Code Playgroud)
这是另一个被标记为恶性的部分:
int i;
int nTotalSize = 0;
for (i = 0; i < m_Data.count; i++)
{
maskStroke* one = [m_Data objectAtIndex:i];
nTotalSize += [one Save:NULL];
}
unsigned char* buf = (unsigned char*)malloc(nTotalSize+100);
unsigned char* cur_ptr = buf;
for (i = 0; i < m_Data.count; i++)
{
maskStroke* one = [m_Data objectAtIndex:i];
cur_ptr += [one Save:cur_ptr];
}
Run Code Online (Sandbox Code Playgroud)
小智 2
您应该使用结构体或合理的东西来序列化...如果您不能这样做,至少确保您的 32 位和 16 位指针与 16 或 32 位内存地址对齐。
*(int *foo)0x800002 (或 1) 可能会以糟糕的方式结束。某些处理器具有松开未对齐内存地址的功能,但这会浪费周期,并且当您尝试执行此操作时,其他处理器(正确地)会崩溃。如果它没有崩溃,则它正在执行多次内存访问,然后将它们组合起来以创建未对齐的地址。
| 归档时间: |
|
| 查看次数: |
5977 次 |
| 最近记录: |