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; }