strcpy в структуре дает SIGABRT - PullRequest
       38

strcpy в структуре дает SIGABRT

0 голосов
/ 01 сентября 2010

В настоящее время я работаю над FTP-клиентом, написанным на C, и он работает довольно хорошо.Мне удалось написать функцию, которая подключается к 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;
}

Ответы [ 4 ]

2 голосов
/ 01 сентября 2010

Скорее всего, указатель errn, который передается функции, не инициализирован должным образом или недопустим. В противном случае FTP_ERROR_MAX может быть слишком маленьким числом, так что strcpy() вызывает переполнение буфера.

0 голосов
/ 01 сентября 2010

Попробуйте вместо этого вариант сохранения strcpy:

strncpy(errn->message, "any string with unknown length", FTP_ERROR_MAX-1 );
errn->message[ FTP_ERROR_MAX-1 ] = 0;
0 голосов
/ 01 сентября 2010

Судя по тому, что там написано, я предполагаю, что вы испортили свой стек с помощью некоторого другого кода и он просто появляется здесь, в этом месте.

Во всяком случае, чтобы быть уверенным, что вы всегда должны инициализировать структуру errn чем-то вроде

 struct FTPError reply = { .status = 0 };
0 голосов
/ 01 сентября 2010

Вы уверены, что передаете структуру, выделенную для памяти, а не нераспределенный указатель? Звонок должен быть как:

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

в противном случае, если вы предпочитаете работать с указателем:

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