首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C- gethostbyaddr & Valgrind

C- gethostbyaddr & Valgrind
EN

Stack Overflow用户
提问于 2010-11-29 23:21:32
回答 4查看 1.4K关注 0票数 2

由于某些原因,valgrind一直抛出以下错误:

代码语言:javascript
复制
==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)

我就是这样做的。为什么会发生这种事?谢谢

代码语言:javascript
复制
#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下发生

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-30 00:24:37

您的代码是可以的(尽管您实际上应该使用in_addr_t而不是unsigned int来处理IPtoHostname()中的变量ip )。

瓦伦报告是一个众所周知的问题 --要么是假阳性,要么是glibc中的错误。

票数 2
EN

Stack Overflow用户

发布于 2010-11-30 01:44:34

消除这些遗留函数中的问题的一种方法是停止使用它们。自2008年起,gethostbynamegethostbyaddr已从POSIX中删除;它们在IPv6支持、线程安全、规范不明确和跨平台实现不一致等方面存在严重问题。你根本不应该使用它们。

现代的替代品是getaddrinfogetnameinfo。如果使用这些函数,就不会像您正在做的那样编写丑陋的包装器。

票数 1
EN

Stack Overflow用户

发布于 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,并在下次更多地注意编译器警告。

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4309103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档