2010-06-23 5 views
1

내 코드를 실행할 때 (문제없이 컴파일 할 때) 악명 높은 malloc.c : 3074 오류가 발생합니다. -g 옵션을 사용하여 컴파일했습니다. Valgrind를 사용하여 메모리 할당 문제가 발생한 위치를 확인했지만 결과가 전체적으로 도움이되지 않습니다. 다음은 Valgrind 출력입니다.malloc.c : 3074 + Valgrind 출력

==2710== Invalid write of size 8 
==2710== at 0x400FC8: generatePairs (ldbalpha.c:42) 
==2710== by 0x400BFA: main (ldb-stegoencoderalpha.c:53) 
==2710== Address 0x51997c8 is not stack'd, malloc'd or (recently) free'd 
==2710== 
==2710== Invalid write of size 8 
==2710== at 0x401047: generatePairs (ldbalpha.c:54) 
==2710== by 0x400BFA: main (ldb-stegoencoderalpha.c:53) 
==2710== Address 0x51997a8 is 0 bytes after a block of size 1,160 alloc'd 
==2710== at 0x4C25153: malloc (vg_replace_malloc.c:195) 
==2710== by 0x400BA6: main (ldb-stegoencoderalpha.c:49) 
==2710== 
==2710== Invalid write of size 8 
==2710== at 0x401054: generatePairs (ldbalpha.c:55) 
==2710== by 0x400BFA: main (ldb-stegoencoderalpha.c:53) 
==2710== Address 0x51997b0 is 8 bytes after a block of size 1,160 alloc'd 
==2710== at 0x4C25153: malloc (vg_replace_malloc.c:195) 
==2710== by 0x400BA6: main (ldb-stegoencoderalpha.c:49) 
==2710== 
==2710== Invalid write of size 8 
==2710== at 0x401062: generatePairs (ldbalpha.c:56) 
==2710== by 0x400BFA: main (ldb-stegoencoderalpha.c:53) 
==2710== Address 0x51997c0 is not stack'd, malloc'd or (recently) free'd 

다음은 calledparam generatePairs의 주요 함수입니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <malloc.h> 
#include "ldb.h" 

int main(int argc, char * argv[]) { 

FILE *pFile; 
unsigned char *buffer; 
int i, j; 
char ch = '\0'; 
long unsigned int lSize; 

if (argc != 3) { 
    fprintf(stderr, "Usage: ./ldb-stegoencoderalpha [Stegofile] [messages.txt] > [messages-encoded.txt]\n"); 
return 1; 
} // end if 

pFile = fopen (argv[1] , "r"); 
if (pFile==NULL) {fputs ("File error on arg[1]",stderr); exit (1);} 

// obtain file size: 
fseek (pFile , 0 , SEEK_END);   // Go to end of File 
lSize = ftell (pFile);    // Return # of Bytes in the file 
rewind (pFile);    // Rewind to start of file 

// allocate memory to contain the whole file: 
buffer = malloc(sizeof(char) * lSize+1);  
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} 

bitpair * ppairs = malloc(sizeof(bitpair) * (lSize+1)); // Line 49,Structure setup 

memset (ppairs, 0, sizeof(bitpair) * (lSize+1)); //zeroize it first 

generatePairs(ppairs, lSize+1); //Line 53 in Valgrind error 

을 그 후 나는 그 쌍 그러나 Valgrind의 오류가있는 일부 계산이 generatePairs와의 malloc 함수에서 오는 할 : 나는 의견이 Valgrind의 출력과 일치하도록 줄 번호를 나열. 다음은 generatePairs 함수입니다.

#include <string.h> 
#include <assert.h> 
#include "ldb.h" 

