gpt4 book ai didi

c - 函数的返回值被破坏

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:01 29 4
gpt4 key购买 nike

我有以下代码:

static char sessionid[SESSIONID_LEN+1] = { '\0' };

static void generate_sessionid() {
char set[] = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int len;

memset(sessionid, 0, sizeof(char) * SESSIONID_LEN);
for (len = 0; len < SESSIONID_LEN; len++) {
size_t index = (double) rand()/RAND_MAX*(sizeof(set) - 1);
sessionid[len] = set[index];
}
}

char *get_sessionid() {
if (strlen(sessionid) == 0) generate_sessionid();
char * dup = strdup(sessionid);
return dup;
}

我从不同的线程(其函数在不同的文件中定义)调用 get_sessionid()。当我进入 get_sessionid() 的第 2 行并检查 strdup() 返回的指针地址时,这是值:

0x7f7788c004f50

现在,当我从此函数返回并检查线程函数中捕获的返回值时,返回值不同:

0xfffffffffc004f50

随后,当我在这个返回的指针值上调用 strlen() 时,我得到一个 SIGSEGV,原因是 Address 0xfffffffffc004f50 out of bounds

这两个文件是一个大型应用程序的一部分,该应用程序有大约 30 个线程在运行,并且在其他地方发生了更多的内存分配。我还认为内存已被其他线程泄漏。但我想确保上面的代码没有错误。

我单独验证了上面的代码,一切正常,返回值没有损坏,也就是说,当它与程序的其余部分隔离时,它工作得很好。但是我不明白为什么在整个程序的上下文中运行时返回值会发生变化。

编辑(附件)

在我调用的线程函数中:

线程.c

#include <header.h>

login_sessionid = (char*)get_sessionid();

在 header 中:header.h

char * get_sessionid(void);

编译器警告:

warning: implicit declaration of function ‘get_sessionid’ [-Wimplicit-function-declaration]
warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

以上两个警告都在文件 thread.c

显示的行(上方)

最佳答案

其他文件中的代码很可能没有意识到 get_sessionid() 返回一个指针,因此它假定它返回一个整数,然后对其进行符号扩展以创建一个指针.

您的编译器可能会警告未声明的函数;如果不是,请调高警告级别,直到出现为止。它还应该警告将整数转换为不同大小的指针。

注意编译器给出的警告。请记住,它比您更了解 C。

还要确保编译器给你尽可能多的警告。如果您使用 gcc,您应该使用 gcc -Wall -Wextra -Werror -Wmissing-prototypes -Wold-style-definition -Wold-style-declaration 进行干净的编译;这是我当前的基准(使用 -std=c11-std=c99)。如果您的版本不支持旧式警告,您可以简单地忽略它们。

关于c - 函数的返回值被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22186767/

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