[PHP-users 3064] Re: mbregex のインストール

Yasuo Ohgaki php-users@php.gr.jp
Wed, 24 Oct 2001 11:29:48 +0900


大垣です。

Tatsuo Ishii wrote:

> 石井です.
> 
>>ご心配は理解しますが、バグでもないという反論をすると、
>>
> [略]
> 
>>     malloc() が失敗しないというのも、メモリが無かったら
>>     そこでプロセスを終了させているのだと思います。
>>     (ですから、nullポインタを読み書きして、例外が上がって、
>>       終了しても、たいして変わりが無い??)
>>
> 
> たいして変ると思いますよ.だって,「遅かれ早かれnullポインタを読み書き
> して例外が上がる」までに何が起きるか分かりませんし,第一nullポインタを
> 読んだだけでは落ちないハードウェアもあります.その場合,処理が先に進ん
> で悪さをする確率が大きくなります.
> 
> どうしてもmallocのエラー処理が面倒くさいというのなら,せめてmallocの中
> でexitすべきだと思います.
> 
> ところで,こういうコーディング方針って,PHPの開発者の中では普通なので
> すか?

この変はPostgreSQLと違って、httpdのプロセスが落ちでも「まいいか」
的な作りになっていると思います。(HTTPプロトコルの特性、従来のマル
チプロセスを利用したサーバーが前提なのでこうなっている、と思います)

PHP4.1.0RCのemalloc(_emalloc())では
==========
	HANDLE_BLOCK_INTERRUPTIONS();

	if (!p) {
		fprintf(stderr,"FATAL:  emalloc():  Unable to allocate %ld bytes\n",
(long) size);
#if ZEND_DEBUG && defined(HAVE_KILL) && defined(HAVE_GETPID)
		kill(getpid(), SIGSEGV);
#else
		exit(1);
#endif
		HANDLE_UNBLOCK_INTERRUPTIONS();
		return (void *)p;
	}
===========

メモリが足りなくなると、SIGSEGVするかexit(1)になっているようです。
(この辺コードは良く理解していないので問題ないかも知れませんが、こ
こだけ見ると、特にマルチスレッドサーバー、例えばApache2、では問題
があるように見えます。HDNDLE_UNBLOCK_INTERRUPTIONSマクロ等も見てみ
ないと何とも言えませんが。)

--
Yasuo Ohgaki
yohgaki@dd.iij4u.or.jp

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!  http://bb.yahoo.co.jp/