簡體   English   中英

結構中的strcpy提供了SIGABRT

[英]strcpy in a struct gives SIGABRT

我目前正在使用C語言編寫的FTP客戶端,它的運行情況還不錯。 我成功編寫了一個連接到FTP服務器並使用用戶名和密碼登錄的函數,但是返回錯誤。 我已經設置了一個struct FTPError {}; 具有3個字段:

  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()會產生緩沖區溢出。

您確定要傳遞內存分配的結構而不是未分配的指針嗎? 調用應類似於:

FTPError myError;
FTPConnect(host, user, password, &myError);

否則,如果您更喜歡使用指針:

FTPError* myError = (FTPError*) malloc(sizeof(FTPError));
FTPConnect(host, user, password, myError);

從它說的內容來看,我猜想您是用其他一些代碼破壞了堆棧,並且它只是在此處顯示。

無論如何,要確保您應該始終使用類似以下內容來初始化errn結構

 struct FTPError reply = { .status = 0 };

嘗試使用保存strcpy變體:

strncpy(errn->message, "any string with unknown length", FTP_ERROR_MAX-1 );
errn->message[ FTP_ERROR_MAX-1 ] = 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM