Re: [VOTE]strn(case)cmp supporting a negative length as its third paramter
| From: | Sebastian Krebs | Date: | Mon, 15 Aug 2011 04:28:49 +0000 |
| Subject: | Re: [VOTE]strn(case)cmp supporting a negative length as its third paramter | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-54606@lists.php.net to get a copy of this message | ||
Am 14.08.2011 23:52, schrieb Rasmus Lerdorf:
On 08/14/2011 02:37 PM, Rasmus Lerdorf wrote:Or justOn 08/14/2011 02:03 PM, Stas Malyshev wrote:Put more succinctly. Subtle BC breaks like this worry me. Any strncmp() call with a computed length where that length may in some cases go negative will now potentially return a match where it wouldn't before. This would be very hard to track down. And the reason for introducing this subtle BC break is so that you can rewrite:Hi! On 8/14/11 11:40 AM, Rasmus Lerdorf wrote:I agree, however this change would potentially change the return value of the function. Before it would warn and not match. Even if you never saw the warning, at least length -1 would not give you a match. Now if the user data happens to end with the right character we now have a string match which is not at all what the code was written to do.My main issue with changing strncmp/strncasecmp is that these are currently exact mappings of the underlying libc functions. For peopleAnd why should anybody care? 99% of people using PHP never used a libc function and can hardly tell libc from gcc. If we can extend this function with useful functionality, nobody cares about what libc does.For example, I could imagine people writing code along these lines: $len = strlen($user_data) - strlen($suffix); if(!strncmp($user_data, $string, $len)) {Warning doesn't fix the bug - and unless you're in 0.0001% of the population that actually reads the logs daily and checks every message there it would be little to help you. We should have more useful functions, not more warnings. Warning won't make this code to work.// do something}if (substr("prefix_num", -3) == "num") { echo "they have same suffix\n"; }into:if (strncmp("prefix_num", "num", -3) === 0) { echo "they have same suffix\n"; }That doesn't seem like a big win to me.
if (strncmp(strrev('prefix_num'), 'mun', 3) === 0) {
// do something
}
-RasmusRegards, Sebastian