Как передать строку в качестве аргумента, когда функция имеет целое число в качестве параметра? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь реализовать обработку ошибок для OpenSSL, чтобы генерировать ошибку в OpenSSL Я посмотрел функцию ERR_put_error, которая помещает ошибку, указанную в аргументах, в очередь ошибок потока. Эта функция имеет определение:

 void ERR_put_error(int lib, int func, int reason, const char *file, int line);

Как видите, он принимает func в качестве целочисленного аргумента. Но мы называем эту функцию как:

ERR_put_error(ERR_LIB_SSL,
              SSL_F_SSL3_GET_RECORD,
              SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,
              OPENSSL_FILE,
              OPENSSL_LINE);

SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY определяется в коде openssl по адресу include / openssl / sslerr.h и выглядит так:

#define SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 291

Это потому, что SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY - это макрос, который соответствует целому числу. Я создал массив символов, содержащий имена всех ошибок. Теперь, когда я даю входные данные в виде строки (передавая целочисленный ввод в массив ошибок и получая имя), имя которого совпадает с именем SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY.

Когда я передаю его этой функции, он выдает ошибку, поскольку ожидает целое число, но аргумент имеет тип char *. Итак, мой вопрос, почему эта строка не расширяется до целого числа? Кроме того, как я могу реализовать это, принимая входные данные в виде строки?

1 Ответ

2 голосов
/ 10 июля 2019

Я создал массив символов, содержащий имена всех ошибок.

Вы имели в виду это?

  char err[256] = "SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY "
                  "SSL_R_APP_DATA_IN_HANDSHAKE "
                  "SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT"
                  "SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE"
                  "SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE"
                  "SSL_R_BAD_CHANGE_CIPHER_SPEC"
                  "SSL_R_BAD_CIPHER"
                  "SSL_R_BAD_DATA";

или это?

  char err[256] = {SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,
                  SSL_R_APP_DATA_IN_HANDSHAKE,
                  SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT,
                  SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE,
                  SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE,
                  SSL_R_BAD_CHANGE_CIPHER_SPEC,
                  SSL_R_BAD_CIPHER,
                  SSL_R_BAD_DATA
                  };

В обоих случаях вызов ниже не будет работать.

ERR_put_error(ERR_LIB_SSL,
              SSL_F_SSL3_GET_RECORD,
              err,
              OPENSSL_FILE,
              OPENSSL_LINE);

, поскольку err имеет тип char *, но функция принимает int.


Вы можете попробовать определить, как показано ниже, и вызвать функцию в цикле.

   int err[8] = {SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,
                  SSL_R_APP_DATA_IN_HANDSHAKE,
                  SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT,
                  SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE,
                  SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE,
                  SSL_R_BAD_CHANGE_CIPHER_SPEC,
                  SSL_R_BAD_CIPHER,
                  SSL_R_BAD_DATA
                  };

    for (int i = 0; i< 8; i++) {
         ERR_put_error(ERR_LIB_SSL,
                    SSL_F_SSL3_GET_RECORD,
                    err[i],
                    OPENSSL_FILE,
                    OPENSSL_LINE);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...