mirror of
https://github.com/python/cpython.git
synced 2026-04-05 03:21:05 +00:00
Test full range of native ints. This exposes two more binary pickle
bugs on sizeof(long)==8 machines. pickle.py has no idea what it's doing with very large ints, and variously gets things right by accident, computes nonsense, or generates corrupt pickles. cPickle fails on cases 2**31 <= i < 2**32: since it *thinks* those are 4-byte ints (the "high 4 bytes" are all zeroes), it stores them in the (signed!) BININT format, so they get unpickled as negative values.
This commit is contained in:
parent
aa815df1e1
commit
e089c68871
1 changed files with 19 additions and 0 deletions
|
|
@ -1,5 +1,8 @@
|
|||
# test_pickle and test_cpickle both use this.
|
||||
|
||||
from test_support import TestFailed
|
||||
import sys
|
||||
|
||||
# break into multiple strings to please font-lock-mode
|
||||
DATA = """(lp1
|
||||
I0
|
||||
|
|
@ -197,3 +200,19 @@ def dotest(pickle):
|
|||
else:
|
||||
if u2 != u:
|
||||
print "Endcase failure: %s => %s" % (`u`, `u2`)
|
||||
|
||||
# Test the full range of Python ints.
|
||||
n = sys.maxint
|
||||
while n:
|
||||
for expected in (-n, n):
|
||||
for binary_mode in (0, 1):
|
||||
s = pickle.dumps(expected, binary_mode)
|
||||
got = pickle.loads(s)
|
||||
if expected != got:
|
||||
raise TestFailed("for %s-mode pickle of %d, pickle "
|
||||
"string is %s, loaded back as %s" % (
|
||||
binary_mode and "binary" or "text",
|
||||
expected,
|
||||
repr(s),
|
||||
got))
|
||||
n = n >> 1
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue