Bug #73954 [Fbk]: NAN check fails on Alpine Linux with musl

From: Date: Tue, 17 Jan 2017 20:26:03 +0000
Subject: Bug #73954 [Fbk]: NAN check fails on Alpine Linux with musl
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-206717@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
 Updated by:         ajf@php.net
 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:

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.


Previous Comments:
------------------------------------------------------------------------
[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));

------------------------------------------------------------------------
[2017-01-17 08:53:33] zaq178miami at gmail dot com

Description:
------------
It seems to be that is_nan check fails or sth like that as when passing NAN to as an int parameter
it silently casted to int(0). While int(0) is valid result for explicit (int)NAN cast, according to
Andrea (https://wiki.php.net/rfc/zpp_fail_on_overflow).

As already discussed on SO (http://chat.stackoverflow.com/transcript/message/35136128#35136128) it
might be just a musl bug, but maybe we should check what NAN do we have and maybe alter config
scripts and/or php_get_nan() accordingly? 

Here is runnable snippet: https://3v4l.org/m7hpq



Test script:
---------------
<?php
function test(int $test) {
    var_dump($test);
}

test(NAN);

Expected result:
----------------
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be of the type integer, float
given, called in /in/m7hpq on line 6 and defined in /in/m7hpq:2 Stack trace: #0 /in/m7hpq(6):
test(NAN) #1 {main} thrown in /in/m7hpq on line 2

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


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=73954&edit=1


Thread (20 messages)

« previous php.bugs (#206717) next »