我正在编写几个 PHP 扩展作为个人项目。(几十年前我曾经专业地使用 C 来开发实时和过程控制应用程序,所以我对总是检查内存分配器返回并确保错误路径不会泄漏内存有点偏执。但是后来 C++ 的世界和异常处理程序。)现在我有一个简单的问题:
我是否需要在以下情况下进行 NULL 检查buf
:
buf = emalloc(rec->len);
通常在 FLOSS 项目中,我只会使用现有的源代码作为模板来回答这种问题,但是 PHP 扩展不一致。静态分析复杂的 C 预处理代码是不切实际的,我只能轻松测试自己的 LAMP 堆栈。基本上,据我所知,emalloc 代码确实会在堆耗尽时调用 zend 错误例程,但代码会继续并返回 0。一些扩展代码案例确实会检查 NULL 返回,但您也可以在以下示例中找到PHPAPI void php_basename()
示例ext/standard/string.c
:
if (p_ret) {
ret = emalloc(len + 1);
memcpy(ret, comp, len);
ret[len] = '\0';
*p_ret = ret;
}
如果 emalloc 确实返回而不是抛出一个 zend 异常,这将产生一个硬内存异常。
如果有人知道官方 PHP 开发人员的答案,我将不胜感激。谢谢。