[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 です.