2010-07-01 2 views
1

경우에 따라 다음과 같은 코드가 작동합니다. 이는 좋은 개념이지만 실행이 좋지 않음을 의미합니다. 비트가 떨어지는 위치에 따라 충돌이 발생하기 때문에 나는 그 길을 따라 한 발을 들추고 있음을 의미합니다. 나는 bufferdata을 < =에서 4096 바이트로 채우는 우아한 방법을 찾는데 관심이 있지만, 그렇지 않습니다.memcpy를 사용하여 바이트 블록에서 바이트를 연결하는 데 오류가 발생했습니다.

편집 : 수신 오류가 bufferdata

unsigned char  buffer[4096] = {0}; 
char *bufferdata; 

bufferdata = (char*)malloc(4096 * sizeof(*bufferdata)); 
if (! bufferdata) 
    return false; 

while(...) 
{ 

    // int nextBlock(voidp _buffer, unsigned _length); 
    read=nextBlock(buffer, 4096); 

    if(read > 0) 
    { 
     memcpy(bufferdata+bufferdatawrite,buffer,read); 

     if(read == 4096) { 

      // let's go for another chunk 
      bufferdata = (char*)realloc(bufferdata, (bufferdatawrite + (4096 * sizeof(*bufferdata)))); 
      if (! bufferdata) { 
       printf("failed to realloc\n"); 
       return false; 
      } 

     } 

    } 
    else if(read<0) 
    { 
     printf("error.\n"); 
     break; 
    } 
    else { 
     printf("done.\n"); 
     break; 
    } 
} 


free(bufferdata); 
+0

어떻게/실패합니까? bufferdatawrite는 어디에서 왔습니까? 그게 증가해야합니다 ... –

답변

4

어디서 오류인지 알기가 어렵습니다. 여기 저기에 누락 된 일부 코드가 있습니다.

if(read == 4096) {은 nextBlock이 한 반복에서 4000을 반환하고 다음 반복에서 97을 반환합니다. 이제 4097 바이트를 저장해야하지만 버퍼를 할당하기 위해 버퍼를 재 할당하지 않아도됩니다.

바이트를 누적해야하고 4096 경계를 통과 할 때마다 다시 할당해야합니다. 다음과 같이 입력하십시오 :

#define CHUNK_SIZE 4096 
int total_read = 0; 
int buffer_size = CHUNK_SIZE ; 
char *bufferdata = malloc(CHUNK_SIZE); 
char buffer[CHUNK_SIZE]; 
while(...) 
{ 

    // int nextBlock(voidp _buffer, unsigned _length); 
    read=nextBlock(buffer, CHUNK_SIZE); 

    if(read > 0) 
    { 
     total_read += read; 
     if(buffer_size < total_read) { 
      // let's go for another chunk 
      char *tmp_buf; 
      tmp_buf= (char*)realloc(bufferdata, buffer_size + CHUNK_SIZE); 
      if (! tmp_buf) { 
       free(bufferdata); 
       printf("failed to realloc\n"); 
       return false; 
      } 
      buffer_data = tmp_buf; 
      buffer_size += CHUNK_SIZE ; 

     } 
     memcpy(bufferdata+total_read-read,buffer,read); 
     } 
     ... 
    } 
+0

memcpy 전에'total_read'를 증가 시키면, memcpy는 버퍼에'read' 바이트를 너무 많이 쓴다는 것을 의미합니다. 'memcpy (bufferdata + total_read-read, buffer, read)'가 필요하다. –

0

에 대한 불법적 인 접근 몇 가지 의견입니다 :

정의하거나 당신이 이제까지이를 변경해야하는 경우 CONST 4096 당신은 화상을 입을 것입니다하시기 바랍니다. realloc 체이닝은 버퍼를 얻는 데 매우 비효율적 인 방법입니다. 어떤 방법 으로든 크기를 미리 가져 와서 한꺼번에 가져올 수 있습니다. 아마도 그렇지는 않지만 realloc()을 볼 때 나는 항상 싫증이 난다. 나는 또한 kZipBufferSize가 무엇인지, 바이트 수가 나머지 카운트와 같은지 알고 싶습니다. 또한 bufferdatawrite는 정확히 무엇입니까? 나는 소스 데이터라고 가정하고 있지만 메모리 정렬 문제가 아닌지 확인하는 선언을보고 싶습니다. 또는 잘못된 사이징으로 인해 버퍼 오버런이 발생합니다.

마지막으로, nextBlock이 메모리 오버런을 일으키는 지 확인 하시겠습니까? 이것은 코드의 잠재적 인 약점의 또 다른 포인트입니다.

+0

예, 당신 말이 맞아요. 여기서는 설명의 목적으로 상수를 마법 번호로 변환했습니다. (나는 이것을 샘플 코드에서 편집했다.) – bitcruncher

관련 문제