私は個人的なプロジェクトとしていくつかのPHP拡張機能を書いています。(私は数十年前にリアルタイムおよびプロセス制御アプリケーションの開発にCを専門的に使用していたので、常にメモリアロケータの戻り値をチェックし、エラーパスがメモリをリークしないようにすることについて少し妄想的です。しかしその後C++と例外ハンドラー。)これで簡単なQがあります。
buf
次の後にNULLチェックを行う必要がありますか。
buf = emalloc(rec->len);
通常、FLOSSプロジェクトでは、この種のQに答えるためのテンプレートとして既存のソースを使用しますが、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開発者の答えを知っているなら、私はこれに感謝するでしょう。ありがとう。