放置しすぎなのでとりあえずなんか書いておこうと思いました。はてな記法を忘れつつある...。
http://diary.eth.jp/?date=20070327#p02 に書かれてしまったネタですが、
<?php $foo = "bar"; for ($i = 0; $i < 0xffff+8; $i++) { $bar[] = $foo; } ?>
「segmentation faultになるのは分かった、じゃあどうすんのよ?」というのをもりよしに教えてもらいました。
<?php $foo = "bar"; for ($i = 0; $i < 0xffff+8; $i++) { $bar[] = (string) $foo; } ?>
いや、まあね。たしかにね。でもさー。
こんなことが問題になる場面でphpを使うなってことなんでしょうが、CLIあるんだからさ。バッチ処理とかしたいじゃないですか。
function aho($arg) { static $cache = array(); if (isset($cache[$arg])) { return $cache[$arg]; } ... $cache[$arg] = $ret; return $ret; }
みたいにruntimeでcacheを仕込んでいて、うかつにいろんなところから呼び出したりすると、ループの回数だけ見ていても見落としてしまいます。
ちなみに必ずsegfaultするわけでもなく、いままで値があったのがrefcountが1周すると突如nullになったりします。なので、そこでバグってることがぱっと見わからないこともあって、けっこうハマる。