【问题标题】:Does this OpenSSL function ever fail?这个 OpenSSL 功能会失败吗?
【发布时间】:2021-07-07 09:55:36
【问题描述】:

我想在我的代码中使用 OpenSSL 函数 EVP_MD_CTX_new。此函数的documentation 仅声明它“分配并返回摘要上下文”。由于此函数分配内存,我假设它可能失败,但文档没有说明这是否正确,以及在失败的情况下返回值是什么。

我对 C 编程有点陌生,对我来说,这个函数的接口似乎没有完全指定。在这种情况下,程序员应该做什么?我应该如何测试失败?我应该测试NULL 吗?如果是的话,他们到底为什么不明确说明这一点?

感谢您的意见。

奖励(更一般的)问题:不用说,这个特定的函数(和库)只是我遇到的许多类似示例之一。到目前为止,我的经验是,许多 C 函数的接口在某些方面没有完全指定。更多资深 C 程序员如何处理这些情况?我们是否应该依赖约定?或者也许深入研究我们使用的库的代码以查看行为是什么?

【问题讨论】:

    标签: c openssl


    【解决方案1】:

    您可以假设 C 中分配对象但失败的函数返回 NULL,在这种情况下它只是调用 OPENSSL_zalloc。 manual 指定 OPENSSL_zalloc 在出错时返回 NULL。

    它们在此并不明确,因为假设每个人都知道创建对象但失败的函数返回 NULL。这是一个很常见的约定。

    digest.c 中的实现。

    EVP_MD_CTX *EVP_MD_CTX_new(void)
    {
        return OPENSSL_zalloc(sizeof(EVP_MD_CTX));
    }
    

    【讨论】:

    • 感谢您的回复!你对我的奖金问题有什么想法吗?我注意到你做了我在那里提到的事情——依赖于惯例并查看了实现。这是您认为 C 世界通常需要的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多