Issue #24284: The startswith and endswith methods of the str class no longer

return True when finding the empty string and the indexes are completely out
of range.
This commit is contained in:
Serhiy Storchaka 2015-05-31 09:16:13 +03:00
commit 442a894d1e
4 changed files with 17 additions and 3 deletions

View file

@ -1049,6 +1049,10 @@ Changes in the Python API
program depends on patching the module level variable to capture the debug
output, you will need to update it to capture sys.stderr instead.
* The :meth:`str.startswith` and :meth:`str.endswith` methods no longer return
``True`` when finding the empty string and the indexes are completely out of
range. See :issue:`24284`.
Changes in the C API
--------------------

View file

@ -976,6 +976,9 @@ class MixinStrUnicodeUserStringTest:
self.checkequal(True, 'helloworld', 'startswith', 'lowo', 3)
self.checkequal(True, 'helloworld', 'startswith', 'lowo', 3, 7)
self.checkequal(False, 'helloworld', 'startswith', 'lowo', 3, 6)
self.checkequal(True, '', 'startswith', '', 0, 1)
self.checkequal(True, '', 'startswith', '', 0, 0)
self.checkequal(False, '', 'startswith', '', 1, 0)
# test negative indices
self.checkequal(True, 'hello', 'startswith', 'he', 0, -1)
@ -1022,6 +1025,9 @@ class MixinStrUnicodeUserStringTest:
self.checkequal(False, 'helloworld', 'endswith', 'lowo', 3, 8)
self.checkequal(False, 'ab', 'endswith', 'ab', 0, 1)
self.checkequal(False, 'ab', 'endswith', 'ab', 0, 0)
self.checkequal(True, '', 'endswith', '', 0, 1)
self.checkequal(True, '', 'endswith', '', 0, 0)
self.checkequal(False, '', 'endswith', '', 1, 0)
# test negative indices
self.checkequal(True, 'hello', 'endswith', 'lo', -2)

View file

@ -22,6 +22,10 @@ Release date: 2015-07-05
Core and Builtins
-----------------
- Issue #24284: The startswith and endswith methods of the str class no longer
return True when finding the empty string and the indexes are completely out
of range.
- Issue #24115: Update uses of PyObject_IsTrue(), PyObject_Not(),
PyObject_IsInstance(), PyObject_RichCompareBool() and _PyDict_Contains()
to check for and handle errors correctly.

View file

@ -9280,14 +9280,14 @@ tailmatch(PyObject *self,
PyUnicode_READY(substring) == -1)
return -1;
if (PyUnicode_GET_LENGTH(substring) == 0)
return 1;
ADJUST_INDICES(start, end, PyUnicode_GET_LENGTH(self));
end -= PyUnicode_GET_LENGTH(substring);
if (end < start)
return 0;
if (PyUnicode_GET_LENGTH(substring) == 0)
return 1;
kind_self = PyUnicode_KIND(self);
data_self = PyUnicode_DATA(self);
kind_sub = PyUnicode_KIND(substring);