我正在写一些PHP扩展作为个人项目。 (我过去几十年前专业地使用C来开发实时和过程控制应用程序,所以对于总是检查内存分配器返回值并确保错误路径不会泄漏内存,我有些偏执狂,但随后出现了C++和。异常处理),现在我有一个简单的问题:emalloc的测试返回状态
我是否还是不要我需要做buf
后一个NULL检查:
buf = emalloc(rec->len);
通常在FLOSS项目,我只想用现有的源作为模板来回答这种问题,但PHP扩展不一致。静态分析复杂的C预处理代码是不切实际的,我只能轻松测试我自己的LAMP堆栈。就我所见,emalloc代码确实会在堆耗尽时调用zend错误例程,但代码会继续并返回0.某些扩展代码实例检查是否返回NULL,但您也可以在的ext/standard/string.c
中找到示例,例如:
if (p_ret) {
ret = emalloc(len + 1);
memcpy(ret, comp, len);
ret[len] = '\0';
*p_ret = ret;
}
,这将产生一个硬内存异常,如果emalloc不会返回而不是抛出一个Zend例外。
如果有人知道官方PHP开发人员的答案,我会很感激。谢谢。
该emalloc函数的文档对此有何评论? – Mat
您可以尝试通过尝试分配大量内存来创建这种情况:'emalloc(99999999999)'(必要时添加更多9)。 – Lekensteyn
@Mat,我错过了**解开**指出的一句话。我对FLOSS项目的经验(我只贡献了4项)是这样的文档很少或根本不存在。开发人员不打扰,并且您希望从代码检查中重新设计这一点。覆盖整个基本MM系统的[一页](http://php.net/manual/en/internals2.memory.management.php)优于平均水平。 – TerryE