Bug->Doc #67655 [Opn]: php_strip_whitespace outputs warnings instead of going through the error_handle

From: Date: Wed, 11 Mar 2020 13:01:07 +0000
Subject: Bug->Doc #67655 [Opn]: php_strip_whitespace outputs warnings instead of going through the error_handle
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-17392@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=67655&edit=1 ID: 67655 Updated by: cmb@php.net Reported by: seld@php.net Summary: php_strip_whitespace outputs warnings instead of going through the error_handle Status: Open -Type: Bug +Type: Documentation Problem Package: Scripting Engine problem Operating System: Linux PHP Version: Irrelevant Block user comment: N Private report: N New Comment: Well, actually this is because that warning is E_COMPILE_WARNING, and these cannot be handled by user defined error handlers. If it was E_WARNING, for instance, the error handler would be called. However, throwing an exception there would still not have the intended result, since at the end of zend_strip() exceptions are discarded[1]; this is done to prevent parse errors and such to make it to scripts which call php_strip_whitespace(). The most reasonable course of action appears to update the documentation to reflect that php_strip_whitespace() and highlight_string() and such swallow exceptions raised by userland callbacks. [1] <https://github.com/php/php-src/blob/php-7.4.3/Zend/zend_highlight.c#L228-L229> Previous Comments: ------------------------------------------------------------------------ [2014-07-21 01:05:26] yohgaki@php.net This happens because these syntax errors are handled in Zend. Output control is PHP feature, while language scanner is Zend. highlight_file(), etc may have same issue. ------------------------------------------------------------------------ [2014-07-19 22:25:22] seld@php.net Description: ------------ php_strip_whitespace appears to be bypassing the error handler and output buffering. If you run it in CLI and there is a warning like "Unterminated comment starting line .." then that is output to the user with no chance to intercept. More infos at https://github.com/composer/composer/issues/3030 and a test run showing various issues at http://3v4l.org/pS3LE The only workaround found was to @-silence the call, which is alright but I thought I'd report it anyway because it's pretty strange behavior. Test script: --------------- <?php function log_error($num, $str, $file, $line, $context = null) { throw new ErrorException( $str, 0, $num, $file, $line ); } set_error_handler('log_error'); ob_start(); // uncommenting the line below might help surface the problem: //error_reporting(-1); ini_set('display_errors', 1); file_put_contents('test.php', '<?php /*'); $out = php_strip_whitespace('test.php'); unlink('test.php'); var_dump(ob_get_clean(), $out); Expected result: ---------------- string(0) "" string(6) "<?php " Actual result: -------------- Warning: Unterminated comment starting line 1 in repro.php on line 9 string(0) "" string(6) "<?php " ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=67655&edit=1

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