2013-07-18 53 views
1

我想在Perl中使用整数溢出检查(有符号,无符号,大端和小端)来打包表达式的各种结果。 如果我尝试: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 

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

谢谢。

回答

3

您可以打开“pack”警告类别并使其成为致命的。然后溢出会导致可能被困的异常。例如: -

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

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

+0

eval()的诀窍对我很好用 – v1ron

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