Doc #78218 [Nab]: function intercepts execution of code that is not executed

From: Date: Wed, 26 Jun 2019 14:56:08 +0000
Subject: Doc #78218 [Nab]: function intercepts execution of code that is not executed
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-16779@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=78218&edit=1

 ID:                 78218
 User updated by:    lozinskiy dot artem at gmail dot com
 Reported by:        lozinskiy dot artem at gmail dot com
 Summary:            function intercepts execution of code that is not
                     executed
 Status:             Not a bug
 Type:               Documentation Problem
 Package:            Unknown/Other Function
 Operating System:   Ubuntu 18.04 LTS
 PHP Version:        7.1.30
 Block user comment: N
 Private report:     N

 New Comment:

>> Whatever the actual magical process is behind ticks, I don't think there's a bug
>> here.
Seriously, I made a convenient code analysis for myself using this function, but because of this
there is no bug, as you said, I cannot trust this analysis, for me this is a bug and a problem,
besides, only here is this behavior, and how can catch or identify this moment? How can I determine
that the function has been correctly reversed here and not here?


Previous Comments:
------------------------------------------------------------------------
[2019-06-26 14:48:49] requinix@php.net

Whatever the actual magical process is behind ticks, I don't think there's a bug here.

Look at https://3v4l.org/hneib/vld#output to see
exactly what PHP is doing with the code.

------------------------------------------------------------------------
[2019-06-26 14:30:39] lozinskiy dot artem at gmail dot com

But why on line 30 this function executed?
After all, up to 30 lines the cycle must be completed and the code will not be executed further.

------------------------------------------------------------------------
[2019-06-26 14:14:27] requinix@php.net

Because the very first thing that happens when execution enters the function is that execution
immediately leaves the function. And as documented, "not all statements are tickable".

------------------------------------------------------------------------
[2019-06-26 14:05:19] lozinskiy dot artem at gmail dot com

Description:
------------
---
From manual page: https://php.net/function.register-tick-function
---
PHP Version 7.1.30-1+ubuntu18.04.1+deb.sury.org+
Linux ubuntu 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64
---

function intercepts execution of code that is not executed

Test script:
---------------
<?php
declare(ticks=1);

function my_function() {

    echo print_r(debug_backtrace(), 1) . '<br/>';
    
}

register_tick_function('my_function', true);

$t = false;
$ar = ['test1' => '111'];

var_dump('->' . __METHOD__ . ' on ' . __FILE__ . ':' . __LINE__);

foreach ($ar as $k => $e) {
    
    $t = ($k === 'test2');
    
    var_dump('$t==='. var_export($t, 1));
    
    if ($t===false) {
        continue;
    }
    
    var_dump('this line code is not executed (execute "continue")');
    
    test2();
    test3();    // this will handled or ..
    // test4(); // uncomment this and this will handled (but function not exist)
}

var_dump('->' . __METHOD__ . ' on ' . __FILE__ . ':' . __LINE__);

function test2() {
    // this never handled (why? =))
    return 1;
}

function test3() {
    var_dump('->' . __METHOD__ . ' on ' . __FILE__ . ':' .
__LINE__);
}

Expected result:
----------------
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 10
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 12
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 13
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
/var/www/test.local/public/test/tick.php:15:string '-> on
/var/www/test.local/public/test/tick.php:15' (length=49)
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 15
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 19
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
/var/www/test.local/public/test/tick.php:21:string '$t===false' (length=10)
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 21
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
/var/www/test.local/public/test/tick.php:34:string '-> on
/var/www/test.local/public/test/tick.php:34' (length=49)
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 34
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 39
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 43
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 

Actual result:
--------------
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 10
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 12
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 13
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
/var/www/test.local/public/test/tick.php:15:string '-> on
/var/www/test.local/public/test/tick.php:15' (length=49)
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 15
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 19
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
/var/www/test.local/public/test/tick.php:21:string '$t===false' (length=10)
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 21
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 30
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
/var/www/test.local/public/test/tick.php:34:string '-> on
/var/www/test.local/public/test/tick.php:34' (length=49)
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 34
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 39
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 
Array ( [0] => Array ( [file] => /var/www/test.local/public/test/tick.php [line] => 43
[function] => my_function [args] => Array ( [0] => 1 ) ) ) 

---
that wrong...
---
on line 30 function intercepted execution on this line


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



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


Thread (17 messages)

« previous php.doc.bugs (#16779) next »