首页 > 解决方案 > 函数文档缺少有关返回的指针为 NULL 或非 NULL 的信息。假设什么?

问题描述

我试图找出哪些 OpenSSL 函数可能返回 NULL 指针,哪些不能。有时文档明确指出该函数可能返回 NULL,例如

X509_NAME_get_entry

X509_NAME_get_entry() 返回指向所请求条目的 X509_NAME 指针,如果索引无效,则返回 NULL。

有时他们不会,例如

X509_get_subject_name

它只说明

X509_get_subject_name() 返回证书 x 的主题名称。返回的值是一个不能被释放的内部指针。

(对我来说)不清楚这是否意味着指针始终有效或者它是否也可以为 NULL。

另一个例子:

x509_name_entry_get_data

解释它的版本1.1.1

如果设置了 X509_NAME_ENTRY_get_object(),则返回有效的 ASN1_OBJECT 结构;如果发生错误,则返回 NULL。

但不适用于1.1.0

看一眼源代码也无济于事,例如 X509_get_subject_name 只返回一个成员:

X509_NAME *X509_get_subject_name(const X509 *a)
{
    return a->cert_info.subject;
}

如果这个成员曾经被分配了一个 NULL 指针或没有......

最后一个示例似乎有必要对来自函数的所有指针添加检查,这些函数没有明确的文档表明指针不能为 NULL。我不想在代码中添加无意义的指针检查,但我不想以某种方式使用与安全相关的库,其中丢失的指针检查可能会以某种方式被利用。

有人知道如何在这方面正确解释 OpenSSL 文档吗?或者它只是非常不一致并且无法真正分辨?

标签: copenssl

解决方案


一般来说,我会相信手册页,如果它说返回了一个指针,并且没有提到可能会返回一个 NULL 指针,那么你应该能够依赖它,这确实不是这种情况. 否则,我会认为这是一个应该报告的严重错误(无论是在手册页中还是在代码中)。

因为x509_name_entry_get_data()“返回值”部分在 1.1.0 版本中完全缺失。这是固定的。

我确实会安全行事并检查每个返回的指针是否为 NULL。这也可以在 API 将来更改时保存您的代码。

如果您真的不希望这样并且不想仅依赖联机帮助页,您至少可以执行一个简单的检查:创建一个空对象,调用相关函数并检查返回值。例如,对于一个X509对象:

X509 *x509=X509_new();
printf("%p\n", X509_get_subject_name(x509));

这确实给出了一个有效的指针,因此这暗示了联机帮助页是正确的。


推荐阅读