【问题标题】:SIGABRT on sprintfsprintf 上的 SIGABRT
【发布时间】:2016-03-09 14:48:09
【问题描述】:

我的代码不断崩溃(这是一个旧的 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() 的行中。有任何想法吗?我尝试过使用更大的缓冲区大小,但不起作用。

【问题讨论】:

  • @SouravGhosh 是的,它充满了作为参数传递的 NSData 的字节,对吧?

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


【解决方案1】:

看起来像这样的循环:

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

应该是:

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

(否则,您读取的内容超出了输入数据的末尾,而写入的内容超出了输出数据的末尾)。

【讨论】:

    【解决方案2】:

    在您的情况下,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]);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      相关资源
      最近更新 更多