IO_Bit 2.3.1 をリリースしました

IO_Bit に commit するのは 2年ぶりですが、getSIBits 関数の修正です。

getSIBits(0) で呼び出すと、arithmetic Error で落ちる。

SWF の MATRIX 構造で、たまたまこのケースに遭遇しました。

問題の解説

$width:0 の時も MSB ビットをチェックするのに ($width -1) シフトしていました。
負の値でシフトすると落ちます。

動作確認

  • 修正前
php -r 'require "/usr/local/share/php/IO/Bit.php"; $io= new IO_Bit() ; $io->input(""); var_dump($io->getSIBits(0));'
PHP Fatal error:  Uncaught ArithmeticError: Bit shift by negative number in /usr/local/share/php/IO/Bit.php:300
Stack trace:
(略)
  • 修正後
%  php -r 'require "/usr/local/share/php/IO/Bit.php"; $io= new IO_Bit() ; $io->input(""); var_dump($io->getSIBits(0));'
int(0)

変更イメージ

    function getSIBits($width) {
+       if ($width <= 0) {
+           return 0;
+       }
        $value = $this->getUIBits($width);
        $msb = $value & (1 << ($width - 1));
        if ($msb) {
            $bitmask = (2 * $msb) - 1;
            $value = - ($value ^ $bitmask) - 1;
        }
        return $value;
    }