php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #80701 NaN equals NaN in arrays, if two arrays have the same identity
Submitted: 2021-02-03 09:47 UTC Modified: 2021-02-12 16:04 UTC
From: riikka dot kalliomaki at gmail dot com Assigned:
Status: Open Package: Arrays related
PHP Version: 8.0.1 OS:
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2021-02-03 09:47 UTC] riikka dot kalliomaki at gmail dot com
Description:
------------
TL;DR; "$a = $b = [NAN]; [NAN] !== [NAN] && $a === $b".

PHP arrays don't officially have an identity. However, for optimization PHP uses copy on write for arrays so two arrays can have the same "identity" when, for example, an array is assigned to another variable.

For optimization, when using the strict comparison operator "===", PHP checks if the identity of two arrays is same to quickly return true in those cases. I mean, one would expect that two arrays that point to the same thing would be strictly equal.

However, this assumption is not true for NaN, i.e. [NAN] !== [NAN]. But, if you first assign the [NAN] to a variable, it can equal itself, if two arrays have the same identity.

Based on https://3v4l.org/gHjG0, this seems have been introduced in 5.3.15 / 5.4.5

I would consider this behavior to be a bug, but I'm not sure whether it is worth fixing since that could have non negligible performance impact. I did not run into this bug in actual code and simply realized it through personal musing. Thus, at least I don't personally consider fixing it important.

Test script:
---------------
<?php

$NaN = sqrt(-1);

var_dump($NaN === $NaN);
var_dump(array($NaN) === array($NaN));

$a = array($NaN);
$b = $a;

var_dump($a === $b);

reset($b);

var_dump($a === $b);

Expected result:
----------------
bool(false)
bool(false)
bool(false)
bool(false)

Actual result:
--------------
bool(false)
bool(false)
bool(true)
bool(false)

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2021-02-12 16:04 UTC] cmb@php.net
Interesting edge case!  The equality operator has the same issue.
 
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Mon Apr 19 13:01:25 2021 UTC