【问题标题】:How to pass a string as an argument when the function has integer as parameter?当函数具有整数作为参数时,如何将字符串作为参数传递?
【发布时间】:2019-07-10 08:38:05
【问题描述】:

我正在尝试为 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 在 include/openssl/sslerr.h 的 openssl 代码中定义,如下所示:

#define SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 291

这是因为 SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 是一个对应于整数的宏。我创建了一个包含所有错误名称的字符数组。现在,我将输入作为与 SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 同名的字符串(将整数输入传递给错误数组并获取名称)。

当我将它传递给这个函数时,它会抛出一个错误,因为它需要一个整数,但参数是 char * 类型。所以我的问题是为什么这个字符串没有被扩展为整数?另外,我怎样才能通过将输入作为字符串来实现呢?

【问题讨论】:

  • 你能显示SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY宏的代码吗?你说它是一个整数,也是一个字符串。
  • 如果 API 函数需要一个整数,为什么你认为你可以传递一个字符串?你为什么要首先这样做?
  • "为什么这个字符串没有被扩展为整数" 这应该怎么发生? IStrings 永远不会自动“扩展”。宏被预处理器替换,字符串不是。
  • @Gerhardh ...正如我所提到的,我正在为我的应用程序实现一个错误处理程序,并看到它可以首先处理我需要生成它们的所有错误...有超过 200 个错误openssl,每个都用问题中提到的宏定义
  • “现在我将输入作为与 SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 同名的字符串(将整数输入传递给错误数组并获取名称)。” - 显示代码

标签: c openssl macros


【解决方案1】:

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

你是这个意思吗?

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

因为errchar * 类型,但函数接受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);
    }

【讨论】:

  • 我以第一种方式实现它 char err[256] = "SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY "....这就是我做错了..我应该创建一个宏数组(正如你提到的)而不是比包含字符串格式的错误名称的数组。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多