2017年12月6日水曜日

whileの条件に !feof は注意

とある国産オープンソースで見つけました。

while (!feof($fp)) {...}
この処理の前に、$fpが正常かのチェックがされていません。
これではファイルオープン失敗時に無限ループしてしまいます。 怖いですね。
ファイルオープン失敗なんて、バグでよくあること。

ファイルオープンに失敗していると、$fp に false が入っています。
feof(false)は、 false になります。
したがって、無限ループします。

正しいやりかたは、

エラー時に何かしたいことがあれば、
if ($fp !== false)  { while(!feof($fp)) {....}}else {...}

単純にスキップしていいなら

while ($fp && !feof($fp)) {...}
 でもいいね。 ※毎回$fpの判定という無駄があるけど、どうでもいいでしょう。