Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
42826566
Commit
42826566
authored
Nov 15, 2014
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Plain Diff
Issue #22193: Fixed integer overflow error in sys.getsizeof().
Fixed an error in _PySys_GetSizeOf declaration.
parents
7aaa67eb
030e92d1
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
42 additions
and
6 deletions
+42
-6
Include/sysmodule.h
Include/sysmodule.h
+1
-1
Lib/test/test_sys.py
Lib/test/test_sys.py
+31
-0
Python/sysmodule.c
Python/sysmodule.c
+10
-5
No files found.
Include/sysmodule.h
View file @
42826566
...
...
@@ -34,7 +34,7 @@ PyAPI_FUNC(void) PySys_AddXOption(const wchar_t *);
PyAPI_FUNC
(
PyObject
*
)
PySys_GetXOptions
(
void
);
#ifndef Py_LIMITED_API
PyAPI_
DATA
(
size_t
)
_PySys_GetSizeOf
(
PyObject
*
);
PyAPI_
FUNC
(
size_t
)
_PySys_GetSizeOf
(
PyObject
*
);
#endif
#ifdef __cplusplus
...
...
Lib/test/test_sys.py
View file @
42826566
...
...
@@ -770,6 +770,37 @@ class SizeofTest(unittest.TestCase):
# but lists are
self
.
assertEqual
(
sys
.
getsizeof
([]),
vsize
(
'Pn'
)
+
gc_header_size
)
def
test_errors
(
self
):
class
BadSizeof
:
def
__sizeof__
(
self
):
raise
ValueError
self
.
assertRaises
(
ValueError
,
sys
.
getsizeof
,
BadSizeof
())
class
InvalidSizeof
:
def
__sizeof__
(
self
):
return
None
self
.
assertRaises
(
TypeError
,
sys
.
getsizeof
,
InvalidSizeof
())
sentinel
=
[
"sentinel"
]
self
.
assertIs
(
sys
.
getsizeof
(
InvalidSizeof
(),
sentinel
),
sentinel
)
class
FloatSizeof
:
def
__sizeof__
(
self
):
return
4.5
self
.
assertRaises
(
TypeError
,
sys
.
getsizeof
,
FloatSizeof
())
self
.
assertIs
(
sys
.
getsizeof
(
FloatSizeof
(),
sentinel
),
sentinel
)
class
OverflowSizeof
(
int
):
def
__sizeof__
(
self
):
return
int
(
self
)
self
.
assertEqual
(
sys
.
getsizeof
(
OverflowSizeof
(
sys
.
maxsize
)),
sys
.
maxsize
+
self
.
gc_headsize
)
with
self
.
assertRaises
(
OverflowError
):
sys
.
getsizeof
(
OverflowSizeof
(
sys
.
maxsize
+
1
))
with
self
.
assertRaises
(
ValueError
):
sys
.
getsizeof
(
OverflowSizeof
(
-
1
))
with
self
.
assertRaises
((
ValueError
,
OverflowError
)):
sys
.
getsizeof
(
OverflowSizeof
(
-
sys
.
maxsize
-
1
))
def
test_default
(
self
):
size
=
test
.
support
.
calcvobjsize
self
.
assertEqual
(
sys
.
getsizeof
(
True
),
size
(
''
)
+
self
.
longdigit
)
...
...
Python/sysmodule.c
View file @
42826566
...
...
@@ -868,7 +868,7 @@ _PySys_GetSizeOf(PyObject *o)
{
PyObject
*
res
=
NULL
;
PyObject
*
method
;
size_t
size
;
Py_s
size_t
size
;
/* Make sure the type is initialized. float gets initialized late */
if
(
PyType_Ready
(
Py_TYPE
(
o
))
<
0
)
...
...
@@ -889,15 +889,20 @@ _PySys_GetSizeOf(PyObject *o)
if
(
res
==
NULL
)
return
(
size_t
)
-
1
;
size
=
PyLong_AsSize_t
(
res
);
size
=
PyLong_AsS
s
ize_t
(
res
);
Py_DECREF
(
res
);
if
(
size
==
(
size_t
)
-
1
&&
PyErr_Occurred
())
if
(
size
==
-
1
&&
PyErr_Occurred
())
return
(
size_t
)
-
1
;
if
(
size
<
0
)
{
PyErr_SetString
(
PyExc_ValueError
,
"__sizeof__() should return >= 0"
);
return
(
size_t
)
-
1
;
}
/* add gc_head size */
if
(
PyObject_IS_GC
(
o
))
size
+=
sizeof
(
PyGC_Head
);
return
size
;
return
((
size_t
)
size
)
+
sizeof
(
PyGC_Head
);
return
(
size_t
)
size
;
}
static
PyObject
*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment