0

私は個人的なプロジェクトとしていくつかの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開発者の答えを知っているなら、私はこれに感謝するでしょう。ありがとう。

4

1 に答える 1

2

ドキュメントには次のように明確に記載されています。

注:C標準ライブラリの対応するものとは異なり、Zend Engineのメモリ管理関数は、要求されたメモリの割り当て中に問題が発生した場合にNULLを返しませんが、現在の要求をベイルアウトして終了します。

于 2012-09-09T10:28:21.077 に答える