Perl pack()和整数溢出

Perl pack()和整数溢出,perl,overflow,pack,Perl,Overflow,Pack,我想用Perl有符号、无符号、big-endian和little-endian中的整数溢出检查打包表达式的各种结果。 如果我尝试: $ perl -e 'use warnings; print pack("c", 200)' | hexdump -C 我得到: Character in 'c' format wrapped in pack at -e line 1. 00000000 c8 |.|

我想用Perl有符号、无符号、big-endian和little-endian中的整数溢出检查打包表达式的各种结果。 如果我尝试:

$ 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字节之前检查每个类型的范围,代码看起来有点难看


谢谢。

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

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{{uuuuu WARN{uuuuu}处理程序,并在发生警告时检查处理程序。

您可以打开包警告类别,使其致命。然后溢出将导致异常,该异常可能被捕获。例如:

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{{uuuuu WARN{uuuuu}处理程序,并在出现警告时检入处理程序。

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

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

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

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

它不是被要求的,但是如果只有一个最小的溢出,比如$v=pack$x,unpack$x,$v+1,它有可能得到进位吗?它不是被要求的,但是如果只有一个最小的溢出,比如$v=pack$x,unpack$x,$v+1,它有可能得到进位吗?