由于某些原因,valgrind一直抛出以下错误:
==6263== Invalid read of size 4
==6263== at 0x40151B9: (within /lib/ld-2.7.so)
==6263== by 0x4005C29: (within /lib/ld-2.7.so)
==6263== by 0x4007A47: (within /lib/ld-2.7.so)
==6263== by 0x40114F3: (within /lib/ld-2.7.so)
==6263== by 0x400D585: (within /lib/ld-2.7.so)
==6263== by 0x4010F0D: (within /lib/ld-2.7.so)
==6263== by 0x4141391: (within /lib/tls/i686/cmov/libc-2.7.so)
==6263== by 0x400D585: (within /lib/ld-2.7.so)
==6263== by 0x4141554: __libc_dlopen_mode (in /lib/tls/i686/cmov/libc-2.7.so)
==6263== by 0x411B286: __nss_lookup_function (in /lib/tls/i686/cmov/libc-2.7.so)
==6263== by 0x411B39F: (within /lib/tls/i686/cmov/libc-2.7.so)
==6263== by 0x411CFC5: __nss_hosts_lookup (in /lib/tls/i686/cmov/libc-2.7.so)
==6263== Address 0x4183d24 is 36 bytes inside a block of size 37 alloc'd
==6263== at 0x4022AB8: malloc (vg_replace_malloc.c:207)我就是这样做的。为什么会发生这种事?谢谢
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
char *IPtoHostname(const char *ipaddress)
{
struct hostent *host;
unsigned int ip = 0;
ip = inet_addr (ipaddress);
host = gethostbyaddr ((char *) &ip, sizeof (unsigned int), AF_INET);
if (host == NULL) return NULL;
return strdup(host->h_name);
}
int main () {
const char *ip = "65.55.4.170";
char *a = NULL;
a = IPtoHostname(ip);
printf ("%s\n", a);
free (a);
return 0;
}更新:当我在Linux hardy 2.6.24-16-generic下运行它时,它不会在Ubuntu 9.10下发生
发布于 2010-11-30 00:24:37
您的代码是可以的(尽管您实际上应该使用in_addr_t而不是unsigned int来处理IPtoHostname()中的变量ip )。
瓦伦报告是一个众所周知的问题 --要么是假阳性,要么是glibc中的错误。
发布于 2010-11-30 01:44:34
消除这些遗留函数中的问题的一种方法是停止使用它们。自2008年起,gethostbyname和gethostbyaddr已从POSIX中删除;它们在IPv6支持、线程安全、规范不明确和跨平台实现不一致等方面存在严重问题。你根本不应该使用它们。
现代的替代品是getaddrinfo和getnameinfo。如果使用这些函数,就不会像您正在做的那样编写丑陋的包装器。
发布于 2010-11-29 23:44:28
inet_addr并不总是返回一个简单的unsigned int。它返回一个in_addr_t (或者一个in_addr,取决于您的C头(Linux2.6.31/glib2.0))。在我的系统中,in_addr_t实际上是128位(16字节),因为inet_addr可以返回IPv6地址。
同样,gethostbyaddr采用的是in_addr_t,而不是unsigned int。这几乎肯定是你的问题。将ip类型更改为inet_addr_t并更改相应的sizeof,并在下次更多地注意编译器警告。
struct hostent *host;
in_addr_t ip = inet_addr(ipaddress);
host = gethostbyaddr (&ip, sizeof(ip), AF_INET);
if (host == NULL) return NULL;
return strdup(host->h_name);https://stackoverflow.com/questions/4309103
复制相似问题