[PHP-users 1204] Re: キーが0x7fffffff 以上の共有メモリよセマフォが指定できません
Atushi Sakauchi
php-users@php.gr.jp
Fri, 17 Aug 2001 12:08:07 +0900
坂内です.
At Fri, 17 Aug 2001 11:03:18 +0900,
S.Sugichan <sugichan@tkd.att.ne.jp> wrote:
> と言うことはshmop_open()に限らず通常の引数も-2147483648 〜 2147483647
> を越えた場合問題が出る可能性があると言うことですね?
引数の定義域が整数である場合にはマズイでしょうね.
また,演算子の中にもやばいのがありそうな気もします.
> 現状の関数では問題が少ないでしょうが、自分で作った関数の場合注意が必要
> と言うことですね。
>
> #PHPに限った話では無いのでしょうが
PHP の変数は,明示的に型を指定することができません.
マニュアルの Language Reference/Types/Integer/Integer overflow
に
If you specify a number beyond the bounds of the integer-type,
it will be interpreted as a double instead.
と明記されています.実際に試してみると,
% cat foo
#!/usr/local/bin/php -f
<?php
$i = 0x7fffffff;
print var_dump( $i );
$j = $i+1;
print var_dump( $j );
$i = 0x80000000;
print var_dump( $i );
?>
% ./foo
int(2147483647)
float(2147483648)
float(2147483648)
というわけです.
つまり( i386 な Linux の C で ) key_t 型に 0x80000000 と
指定したのと同じ値を PHP で指定するには -2147483648 と
書く必要があります.
余談ですが,今試して「へぇ」と思ったのは $i++ のふるまいでした.
% cat hoge
#!/usr/local/bin/php -f
<?php
$i = 0x7fffffff;
print var_dump( $i );
$i++;
print var_dump( $i );
?>
% ./hoge
int(2147483647)
int(-2147483648)
これはこれで,ハマりそう.^^;
# テスト環境は PHP 4.0.6 / FreeBSD 4.3-STABLE です.