2011-11-21 3 views
0

안녕하세요 버려진 :가 무엇인지에 대한 조언을 할 수있는 사람인가병합 정렬과 비교 기능 - 코어 I는 코어가 다음 오류 때문에 오류를 덤프 일으키는 비교 기능을 가진 짧은 병합을 실행하고

part1 21 shortbooks.txt 
*** glibc detected *** part1: free(): invalid next size (fast): 0x0867b258 *** 
======= Backtrace: ========= 
/lib/libc.so.6[0x409fb6] 
part1[0x80489c6] 
part1[0x80487fb] 
part1[0x80487fb] 
part1[0x80487fb] 
part1[0x8048ac9] 
part1[0x8048d41] 
/lib/libc.so.6(__libc_start_main+0xe6)[0x3b1e36] 
part1[0x8048561] 
======= Memory map: ======== 
00376000-00393000 r-xp 00000000 fd:00 1311353 /lib/ld-2.13.so 
00393000-00394000 r--p 0001c000 fd:00 1311353 /lib/ld-2.13.so 
00394000-00395000 rw-p 0001d000 fd:00 1311353 /lib/ld-2.13.so 
0039b000-0051e000 r-xp 00000000 fd:00 1311360 /lib/libc-2.13.so 
0051e000-0051f000 ---p 00183000 fd:00 1311360 /lib/libc-2.13.so 
0051f000-00521000 r--p 00183000 fd:00 1311360 /lib/libc-2.13.so 
00521000-00522000 rw-p 00185000 fd:00 1311360 /lib/libc-2.13.so 
00522000-00525000 rw-p 00000000 00:00 0 
00577000-00593000 r-xp 00000000 fd:00 1345987 /lib/libgcc_s-4.5.1-20100924.so.1 
00593000-00594000 rw-p 0001b000 fd:00 1345987 /lib/libgcc_s-4.5.1-20100924.so.1 
008e6000-008e7000 r-xp 00000000 00:00 0   [vdso] 
08048000-08049000 r-xp 00000000 00:19 435651043 /home/S10/rowlanj0/COMP26120/ex7/part1 
08049000-0804a000 rw-p 00001000 00:19 435651043 /home/S10/rowlanj0/COMP26120/ex7/part1 
0867b000-0869c000 rw-p 00000000 00:00 0   [heap] 
b783b000-b783c000 rw-p 00000000 00:00 0 
b7867000-b7868000 rw-p 00000000 00:00 0 
bfb25000-bfb49000 rw-p 00000000 00:00 0   [stack] 
Aborted (core dumped) 

이 결함을 일으키고 그것을 해결하는 방법?

void memcopy(B *to, B *from, int count) { 

    while (count-- > 0) *to++ = *from++ ; 

} 

void merge_sort(B* book, int n, int elementsize, int (*p_cmp_f)()) { 

B *firsthalf, *endoffirsthalf, *secondhalf, *endofsecondhalf, *resultbuffer, *p_result; 

int halfsize ; 

if (n <= 1) return ; 

halfsize = n/2 ; 

firsthalf = book ; 

secondhalf = book + halfsize * elementsize ; 

merge_sort(firsthalf, halfsize, elementsize, p_cmp_f) ; 
merge_sort(secondhalf, n - halfsize, elementsize, p_cmp_f) ; 

endoffirsthalf = secondhalf ; 

endofsecondhalf = book + n * elementsize ; 

resultbuffer = (B*) malloc(n * elementsize) ; 

p_result = resultbuffer ; 

while(firsthalf < endoffirsthalf && secondhalf < endofsecondhalf) { 

    if((*p_cmp_f)(firsthalf, secondhalf) < 0) { 

    memcopy(p_result, firsthalf, elementsize) ; 
    firsthalf += elementsize ; 

    } 

    else { 

    memcopy(p_result, secondhalf, elementsize) ; 
    secondhalf += elementsize ; 

    } 

    p_result += elementsize ; 

} 

while(firsthalf < endoffirsthalf) { 

    memcopy(p_result, firsthalf, elementsize) ; 
    firsthalf += elementsize ; 
    p_result += elementsize ; 

} 

while(secondhalf < endofsecondhalf) { 

    memcopy(p_result, secondhalf, elementsize) ; 
    secondhalf += elementsize ; 
    p_result += elementsize ; 

} 

    memcopy(book, resultbuffer, n * elementsize) ; 

    free(resultbuffer) ; 

} 

다음은 요청한 코드입니다.

typedef struct book{ 
double rating; 
double price; 
double relevance; 
int ID; 
}B; 

와 비교 기능 : 프로그램이 손상 내부 힙 데이터 구조이기 때문에

int comp_on_price(const void *a, const void *b) 
{ 

if ((*(B *)a).price < (*(B *)b).price) 
    return 1; 
else if ((*(B *)a).price > (*(B *)b).price) 
    return -1; 
else 
    return 0; 
} 
+1

'malloc()'하지 않은 포인터를'free()'하려고 한 것처럼 보입니다. 일부 코드가 도움이됩니다. – drdwilcox

+0

-g로 컴파일하고 gdb에서 응용 프로그램을 실행하고 충돌 후 "backtrace"를 입력하면 자세한 정보를 얻을 수 있습니다. – perreal

+0

코드를 게시하지 않은 경우 어떻게 도움이됩니까? – pajton

답변

2

당신은이 오류를 얻고있다

다음은 구조체와 비교 기능 중 하나입니다. 손상이 발생한 후에도 문제가 탐지되지 않을 수 있기 때문에 추적하기가 어려울 수 있습니다.

몇 가지 일반적인 원인은 다음과 같습니다

  • 두 번
  • 포인터를 자유롭게
  • 버퍼 오버 플로우의 malloc으로 할당되지 않은 포인터를 자유롭게 : malloc에 ​​할당 버퍼의 한쪽 끝 떨어져 데이터를 기록한다.

이것이 문제의 근원인지 잘 모르겠지만 포인터 연산에서 실수를 한 것 같습니다.

secondhalf = book + halfsize * elementsize ; 

아래 예에서는 elementsize을 곱할 필요가 없습니다. 컴파일러는 정수와 포인터를 추가 할 때 자동으로이 작업을 수행합니다. elementsize == sizeof(B)으로 가정합니다. 이 가정이 유효하지 않은 경우, 가산을하기 전에 book(char*)으로 캐스팅하십시오. 이것은 정의에 의해 항상 sizeof(char) == 1 이후로 작동합니다.

프로그램이 작 으면 Valgrind를 사용하여 문제를 추적 할 수 있습니다. Valgrind는 힙 손상, 누수 및 정의되지 않은 변수의 사용과 같은 메모리 문제를 찾아냅니다. 매우 느리기 때문에 오랫동안 실행되는 프로그램에서는 작동하지 않습니다.