2013-02-27 8 views
2

네트워킹 할당을 위해 C에서 gethostbyname() 함수를 사용하려고합니다. gethostbyname() 오류 - 메모리 관리 관련 내용

나는 다음과 같은 오류가이

struct hostent *host; 
char* addr = malloc (10*sizeof(char)); 
strcpy (addr, "localhost"); 
host= (struct hostent *) gethostbyname(addr); 

을하려고

.

glibc detected ./Sender: free(): invalid next size (normal): 0x0000000001584480 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fcdbaca4b96] 
/lib/x86_64-linux-gnu/libc.so.6(fclose+0x155)[0x7fcdbac94815] 
/lib/x86_64-linux-gnu/libc.so.6(+0x103b16)[0x7fcdbad29b16] 
/lib/x86_64-linux-gnu/libc.so.6(__res_maybe_init+0x125)[0x7fcdbad2b3d5] 
/lib/x86_64-linux-gnu/libc.so.6(__nss_hostname_digits_dots+0x3d)[0x7fcdbad2db0d] 
/lib/x86_64-linux-gnu/libc.so.6(gethostbyname+0x8b)[0x7fcdbad32b7b] 
./Sender[0x401858] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fcdbac4776d] 
./Sender[0x400a09] 
======= Memory map: ======== 
00400000-00403000 r-xp 00000000 08:07 3573874       /home/karthik/courses/Sem 6/Networks/Lab/lab4/Sender 
00602000-00603000 r--p 00002000 08:07 3573874       /home/karthik/courses/Sem 6/Networks/Lab/lab4/Sender 
00603000-00604000 rw-p 00003000 08:07 3573874       /home/karthik/courses/Sem 6/Networks/Lab/lab4/Sender 
01584000-015a5000 rw-p 00000000 00:00 0         [heap] 
7fcdbaa10000-7fcdbaa25000 r-xp 00000000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbaa25000-7fcdbac24000 ---p 00015000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbac24000-7fcdbac25000 r--p 00014000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbac25000-7fcdbac26000 rw-p 00015000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbac26000-7fcdbaddb000 r-xp 00000000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbaddb000-7fcdbafda000 ---p 001b5000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbafda000-7fcdbafde000 r--p 001b4000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbafde000-7fcdbafe0000 rw-p 001b8000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbafe0000-7fcdbafe5000 rw-p 00000000 00:00 0 
7fcdbafe5000-7fcdbb007000 r-xp 00000000 08:08 545991      /lib/x86_64-linux-gnu/ld-2.15.so 
7fcdbb1e4000-7fcdbb1e7000 rw-p 00000000 00:00 0 
7fcdbb203000-7fcdbb207000 rw-p 00000000 00:00 0 
7fcdbb207000-7fcdbb208000 r--p 00022000 08:08 545991      /lib/x86_64-linux-gnu/ld-2.15.so 
7fcdbb208000-7fcdbb20a000 rw-p 00023000 08:08 545991      /lib/x86_64-linux-gnu/ld-2.15.so 
7fff5c673000-7fff5c695000 rw-p 00000000 00:00 0       [stack] 
7fff5c7ff000-7fff5c800000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted (core dumped)` 

이 문제를 어떻게 해결할 수 있습니까?

+5

당신은'gethostbyname (address); 대신'gethostbyname (addr);을 의미합니까? –

+1

> gethostbyname *() 및 gethostbyaddr *() 함수는 더 이상 사용되지 않습니다. 응용 프로그램은 getaddrinfo (3) 및 getnameinfo (3)을 대신 사용해야합니다. Links : http://linux.die.net/man/3/getaddrinfo http://linux.die.net/man/3/getnameinfo glibc 2.8 이후 : _BSD_SOURCE || _SVID_SOURCE || _GNU_SOURCE –

+0

"폐기 됨"은 "폐기 됨"보다 강하기 때문에 제거되었다는 의미이며 10 년간 작동하지 않았을 수 있습니다. POSIX.1-2001은 gethostbyname(), gethostbyaddr(), ...이 표준에서 노후화로 표시되어 있음을 나타냅니다. POSIX.1-2008은 gethostbyname(), gethostbyaddr() ... –

답변

2

코드에 어딘가에 표시되지 않은 부분에 메모리 손상이 있습니다. 스 니펫이 C 언어로 유효하지 않으므로 직접 입력하거나 불완전한 것으로 복사했다고 가정합니다.

이러한 시나리오를 디버깅하려면 해당 시나리오를 지원하는 플랫폼 (있는 그대로)에있는 경우 DrMemory 또는 Valgrind을 사용하십시오. DrMemory가 논란의 여지는 있지만 빠른 반면, Valgrind는 그 기능을 선호합니다.

두 프로그램 모두 문제를 정확히 찾아 내고 문제가있는 프로그램이 실행되는 동안 디버거에 연결할 수도 있습니다. 따라서 라이브 프로그램 내에서 오류 조건을 검사 할 수 있습니다.


사이드 노트 : 당신이 어떤 방법으로 이름을 조립하지 않은 경우, 당신은 gethostbyname에 리터럴 문자열로 전달할 수 있습니다

struct hostent *host; 
host = (struct hostent *) gethostbyname("localhost"); 
+0

이것은 또한 댓글이어야합니다 ... 아니요? – speeder

+1

@speeder, "코드에 어딘가에서 메모리 손상이 있는데, 표시하지 않은 부분에 메모리 손상이 있습니다 ..." – ugoren

+0

@ugoren : 항상 열려 있습니다. 건설적인 비판. 답변을 수정했습니다. 귀하의 제안에 감사드립니다. – 0xC0000022L

0

첫 번째 줄은 뒤에 누락 ;.

는 OP 정말 메모리 손상이 gethostbyname()의 실제 호출하기 전에 무슨 일이 생긴 데 같은이 냄새 맡는다 propably 초기화되지 않은 address 대신 addr으로 사용하고 있다는 것을 아니라면.

  • address의 사용이 오타 및
  • <netdb.h> 있다는 가정하에

    #include 에드

및 성공 malloc() 's에 대한 누락 된 검사 외에이며, 영업 이익의 코드는 옳은.

그리고 다음과 같이 수 :

#include <netdb.h> 

... 

struct hostent * host = NULL; 
char * addr = malloc (10 * sizeof(*addr)); 
if (!addr) 
    perror("malloc"); 
else 
{ 
    strcpy (addr, "localhost"); 
    host = gethostbyname(addr); 
    ... 

그래서 당신이 그렇게 잘못 무슨 일이 일어나고 있는지 볼 valgrind 같은 메모리 검사기를 사용하려면 수 있습니다.