我有我的工作在一个非常特殊的问题。 我有在Solaris 8 / SPARC平台的旧的编译器(GCC 2.95或更老)编译的代码。 它运行在Solaris 8 / SPARC不错,但10 / SPARC Solaris上的崩溃。 (SOLARIS 10是假想向后兼容的Solaris 8)
在调试时,我看到了,问题出现了,当应用程序试图进入其相应的I / P地址转换成主机名。 它采用gethostbyname_r,其次是INET_NTOA获得的IPv4四点缀数。 通过该解决方案gdb'ing使我在那里我看到,gethostbyname_r返回的组in_addr具有代表的I / P地址的正确整数点,但INET_NTOA调用返回错误字符串。 在确认其确实是INET_NTOA失败的一个困难是,代码是这样写下面
strcpy(hostaddr, inet_ntoa(*((struct in_addr *) hostdata.h_addr)));
因此从技术上讲,我不能看到INET_NTOA返回的值。 但我可以做一个
print (char*)inet_ntoa(*((struct in_addr *) hostdata.h_addr_list[0]))
上GDB看(这是足够我假定接近)和它打印格式错误的I / P地址。 例如, “0.0。” (主机名具有有效的I / P地址等的I / P开始0.0可以从机来解决。也没有正确的值)
你可以看到,使用与INET_NTOA不安全的strcpy造成了一点不明,导致段故障。
这将是伟大的人谁经历了类似的事情,至于什么可能是INET_NTOA的这种故障的原因的消息。 不知怎的,该系统发挥作用,我不能找出它也别想可以做些什么来解决这个问题。
所有评论将不胜感激。
约束:我不能修改代码,使其工作(否则这是微不足道的解决)。 所以,尽管知道的strcpy是一个非常不安全的功能WRT赛格故障和INET_NTOA不赞成我无奈在这一方面。
编辑:我有一种感觉,这是一个并行处理的问题。 我不知道,但我不认为应用程序是多线程的。 但新SOL10该机是一款64核的机器。 究其原因,思想链是与INET_NTOA唯一真正的问题是静态缓冲区和代码确实让在一个循环此调用。