2

我想用 Perl 中的整数溢出检查(有符号、无符号、大端和小端)打包各种表达式结果。如果我尝试:

$ perl -e 'use warnings; print pack("c", 200)' | hexdump -C

我得到:

Character in 'c' format wrapped in pack at -e line 1.
00000000  c8                                                |.|
00000001

有没有办法检查 pack() 函数中发生的整数溢出?或者可能会强制函数在溢出时失败?如果我在打包前检查每种类型的范围(有符号 1、2、4、8 字节,无符号 1、2、4、8),代码看起来有点难看。

谢谢。

4

2 回答 2

4

您可以打开“包装”警告类别并使其致命。然后溢出将导致可以被捕获的异常。例如:

for my $val (127, 128) {
    print "$val -> ";
    if (eval {
        use warnings FATAL => qw(pack);
        pack("c", $val);
    }) {
        print "no overflow";
    } else {
        print "overflow ($@)";
    }
    print "\n";
}

另一种可能性是使用(最好是本地化的)$SIG{__WARN__}处理程序并在发生警告时检查处理程序。

于 2013-07-18T10:19:09.097 回答
0

致命警告是最简单的解决方案,但您可以编写自己的打包函数。

use Carp         qw( croak );
use Scalar::Util qw( looks_like_number );

sub pack_uint32_be {
   my ($n) = @_;
   croak "Not a number" unless looks_like_number($n);
   croak "Overflow"     unless 0 < $n && $n <= 2**32;
   return pack 'L>', $n;
}

$packed .= pack_uint32_be($x);
$packed .= pack_uint32_be($y);
于 2013-07-18T13:42:22.683 回答