2013-07-18 95 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);