[Python-checkins] bpo-33954: Fix compiler warning in _PyUnicode_FastFill() (GH-10737)

Victor Stinner webhook-mailer at python.org
Tue Nov 27 06:41:21 EST 2018


https://github.com/python/cpython/commit/163403a63e9272fcd14707e344122c2e3c5e0244
commit: 163403a63e9272fcd14707e344122c2e3c5e0244
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018-11-27T12:41:17+01:00
summary:

bpo-33954: Fix compiler warning in _PyUnicode_FastFill() (GH-10737)

'data' argument of unicode_fill() is modified, so it must not be
constant.

Add more assertions to unicode_fill(): check the maximum character
value.

files:
M Objects/unicodeobject.c

diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index cdfc2f6f2199..2b1db918a154 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -228,12 +228,14 @@ unicode_fill(enum PyUnicode_Kind kind, void *data, Py_UCS4 value,
     assert(kind != PyUnicode_WCHAR_KIND);
     switch (kind) {
     case PyUnicode_1BYTE_KIND: {
+        assert(value <= 0xff);
         Py_UCS1 ch = (unsigned char)value;
         Py_UCS1 *to = (Py_UCS1 *)data + start;
         memset(to, ch, length);
         break;
     }
     case PyUnicode_2BYTE_KIND: {
+        assert(value <= 0xffff);
         Py_UCS2 ch = (Py_UCS2)value;
         Py_UCS2 *to = (Py_UCS2 *)data + start;
         const Py_UCS2 *end = to + length;
@@ -241,6 +243,7 @@ unicode_fill(enum PyUnicode_Kind kind, void *data, Py_UCS4 value,
         break;
     }
     case PyUnicode_4BYTE_KIND: {
+        assert(value <= MAX_UNICODE);
         Py_UCS4 ch = value;
         Py_UCS4 * to = (Py_UCS4 *)data + start;
         const Py_UCS4 *end = to + length;
@@ -10117,7 +10120,7 @@ _PyUnicode_FastFill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length,
                     Py_UCS4 fill_char)
 {
     const enum PyUnicode_Kind kind = PyUnicode_KIND(unicode);
-    const void *data = PyUnicode_DATA(unicode);
+    void *data = PyUnicode_DATA(unicode);
     assert(PyUnicode_IS_READY(unicode));
     assert(unicode_modifiable(unicode));
     assert(fill_char <= PyUnicode_MAX_CHAR_VALUE(unicode));



More information about the Python-checkins mailing list