This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Max size of the flop operator range.
authorJarkko Hietaniemi <jhi@iki.fi>
Thu, 29 May 2014 15:00:31 +0000 (11:00 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Thu, 29 May 2014 15:03:22 +0000 (11:03 -0400)
commitb262c4c91294fc9179a7343473b880ca445c4e43
treec4a7762b7ac182cc6adee56c9a5c4bee0558d2f3
parent6bce99ee04477bef3c6a1fb1711a54957bf33f13
Max size of the flop operator range.

Firstly, rename {max,j} -> {j,n} since j as the count is very confusing.

The j > SSize_t_MAX cannot (usually) fire.

(1) If the IV and SSize_t are the same (very likely) the count (an IV)
simply cannot be larger than the max of SSize_t.

(2) If IV is larger than SSize_t (e.g. long longs for IVs but only
32-bit pointers available) the count could conceivably be larger than
the max of SSize_t, but we still need to correctly dance around the
max: the signed maxima are tricky since the behavior of overflow is
undefined.

(3) The IV cannot be smaller than than SSize_t (e.g. I32 for IV but
64-bit pointers available): IV is supposed to be large enough to
contain pointers).

NOTE: this logic only protects against the wraparound, not against
an OOM: we will run out of memory long before we create (even)
SSize_t_MAX SVs. There is nothing magical about SSize_t as such,
except that it is a likely wraparound spot.

Fix for Coverity perl5 CID 28933:
Operands don't affect result (CONSTANT_EXPRESSION_RESULT)
result_independent_of_operands: j > 9223372036854775807L
/* (ssize_t)(~((size_t)0) >> 1) */ is always false regardless of
The values of its operands. This occurs as the logical operand of if.
pp_ctl.c