iOS 如何处理低级 C/Objective-C 代码的内存损坏?
How iOS handles memory corruption from low level C/ Objective-C code?
我有一个 iOS 应用程序,它使用一些使用指针的遗留低级内存操作代码。我正在调试一个问题,其中多个线程导致这些代码的多个副本同时在全局变量上执行,并通过写入无效长度或覆盖数据导致内存损坏。
效果是下面缓冲区的长度可能会改变。我已经看到 iOS 作为这些调用的结果抛出 EXC_BAD_ACCESS
或 EXC_BREAKPOINT
。
我的问题是 - 当我不正确地使用 memcpy
时 iOS 会总是抛出异常,还是只有当我在允许的内存之外写入时它才会抱怨?
换句话说,我的代码是否可以随意破坏我的内存并产生不可见的问题,而不会导致异常,只要它不超出分配的内存或访问已释放的内存?
NSData* buffer = ...
Byte *array = (Byte*)malloc(buffer.length);
memcpy(array, buffer.bytes, buffer.length);
上次我检查或遇到这样的问题时,它只会在您自己允许的内存之外时抱怨。在我的情况下,我正在覆盖我试图写入的地址后面的任何对象。结果似乎是随机崩溃的对象甚至 NSString
。
我的错误如下:
MyStructure *myStructure = malloc(sizeof(myStructure)); // Incorrect
MyStructure *myStructure = malloc(sizeof(MyStructure)); // Fixed
一个简单的自动完成错误,导致对这个错误进行了数天的搜索。 MyStructure
是一个相当大的访问,因此在这种情况下访问一些 属性(读和写)将简单地溢出并且 read/write 通过它之后的任何内容。它最终随机崩溃;有时访问错误,有时只是随机对象上的一些随机异常。
我有一个 iOS 应用程序,它使用一些使用指针的遗留低级内存操作代码。我正在调试一个问题,其中多个线程导致这些代码的多个副本同时在全局变量上执行,并通过写入无效长度或覆盖数据导致内存损坏。
效果是下面缓冲区的长度可能会改变。我已经看到 iOS 作为这些调用的结果抛出 EXC_BAD_ACCESS
或 EXC_BREAKPOINT
。
我的问题是 - 当我不正确地使用 memcpy
时 iOS 会总是抛出异常,还是只有当我在允许的内存之外写入时它才会抱怨?
换句话说,我的代码是否可以随意破坏我的内存并产生不可见的问题,而不会导致异常,只要它不超出分配的内存或访问已释放的内存?
NSData* buffer = ...
Byte *array = (Byte*)malloc(buffer.length);
memcpy(array, buffer.bytes, buffer.length);
上次我检查或遇到这样的问题时,它只会在您自己允许的内存之外时抱怨。在我的情况下,我正在覆盖我试图写入的地址后面的任何对象。结果似乎是随机崩溃的对象甚至 NSString
。
我的错误如下:
MyStructure *myStructure = malloc(sizeof(myStructure)); // Incorrect
MyStructure *myStructure = malloc(sizeof(MyStructure)); // Fixed
一个简单的自动完成错误,导致对这个错误进行了数天的搜索。 MyStructure
是一个相当大的访问,因此在这种情况下访问一些 属性(读和写)将简单地溢出并且 read/write 通过它之后的任何内容。它最终随机崩溃;有时访问错误,有时只是随机对象上的一些随机异常。