C getaddrinfo()中的分段错误

C getaddrinfo()中的分段错误,c,network-programming,getaddrinfo,C,Network Programming,Getaddrinfo,getaddrinfo()中出现分段错误 这是堆栈跟踪 Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0xb7ff4b70 (LWP 26872)] __res_vinit (statp=0xb7ff4df4, preinit=0) at res_init.c:176 176 res_init.c: No such file or directory. in res_init.c (gd

getaddrinfo()中出现分段错误

这是堆栈跟踪

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7ff4b70 (LWP 26872)]
__res_vinit (statp=0xb7ff4df4, preinit=0) at res_init.c:176
176 res_init.c: No such file or directory.
    in res_init.c
(gdb) bt
#0  __res_vinit (statp=0xb7ff4df4, preinit=0) at res_init.c:176
#1  0x0042fe95 in *__GI___res_ninit (statp=0xb7ff4df4) at res_init.c:142
#2  0x00430ea0 in *__GI___res_maybe_init (resp=0xb7ff4df4, preinit=0) at res_libc.c:122
#3  0x003f86f4 in gaih_inet (name=<value optimized out>, service=<value optimized out>, req=0xb7ff3df8, pai=0xb7ff3db4, naddrs=0xb7ff3da4)
    at ../sysdeps/posix/getaddrinfo.c:690
#4  0x003faa65 in *__GI_getaddrinfo (name=0x8203a68 "api.shoutcast.com", service=0x810ae72 "http", hints=0xb7ff3df8, pai=0xb7ff3e24)
    at ../sysdeps/posix/getaddrinfo.c:2160
#5  0x08050a87 in test_addrinfo () at /kkkk/myaddrinfo.c:33
在valgrind中运行后,我得到以下日志

    ==00:00:00:07.590 7788==
    ==00:00:00:07.590 7788== Process terminating with default action of signal 11 (SIGSEGV)
    ==00:00:00:07.590 7788==  Bad permissions for mapped region at address 0x4033BDC
    ==00:00:00:07.590 7788==    at 0x4348C8A: __res_vinit (res_init.c:176)
    ==00:00:00:07.645 7788==
这个函数test_addrinfo()由我的应用程序的顶层调用。我在另一个只有一个main()的应用程序中测试了相同的函数。它在那个应用程序中起作用


我怀疑我没有使用正确的gnulib库或错误的编译标志。有什么线索或提示吗?

我发现了问题。由于函数getaddrinfo()使用alloca(),会在堆栈(而不是堆)上动态分配内存,因此出现堆栈溢出。这是一个非常危险的功能


我试着把-fstack-protector全部放在gcc标志上,但没有成功

对。使用valgrind memcheck进行检查,但未观察到任何奇怪的现象。在分配内容之前,可能会将“提示”归零?如果代码中出现分段错误,valgrind将向您说明原因以及代码中创建分段错误的行号……如果valgrind未给出任何错误,则可能没有分段fault@cnicutar-我的问题是,为什么将相同的参数传递给同一个库函数会产生不同的结果。@crissangel总是回答说,您做得不对(即,您没有以相同的方式传递它们-您只是认为您做了)。另一件奇怪的事是,即使valgrind也没有指示堆栈溢出
    ==00:00:00:07.590 7788==
    ==00:00:00:07.590 7788== Process terminating with default action of signal 11 (SIGSEGV)
    ==00:00:00:07.590 7788==  Bad permissions for mapped region at address 0x4033BDC
    ==00:00:00:07.590 7788==    at 0x4348C8A: __res_vinit (res_init.c:176)
    ==00:00:00:07.645 7788==