NSMutableData appendBytes将长度设置为-1并崩溃

时间:2013-02-06 01:22:52

标签: ios objective-c macos cocoa nsmutabledata

我得到了一个罕见且间歇性的崩溃,看起来像appendBytes被调用为-1,因为它的长度。 现在,每次我使用这种方法时,我都会对“长度”参数进行硬编码,因此我无法看到这种情况会如何发生,更糟糕的是我无法看到我如何测试并避免这种崩溃。

这里是堆栈顶部和异常(注意~4.2b长度):

*** Terminating app due to uncaught exception 'NSMallocException', reason: '*** -[NSConcreteMutableData appendBytes:length:]: unable to allocate memory for length (4294967295)'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x91ec5a67 __raiseError + 231
    1   libobjc.A.dylib                     0x9950a149 objc_exception_throw + 155
    2   CoreFoundation                      0x91e2d289 +[NSException raise:format:arguments:] + 137
    3   CoreFoundation                      0x91e2d1f9 +[NSException raise:format:] + 57
    4   Foundation                          0x92d2489e _NSMutableDataGrowBytes + 1136
    5   Foundation                          0x92d24391 -[NSConcreteMutableData appendBytes:length:] + 354 

这是一个可能崩溃的代码的简化版本:

        if (self.isConnectedToService) {
            NSMutableData *myData = [NSMutableData data];

                float newValue = PanValue;
                const char theTwo[] =  {(char)Chan_L, (char)PanParam};
                [myData appendBytes:&theTwo length:2];
                [myData appendBytes:&newValue length:4];
        }

所以长度总是2或4。

我测试了缓冲区包含多于或少于2和4的不同情况,并且我从未设法故意导致此崩溃。

我在MacOS10.7.4和iOS6.0(在iPad3上)都运行相同的代码,并且偶尔会在两个平台上看到这个问题。

那么appendBytes如何获得虚假价值?

0 个答案:

没有答案