strndup调用正在破坏堆栈帧

Thu*_*eti 2 c aix

我在AIX 5.3和6.1上看到了"strndup"调用的奇怪行为.如果我调用大小超过实际源字符串长度大小的strndup,那么在该调用之后会出现堆栈损坏.

以下是可能出现此问题的示例代码:

int main ()
{
    char *dst_str = NULL;
    char src_str[1023] = "sample string";

    dst_str = strndup(src_str, sizeof(src_str));

    free(dst_str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有没有人经历过这种行为?

如果是,请告诉我.

根据我的观察,必须有来自操作系统的补丁,这个问题得到解决.但如果有任何补丁,我无法得到那个补丁.请多点亮一点.

谢谢和问候,Thumbeti

Alo*_*hal 5

#include <string.h>的代码中缺少一个.请试试 - 我相信它会起作用.原因是如果没有#include <string.h>,则strndup()范围内没有原型,因此编译器假定strndup()返回a int,并且采用未指定数量的参数.这显然是错误的.(我假设您正在以POSIX兼容模式进行编译,因此strndup()可供您使用.)

因此,在启用警告的情况下编译代码总是很有用.

如果您的问题在更改后仍然存在,则可能存在错误.

编辑:看起来有可能是一个问题strndup()在AIX上:这个问题似乎是在一个破碎的strnlen()AIX上的功能.如果,即使#include <string.h>你看到问题,很可能你会看到这个错误.一个谷歌搜索显示了它的结果一长串.

编辑2:

你能试试下面的程序并发布结果吗?

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
     char *test1   = "abcdefghijabcdefghijabcdefghijk";
     char *test2   = "012345678901234567890123456789";
     char *control = "01234567890123456789012345678";
     char *verify;
     free(strndup(test1, 30));
     verify = strndup(test2, 29); /* shorter then first strndup !!! */
     fprintf(stderr,">%s<\n",verify);
     if (strcmp(control, verify))
         printf("strndup is broken\n");
}
Run Code Online (Sandbox Code Playgroud)

(摘自https://bugzilla.samba.org/show_bug.cgi?id=1097#c10.)

编辑3:看到你的输出之后,>01234567890123456789012345678<没有strndup is broken,我不认为你的AIX版本有strndupbug.

很可能你在某处破坏了内存(考虑到问题只出现在大型程序中,在某些条件下).您是否可以制作一个展示堆栈损坏问题的小型,完整,可编译的示例?否则,您必须在程序中调试内存分配/释放.有很多程序可以帮助你做到这一点,比如valgrind,glibc mcheck,dmalloc,electricfence等.