Bug #73954 [Com]: NAN check fails on Alpine Linux with musl
| From: | alex dot masterow at gmail dot com | Date: | Tue, 17 Jan 2017 20:59:03 +0000 |
| Subject: | Bug #73954 [Com]: NAN check fails on Alpine Linux with musl | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-206719@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=73954&edit=1
ID: 73954
Comment by: alex dot masterow at gmail dot com
Reported by: zaq178miami at gmail dot com
Summary: NAN check fails on Alpine Linux with musl
Status: Feedback
Type: Bug
Package: *General Issues
Operating System: Alpine Linux
PHP Version: Irrelevant
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
> OP, could you see if is_nan(NAN) returns TRUE?
It returns FALSE.
> are you certain NAN is actually a NaN? Could you try var_dump(NAN);?
float(NAN)
The same output as documentation is_nan().
Previous Comments:
------------------------------------------------------------------------
[2017-01-17 20:31:50] ajf@php.net
zend_isnan is defined in https://github.com/php/php-src/blob/db894fa6aa6e98811bcc39b1331fc201e33c10ef/Zend/configure.in#L72-L80:
#ifndef zend_isnan
#ifdef HAVE_ISNAN
#define zend_isnan(a) isnan(a)
#elif defined(HAVE_FPCLASS)
#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
#else
#define zend_isnan(a) 0
#endif
#endif
That last one doesn't look like a safe default. I wonder if it's falling back to that.
((a)!=(a)) would be a safer default.
OP, could you see if is_nan(NAN) returns TRUE?
On the same note, are you certain NAN is actually a NaN? Could you try var_dump(NAN);? I am
wondering if I possibly broke that constant a little while ago.
------------------------------------------------------------------------
[2017-01-17 20:26:03] ajf@php.net
Specifically, ZPP and type declarations call to zend_parse_arg_long_weak(). The key line here would
be https://github.com/php/php-src/blob/db894fa6aa6e98811bcc39b1331fc201e33c10ef/Zend/zend_API.c#L317:
if (UNEXPECTED(zend_isnan(Z_DVAL_P(arg)))) {
return 0;
}
Possibly zend_isnan() is broken here.
------------------------------------------------------------------------
[2017-01-17 20:21:25] ajf@php.net
It doesn't use ZPP-the-function, yes, but typehints for userland and internal functions inherit
their handling of NaN for integer parameters from ZPP (and actually share the code for this with ZPP
internally), which is why I linked the OP to that RFC.
------------------------------------------------------------------------
[2017-01-17 20:05:30] alex dot masterow at gmail dot com
I also know about this problem.
> What do you get with the following script with musl:
> var_dump(chr(NAN));
string(1) ""
Unicode: U+0000
HTML: �
------------------------------------------------------------------------
[2017-01-17 17:49:36] cmb@php.net
This has nothing to do with ZPP, because it's a userland function.
What do you get with the following script with musl:
<?php
var_dump(chr(NAN));
------------------------------------------------------------------------
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=73954
--
Edit this bug report at https://bugs.php.net/bug.php?id=73954&edit=1