gpt4 book ai didi

c - 结构体中的 strcpy 给出 SIGABRT

转载 作者:行者123 更新时间:2023-11-30 14:30:11 24 4
gpt4 key购买 nike

我目前正在开发一个用 C 语言编写的 FTP 客户端,它运行得很好。我成功编写了一个连接到 FTP 服务器并使用用户名和密码登录的函数,但在返回错误时遇到问题。我设置了一个包含 3 个字段的 struct FTPError {};:

  1. int 错误代码
  2. int FTP 错误域(特定于我的函数)
  3. char[256] 用户可读的描述

函数的调用者通过引用函数传递一个结构,然后我用数据填充它。但我正在努力填充用户可读的字符串(char[256])。我用 strcpy 填充字符串,但当我调用它时,我的程序会发出 SIGABRT 信号。我向您展示一段简化的代码:

struct FTPError {
int status;
int domain;
char message[FTP_ERROR_MAX];
};

typedef int FTPConnection;

FTPConnection FTPConnect(const char *hostname, const char *username, const char *password, struct FTPError *errn) {

int socket = /* socket file descriptor */

// Success
if(success == 1) {
if(errn) {
// when I comment out the line below, no signal is sent
strcpy(errn->message, "User successfully loged in");
errn->status = 230;
errn->domain = kServerReplyDomain;
}
}

// return the file descriptor
return sockfd;
}
PS:这是 Xcode 在错误控制台中给我的信息:

Program loaded.
run
[Switching to process 2566]
Running…
SOCK: 3
Program received signal: “SIGABRT”.
sharedlibrary apply-load-rules all
kill
quit

0x00007fff824c03cc <+0000> mov $0x2000025,%eax
0x00007fff824c03d1 <+0005> mov %rcx,%r10
0x00007fff824c03d4 <+0008> syscall
0x00007fff824c03d6 <+0010> jae 0x7fff824c03dd <__kill+17> --> (points this line)
0x00007fff824c03d8 <+0012> jmpq 0x7fff82560a8c <cerror>
0x00007fff824c03dd <+0017> retq

3 __kill
2 __abort
1 __stack_chk_fail
0 main

PPS:我被要求显示调用该函数的代码:

int main (int argc, const char * argv[]) {
struct FTPError reply;
FTPConnection socket;

socket = FTPConnect("ftp.belnet.be", "anonymous", "pwd", &reply);

printf("SOCK: %d\n", socket);

return 0;
}

最佳答案

很可能是给函数的errn指针没有正确初始化,或者无效。否则,FTP_ERROR_MAX 也可能是一个太小的数字,从而导致 strcpy() 产生缓冲区溢出。

关于c - 结构体中的 strcpy 给出 SIGABRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619892/

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