void generatePairs(bitpair * ppairs, long unsigned int bits) { 

    unsigned int i, rand1, rand2, high, low; 
    unsigned int count = 1; 

    // initialize the array of pairs 
    for(i = 1; i <= bits; i++) { 
    bitpair * bp = &ppairs[i]; 
    bp->ref = -1; 
    bp->enc = -1; 
    bp->len = -1; 
    bp->bit = -1; 
    bp->used = 0; 
    } 

for(i = 1; i <= bits; i++) { 

    rand1 = 0; 

    ppairs[rand1].used = 1; 

    rand2 = count; 
    count++; 

    assert(rand2 <= bits); 

    ppairs[rand2].used = 1;   //Line 42 in Valgrind error 

    high = rand2; 
    low = rand1; 

    // initialize both data structures (bp->used is already set) 
    bitpair * bp = &ppairs[low]; 
    bp->ref = low; 
    bp->enc = high; 
    bp->bit = i; 

    bp = &ppairs[high]; 
    bp->ref = low;  //Line 54 in Valgrind error 
    bp->enc = high;  //Line 55 in Valgrind error 
    bp->bit = i;  //Line 56 in Valgrind error 

    } 

return; 
} 

typedef struct { 

long unsigned int ref; 
long unsigned int enc; 
long unsigned int len; 
long unsigned int bit; 
long unsigned int used; 
} bitpair; 

void generatePairs(bitpair * ppairs, long unsigned int bits); 

고마워요!

+0

[이것은 많이 게시되었습니다.] (http://www.google.com/search?hl=ko&q=malloc.c:3074+site:stackoverflow.com&btnG=Search&aq= – jjnguy

+0

OP는 이것을 알고있는 것처럼 보이며이 특정 프로그램에서 힙 손상이 발생할 수있는 위치를 찾는 데 도움을 요청합니다. –

+0

맞습니다. Tyler입니다. 문제를 찾는 데 어려움을 겪고 있습니다. 피드백을 보내 주시면 감사하겠습니다. – Shawn

답변

1

과제 이전에 rand2의 가치는 무엇입니까? 할당 된 메모리 이상으로 인덱싱 할 가능성이 있으므로 오류가 발생합니다.

편집 : 외부 루프를 통해 매번 카운트를 재설정해야합니까? 개수가 할당 한 것 이상으로 계속 증가하여 rand2도 증가하는 것처럼 보입니다. 결국 할당 된 메모리 이상으로 인덱싱됩니다.

+0

네가 그 중첩 된 루프에 대해 맞을지 모르겠다. 나는 더 이상 do-while이 필요 없다고 생각한다. 모든 for-loop에 대해 rand2 할당 및 inc 카운트를 한 번 수행 할 수 있습니다. 프로그램을 다시 컴파일하고 다시 실행했지만 불행히도 여전히 동일한 힙 문제가 발생합니다. – Shawn

+0

'count'를 1로 시작하지만 'bits'회 반복합니다. '비트 (bits) '는 당신이 따로 설정 한 공간이다. 'bits'가 5이고'i'가 4 인 루프 안에 있다면'count'는'5'와 같습니다. 이렇게하면 할당 된 메모리 범위를 벗어나 오류가 발생합니다. –

+0

또한 배열의 0 번째 요소를 계속 초기화하는 이유는 무엇입니까? –

1

나는 것 : unsigned 대신 int

  • 변화의 모든 인덱스 및 범위 (또는 더 나은 size_t)의 경계를 확인하기 위해 사방 ppairs에 인덱스에
  • 풋 주장, 이전 assert(rand2 < bits) 같은 모든 ppairs[rand2]
+0

assert (rand2 Shawn

+0

당신이 발견했다고 들었습니다.어설 션은 단지 당신이 평소 가지고있는 모든 가정을 적도록 강요합니다. 여러분이 항상 가지고 다니는 또 다른 암묵적인 가정은 인덱스가 0부터 시작한다는 것입니다.이 경우에는 unsigned를 사용하십시오. 인덱스는 아키텍처에 맞는 너비의 테이블이어야합니다. size_t를 사용하십시오. –

관련 문제