Doc #73913 [Com]: broken strrpos with negative offset
| From: | dima at virtuman dot com | Date: | Fri, 13 Jan 2017 16:28:02 +0000 |
| Subject: | Doc #73913 [Com]: broken strrpos with negative offset | ||
| References: | 1 | Groups: | php.doc.bugs |
| Request: | Send a blank email to doc-bugs+get-14338@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=73913&edit=1
ID: 73913
Comment by: dima at virtuman dot com
Reported by: proartex at mail dot ru
Summary: broken strrpos with negative offset
Status: Assigned
Type: Documentation Problem
Package: Strings related
Operating System: macOS Sierra 10.12.1
PHP Version: 5.6.29
Assigned To: heiglandreas
Block user comment: N
Private report: N
New Comment:
Java implementation has no negative fromIndex for "public int lastIndexOf(String str, int
fromIndex)". Java implementation returns "-1" for any negative fromIndex.
There is an examples from python:
"
>>> 'aaaa'.rfind('a',0, -2)
1
>>> 'aaaa'.rfind('a', 0, -1)
2
>>> '/documents/show/5474'.rfind('/', 0, -20)
-1
>>> 'works_like_a_charm'.rfind('charm', 0, -3)
-1
>>> 'works_like_a_charm'.rfind('charm', 0, -5)
-1
"
It works the way we expect
Previous Comments:
------------------------------------------------------------------------
[2017-01-13 15:48:10] heiglandreas@php.net
For more infos have a look at https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#lastIndexOf(java.lang.String,%20int)
------------------------------------------------------------------------
[2017-01-13 15:46:33] heiglandreas@php.net
The current implementation is mathematically correct and is the same as f.e. the implementation in
Java and other programming languages. The docs are misleading here.
The negative offset specifies the last offset in the string the needle can start. Therefore the
results are correct.
Though the documentation of that feature needs some work to explicitly state that and make that more
clear.
------------------------------------------------------------------------
[2017-01-12 11:30:39] dima at virtuman dot com
my previous comment is not absolutely right. I'm not sure why those conditions are needed:
if (needle_len > -offset) {
e = haystack + haystack_len - needle_len;
} else {
e = haystack + haystack_len + offset;
}
In all cases we need to subtract absolute value of offset from e pointer and also subtract value of
needle length. There is no reason to check needle_len > -offset
------------------------------------------------------------------------
[2017-01-12 10:33:07] dima at virtuman dot com
Looks like the problem is related to https://github.com/php/php-src/blob/PHP-5.6.29/ext/standard/string.c#L1987
replace this one:
e = haystack + haystack_len + offset;
with this one:
e = haystack + haystack_len + offset - needle_len;
will solve the problem.
------------------------------------------------------------------------
[2017-01-11 21:57:27] heiglandreas@php.net
Looks like you're right! I dug deeper into it and it seems there is an issue when the negative
offset is smaller or equals the size of the needle.
I'm digging deeper into it.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=73913
--
Edit this bug report at https://bugs.php.net/bug.php?id=73913&edit=1