c - 函数文档缺少有关返回的指针为 NULL 或非 NULL 的信息。假设什么?
问题描述
我试图找出哪些 OpenSSL 函数可能返回 NULL 指针,哪些不能。有时文档明确指出该函数可能返回 NULL,例如
X509_NAME_get_entry() 返回指向所请求条目的 X509_NAME 指针,如果索引无效,则返回 NULL。
有时他们不会,例如
它只说明
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 文档吗?或者它只是非常不一致并且无法真正分辨?
解决方案
一般来说,我会相信手册页,如果它说返回了一个指针,并且没有提到可能会返回一个 NULL 指针,那么你应该能够依赖它,这确实不是这种情况. 否则,我会认为这是一个应该报告的严重错误(无论是在手册页中还是在代码中)。
因为x509_name_entry_get_data()
“返回值”部分在 1.1.0 版本中完全缺失。这是固定的。
我确实会安全行事并检查每个返回的指针是否为 NULL。这也可以在 API 将来更改时保存您的代码。
如果您真的不希望这样并且不想仅依赖联机帮助页,您至少可以执行一个简单的检查:创建一个空对象,调用相关函数并检查返回值。例如,对于一个X509
对象:
X509 *x509=X509_new();
printf("%p\n", X509_get_subject_name(x509));
这确实给出了一个有效的指针,因此这暗示了联机帮助页是正确的。
推荐阅读
- java - Maven如何根据平台配置更改依赖版本(MySQL)
- c# - 从后面的代码中添加一个 x:static 命令?
- java - 使 javafx 中的画布看起来像是亮着的
- c++ - 如何在 TBB 代码中完全关闭线程
- reactjs - 如何使用 var 作为对象的键进入反应项目
- sql - 下面的 SQL Server 查询在第 4 列中返回(无列名)。如何在第 4 列中创建列名
- c++ - 在结构中重载 ostream 和 istream 时逗号分开
- kubernetes - core-dns 说 NXDOMAIN 来自 Kubernetes 外部的查询
- amazon-web-services - 哪些资源可以驻留在 Amazon VPC 中?
- python - 使用python查找Land中最近的位置坐标