Skip to content

Commit cd24287

Browse files
[ErrorHandler] Make assert() silent when assert.quiet_eval=1
1 parent 83a53a5 commit cd24287

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

src/Symfony/Component/ErrorHandler/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
5.1.0
5+
-----
6+
7+
* made `assert()` silent when `assert.quiet_eval=1`
8+
49
4.4.0
510
-----
611

src/Symfony/Component/ErrorHandler/ErrorHandler.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ class ErrorHandler
104104
private static $silencedErrorCache = [];
105105
private static $silencedErrorCount = 0;
106106
private static $exitCode = 0;
107+
private static $assertQuietEval = false;
107108

108109
/**
109110
* Registers the error handler.
@@ -115,6 +116,8 @@ public static function register(self $handler = null, bool $replace = true): sel
115116
register_shutdown_function(__CLASS__.'::handleFatalError');
116117
}
117118

119+
self::$assertQuietEval = filter_var(ini_get('assert.quiet_eval'), FILTER_VALIDATE_BOOLEAN);
120+
118121
if ($handlerIsNew = null === $handler) {
119122
$handler = new static();
120123
}
@@ -413,6 +416,11 @@ public function handleError(int $type, string $message, string $file, int $line)
413416
$throw = $this->thrownErrors & $type & $level;
414417
$type &= $level | $this->screamedErrors;
415418

419+
// Make assert() silent when assert.quiet_eval=1, workaround https://bugs.php.net/75769
420+
if (E_WARNING === $type && 'a' === $message[0] && self::$assertQuietEval && 0 === strncmp($message, 'assert(): ', 10)) {
421+
$throw = $level = 0;
422+
}
423+
416424
if (!$type || (!$log && !$throw)) {
417425
return !$silenced && $type && $log;
418426
}

src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,4 +615,41 @@ public function errorHandlerWhenLoggingProvider(): iterable
615615
}
616616
}
617617
}
618+
619+
public function testAssertQuietEval()
620+
{
621+
$ini = [
622+
ini_set('zend.assertions', 1),
623+
ini_set('assert.active', 1),
624+
ini_set('assert.bail', 0),
625+
ini_set('assert.warning', 1),
626+
ini_set('assert.callback', null),
627+
ini_set('assert.quiet_eval', 1),
628+
ini_set('assert.exception', 0),
629+
];
630+
631+
$logger = new BufferingLogger();
632+
$handler = new ErrorHandler($logger);
633+
$handler = ErrorHandler::register($handler);
634+
635+
try {
636+
assert(false);
637+
} finally {
638+
restore_error_handler();
639+
restore_exception_handler();
640+
641+
ini_set('zend.assertions', $ini[0]);
642+
ini_set('assert.active', $ini[1]);
643+
ini_set('assert.bail', $ini[2]);
644+
ini_set('assert.warning', $ini[3]);
645+
ini_set('assert.callback', $ini[4]);
646+
ini_set('assert.quiet_eval', $ini[5]);
647+
ini_set('assert.exception', $ini[6]);
648+
}
649+
650+
$logs = $logger->cleanLogs();
651+
652+
$this->assertSame('debug', $logs[0][0]);
653+
$this->assertSame('Warning: assert(): assert(false) failed', $logs[0][1]);
654+
}
618655
}

0 commit comments

Comments
 (0)