3

我遇到了一个罕见的间歇性崩溃,看起来像 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 是如何获得这个虚假价值的呢?

4

0 回答 0