sprintf上的SIGABRT

时间:2016-03-09 14:48:10

标签: ios objective-c arrays segmentation-fault printf

我的代码一直在崩溃(这是一个旧的iOS应用程序,没有ARC )。这是有问题的代码:

- (NSString *) dataToHex:(NSData *)data {
    NSUInteger len2 = [data length] * 2;
    unsigned char* chars = (unsigned char*) [data bytes];

    char finalChar[len2 + 1];

    for(int i = 0; i < len2; i++) {
        sprintf(finalChar + (i * 2), "%02x", chars[i]);
    }

    finalChar[len2] = '\0';

    NSString *hexString = [NSString stringWithFormat:@"%s", finalChar];

    return hexString;
}

崩溃属于sprintf()。有任何想法吗?我尝试使用更大的缓冲区大小,但不起作用。

2 个答案:

答案 0 :(得分:3)

看起来像这个循环:

for(int i = 0; i < len2; i++) {

应该是:

for(int i = 0; i < len; i++) {

(否则你的阅读超出了输入数据的结尾,并且超出了输出数据的结尾)。

答案 1 :(得分:3)

在您的情况下,finalChar数组的大小为len2 + 1。之后,在for循环中,通过说

for(int i = 0; i < len2; i++) {
        sprintf(finalChar + (i * 2), "%02x", chars[i]);
    }

finalChar + (i * 2)会在某个时刻指向超出限制的内存(当i大于len2/2时),因为i不限于data length }。超出内存访问导致undefined behavior

我相信,它应该像

for(int i = 0; i < len2/2 ; i++) {
        sprintf(finalChar + (i * 2), "%02x", chars[i]);
    }