当函数将整数作为参数时,如何将字符串作为参数传递?

时间:2019-07-10 08:38:05

标签: c openssl macros

我正在尝试对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);

在include / openssl / sslerr.h的openssl代码中定义了SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,它看起来像这样:

#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 个答案:

答案 0 :(得分:2)

  

我创建了一个包含所有错误名称的字符数组。

你是这个意思吗?

  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);
    }