gpt4 book ai didi

c - HP-UX 中的堆损坏?

转载 作者:行者123 更新时间:2023-12-04 03:20:42 24 4
gpt4 key购买 nike

我试图了解在 HP-UX 11.11 中运行的导致 SIGSEGV(11,段错误)的程序出了什么问题:

(gdb) bt
#0 0x737390e8 in _sigfillset+0x618 () from /usr/lib/libc.2
#1 0x73736a8c in _sscanf+0x55c () from /usr/lib/libc.2
#2 0x7373c23c in malloc+0x18c () from /usr/lib/libc.2
#3 0x7379e3f8 in _findbuf+0x138 () from /usr/lib/libc.2
#4 0x7379c9f4 in _filbuf+0x34 () from /usr/lib/libc.2
#5 0x7379c604 in __fgets_unlocked+0x84 () from /usr/lib/libc.2
#6 0x7379c7fc in fgets+0xbc () from /usr/lib/libc.2
#7 0x7378ecec in __nsw_getoneconfig+0xf4 () from /usr/lib/libc.2
#8 0x7378f8b8 in __nsw_getconfig+0x150 () from /usr/lib/libc.2
#9 0x737903a8 in __thread_cond_init_default+0x100 () from /usr/lib/libc.2
#10 0x737909a0 in nss_search+0x80 () from /usr/lib/libc.2
#11 0x736e7320 in __gethostbyname_r+0x140 () from /usr/lib/libc.2
#12 0x736e74bc in gethostbyname+0x94 () from /usr/lib/libc.2
#13 0x11780 in dnetResolveName (name=0x400080d8 "smtp.org.com", hent=0x737f3334) at src/dnet.c:64
..

问题似乎发生在 libc 的某个地方!系统调用跟踪结束于:

Connecting to server smtp.org.com on port 25
write(1, "C o n n e c t i n g t o s e ".., 51) .......................... = 51
open("/etc/nsswitch.conf", O_RDONLY, 0666) ............................... [entry]
open("/etc/nsswitch.conf", O_RDONLY, 0666) ................................... = 5
Received signal 11, SIGSEGV, in user mode, [SIG_DFL], partial siginfo
Siginfo: si_code: I_NONEXIST, faulting address: 0x400118fc, si_errno: 0
PC: 0xc01980eb, instruction: 0x0d3f1280
exit(11) [implicit] ............................ WIFSIGNALED(SIGSEGV)|WCOREDUMP

程序的最后一条指令:

struct hostent *him;
him = gethostbyname(name); // name == "smtp.org.com" as shown by gdb

这是系统问题,还是我遗漏了什么?任何有关深入挖掘的指导都将不胜感激。

谢谢。

最佳答案

长话短说:vsnprintf 在 HP-UX 11.11 下损坏了我的堆。vsnprintf 是在 C99 (ISO/IEC 9899:1999) 中引入的,并且“等效于 snprintf,具有可变参数列表”(§7.19.6.12.2),snprintf (§7.19.6.5.2):“如果 n 为零,什么也没写”。嗯,HP UX 11.11 不符合此规范。当第二个 arg == 0 时,参数被写在第一个 arg 的末尾......当然,这会破坏堆(当 maxsize==0 时我没有分配空间,因为没有什么应该是写的)。

惠普 manual pages不清楚(“用户有责任确保有足够的可用存储空间。”),关于 maxsize==0 的情况没有说明。不错的陷阱..至少,手册页的警告部分应该警告符合标准的用户..

这是鸡蛋/鸡肉 pb:vnsprintf 是可变的,因此为了“用户的责任”以确保有足够的存储可用,“用户的责任”必须首先知道需要多少空间。以及做到这一点的最佳方法是用第二个 arg == 0 调用 vnsprintf:然后它应该返回所需的空间量而 sprintfs 什么都没有..好吧,HP 除外!一种在违反标准的情况下使用 vnsprintf 来确定所需空间的解决方案:malloc 1 个字节到您的缓冲区(第一个 arg)并调用 vnsprintf(buf+buf.length,1,..)。这只会在您分配的新字节中放置一个\0。愚蠢,但有效。如果你在 wchar 条件下,malloc(sizeof..)。

无论如何,解决方法很简单:永远不要在 HP-UX 下使用 maxsize==0 调用 v/snprintf!我现在有一个快乐的稳定程序!

感谢所有贡献者。


在 HP-UX B11.11 下通过 vsnprintf 造成堆损坏该程序在 Linux/Cygwin/.. 下打印“@@”它在 HP-UX B11.11 下打印“@fooo@”:

#include <stdarg.h>
#include <stdio.h>

const int S=2;

void f (const char *fmt, ...) {
va_list ap;
int actualLen=0;
char buf[S];

bzero(buf, S);

va_start(ap, fmt);
actualLen = vsnprintf(buf, 0, fmt, ap);
va_end(ap);

printf("@%s@\n", buf);
}

int main () {
f("%s", "fooo");
return 0;
}

关于c - HP-UX 中的堆损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/619497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com