2012-02-19 9 views
0

こんにちは私の文字列のベース64エンコーディングを使用していますが、時々クラッシュしています。それは頻繁に再現されません。私はさまざまな方法で試しましたが、成功を収めませんでした。ここでベース64エンコーディングのクラッシュ

はクラッシュです:

malloc関数:*オブジェクト0x6880830のエラー:解放されたオブジェクトの不正なチェックサム - オブジェクトはおそらく、解放された後に変更されました。 *

をデバッグするmalloc_error_breakにブレークポイントを設定し、ここではコードスニペットです:

-(NSString *)Base64Encode:(NSData *)data{ 

     if([data length]) 
    { 
    //Point to start of the data and set buffer sizes 
int inLength = [data length]; 
int outLength = ((((inLength * 4)/3)/4)*4) + (((inLength * 4)/3)%4 ? 4 : 0); 
const char *inputBuffer = [data bytes]; 
char *outputBuffer = malloc(outLength); 
outputBuffer[outLength] = 0; 
//64 digit code 
static char Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 
//start the count 
int cycle = 0; 
int inpos = 0; 
int outpos = 0; 
char temp; 

//Pad the last to bytes, the outbuffer must always be a multiple of 4 
outputBuffer[outLength-1] = '='; 
outputBuffer[outLength-2] = '='; 

/* 
Text content M   a   n 
ASCII   77   97   110 
8 Bit pattern 01001101 01100001 01101110 

6 Bit pattern 010011 010110 000101 101110 
Index   19  22  5  46 
Base64-encoded T  W  F  u 
*/ 


while (inpos < inLength){ 
    switch (cycle) { 
     case 0: 
      outputBuffer[outpos++] = Encode[(inputBuffer[inpos]&0xFC)>>2]; 
      cycle = 1; 
      break; 
     case 1: 
      temp = (inputBuffer[inpos++]&0x03)<<4; 
      outputBuffer[outpos] = Encode[temp]; 
      cycle = 2; 
      break; 
     case 2: 
      outputBuffer[outpos++] = Encode[temp|(inputBuffer[inpos]&0xF0)>> 4]; 
      temp = (inputBuffer[inpos++]&0x0F)<<2; 
      outputBuffer[outpos] = Encode[temp]; 
      cycle = 3;     
      break; 
     case 3: 
      outputBuffer[outpos++] = Encode[temp|(inputBuffer[inpos]&0xC0)>>6]; 
      cycle = 4; 
      break; 
     case 4: 
      outputBuffer[outpos++] = Encode[inputBuffer[inpos++]&0x3f]; 
      cycle = 0; 
      break;       
     default: 
      cycle = 0; 
      break; 
    } 
} 
NSString *pictemp = [NSString stringWithUTF8String:outputBuffer]; 
free(outputBuffer); 
return pictemp; 

} 
else { 
    return @""; 
} 

} 

答えて

4

あなたは、出力バッファの終わりを超えて書いている:

char *outputBuffer = malloc(outLength); 
outputBuffer[outLength] = 0; 

あなたがoutLength + 1バイトを割り当てた場合あなたは大丈夫です。

+0

このBase64Encodeコードは、転送されたメールのようにインターネットで回覧されました。私の仲間のプログラマーは、一度このコードを取り、それにそのような欠陥が含まれていることを知らずに使用していました。私のアプリは、それを見てみるまでクラッシュし続けました。 – tia

+0

@Sven Thanxたくさん!! – iPamu

+0

絶対に正しい。それは私を助けた。 – Nitish

関連する問題