php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #79762 ord should throw ValueError exception on empty string
Submitted: 2020-07-01 00:21 UTC Modified: 2020-07-01 07:43 UTC
From: raincomplain at outlook dot com Assigned:
Status: Open Package: Strings related
PHP Version: 8.0.0alpha1 OS:
Private report: No CVE-ID: None
 [2020-07-01 00:21 UTC] raincomplain at outlook dot com
Description:
------------
Empty string in PHP doesn't equal U+0000 which is why mb_ord will not return 0 when passing empty string. On the other hand, ord will not complain about passing empty string. I know ord is not aware of any string encoding but this behavior however leads to a wrong assumption that empty string === U+0000 which in turn leads to bugs like https://bugs.php.net/bug.php?id=69162

So one might think if 

var_dump(ord('') === 0); // true

And

var_dump(ord("\u{0000}") === 0); // true

Then the following must be true

var_dump("\u{0000}" === ''); // false

Test script:
---------------
var_dump(ord(''));

Expected result:
----------------
Fatal error: Uncaught ValueError: ord(): Argument #1 ($str) must not be empty

Actual result:
--------------
int(0)

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2020-07-01 01:13 UTC] requinix@php.net
-Status: Open +Status: Feedback
 [2020-07-01 01:13 UTC] requinix@php.net
Throwing an exception seems rather extreme. Is there a problem with returning false like many other functions already do?
 [2020-07-01 01:32 UTC] raincomplain at outlook dot com
ord will return non-Boolean value which evaluates to FALSE 

ord("\u{0000}") // 0

This makes returning false sub-optimal, anyhow mb_ord already throws ValueError so I think it would be proper for ord to throw an exception just like mb_ord.
 [2020-07-01 07:43 UTC] cmb@php.net
-Status: Feedback +Status: Open
 [2020-07-01 07:43 UTC] cmb@php.net
I agree that the behavior of both functions should ideally match,
but mb_ord('') threw a warning already before PHP 8, while ord('')
did not.  So maybe it would be best for BC to let ord('') raise a
warning and return FALSE in PHP 8.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Nov 12 22:01:30 2024 UTC