On 10/07/2011 10:04 AM, Pierre Joye wrote:
> especially when it is only about fixing a strict warning.

It's not _just_ about silencing a strict warning. It's about preventing
non-obvious fuck-ups in extensions as well, as I alluded to earlier in
the thread.

Consider an extension implementing a function like:


ZEND_BEGIN_ARG_INFO(arginfo_test, ZEND_SEND_PREFER_REF)
ZEND_END_ARG_INFO()

zend_function_entry test_functions[] = {
        ZEND_FE(test, arginfo_test)
        {NULL, NULL, NULL}
};

ZEND_FUNCTION(test)
{
        zval ***argv;
        int i, is_ref;
        int argc = ZEND_NUM_ARGS();

        argv = malloc(sizeof(zval **) * argc);

        zend_get_parameters_array_ex(argc, argv);

        for (i = 0; i < argc; i++) {
                is_ref  = PZVAL_IS_REF(*(argv[i]));

                if (is_ref) {
                        /* Let's update it, and possibly
                           be in for a nice surprise */
                        if (Z_TYPE_PP(argv[i]) == IS_LONG)
                                Z_LVAL_PP(argv[i])++;
                        if (Z_TYPE_PP(argv[i]) == IS_STRING)
                                ZVAL_STRING(*argv[i], "surprise", 1);
                }
                zend_error(E_USER_NOTICE,
                        "Param %d was%s received by ref",
                        i, is_ref ? "" : " not");
        }

        free(argv);

        RETURN_TRUE;
}


Then doing...

php -d extension=test.so -r '$a = 1; $b = 2; $str1 = "foo"; \
 test($str1, $str2 = "bar", $a, $b = 3, NULL, "str"); \
 echo "a: $a, b: $b, str1: $str1, str2: $str2\n";'

...would currently result in:

===
Notice: Param 0 was received by ref in Command line code on line 1

Notice: Param 1 was received by ref in Command line code on line 1

Notice: Param 2 was received by ref in Command line code on line 1

Notice: Param 3 was received by ref in Command line code on line 1

a: 2, b: 4, str1: surprise, str2: surprise
===

Which I think is a bit surprising in the case of 'b' and 'str2', whereas
after my patch it would be:

===
Notice: Param 0 was received by ref in Command line code on line 1

Notice: Param 1 was not received by ref in Command line code on line 1

Notice: Param 2 was received by ref in Command line code on line 1

Notice: Param 3 was not received by ref in Command line code on line 1

a: 2, b: 3, str1: surprise, str2: bar
===

Which I think is not as surprising.


> I would
> rather wait (maybe 5.4 last RC or final) before applying it to 5.3. We
> don't need a 5.3.7/8 again :)

Sure, it does not seem like people have been tripping over this left and
right, and given the change in behaviour, it may not be worth the risk.
That said, I'd be _very_ surprised, and a bit sad if anyone is relying
on the current buggy behaviour.


Daniel K.

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to