From f18ef6ca08a49e35a06df7822715db4868940d43 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Fri, 7 Feb 2020 19:04:34 +0100 Subject: [PATCH] [ErrorHandler] Never throw on warnings triggered by assert() and set assert.exception=1 in Debug::enable() --- src/Symfony/Component/ErrorHandler/Debug.php | 5 +++ .../Component/ErrorHandler/ErrorHandler.php | 5 +++ .../ErrorHandler/Tests/ErrorHandlerTest.php | 35 +++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/src/Symfony/Component/ErrorHandler/Debug.php b/src/Symfony/Component/ErrorHandler/Debug.php index 50d1789f09..a3c0511d22 100644 --- a/src/Symfony/Component/ErrorHandler/Debug.php +++ b/src/Symfony/Component/ErrorHandler/Debug.php @@ -29,6 +29,11 @@ class Debug ini_set('display_errors', 1); } + ini_set('zend.assertions', 1); + ini_set('assert.active', 1); + ini_set('assert.warning', 0); + ini_set('assert.exception', 1); + DebugClassLoader::enable(); return ErrorHandler::register(new ErrorHandler(new BufferingLogger(), true)); diff --git a/src/Symfony/Component/ErrorHandler/ErrorHandler.php b/src/Symfony/Component/ErrorHandler/ErrorHandler.php index b3afb53c9e..2ac16e380d 100644 --- a/src/Symfony/Component/ErrorHandler/ErrorHandler.php +++ b/src/Symfony/Component/ErrorHandler/ErrorHandler.php @@ -413,6 +413,11 @@ class ErrorHandler $throw = $this->thrownErrors & $type & $level; $type &= $level | $this->screamedErrors; + // Never throw on warnings triggered by assert() + if (E_WARNING === $type && 'a' === $message[0] && 0 === strncmp($message, 'assert(): ', 10)) { + $throw = 0; + } + if (!$type || (!$log && !$throw)) { return !$silenced && $type && $log; } diff --git a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php index 747dbb72db..70710302fd 100644 --- a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php +++ b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php @@ -615,4 +615,39 @@ class ErrorHandlerTest extends TestCase } } } + + public function testAssertQuietEval() + { + $ini = [ + ini_set('zend.assertions', 1), + ini_set('assert.active', 1), + ini_set('assert.bail', 0), + ini_set('assert.warning', 1), + ini_set('assert.callback', null), + ini_set('assert.exception', 0), + ]; + + $logger = new BufferingLogger(); + $handler = new ErrorHandler($logger); + $handler = ErrorHandler::register($handler); + + try { + \assert(false); + } finally { + restore_error_handler(); + restore_exception_handler(); + + ini_set('zend.assertions', $ini[0]); + ini_set('assert.active', $ini[1]); + ini_set('assert.bail', $ini[2]); + ini_set('assert.warning', $ini[3]); + ini_set('assert.callback', $ini[4]); + ini_set('assert.exception', $ini[5]); + } + + $logs = $logger->cleanLogs(); + + $this->assertSame('warning', $logs[0][0]); + $this->assertSame('Warning: assert(): assert(false) failed', $logs[0][1]); + } }