Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix GH-11245 (In some specific cases SWITCH with one default statemen…
…t will cause segfault) The block optimizer pass allows the use of sources of the preceding block if the block is a follower and not a target. This causes issues when trying to remove FREE instructions: if the source is not in the block of the FREE, then the FREE and source are still removed. Therefore the other successor blocks, which must consume or FREE the temporary, will still contain the FREE opline. This opline will now refer to a temporary that doesn't exist anymore, which most of the time results in a crash. For these kind of non-local scenarios, we'll let the SSA based optimizations handle those cases. Closes GH-11251.
- Loading branch information
Showing
4 changed files
with
79 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
--TEST-- | ||
GH-11245: In some specific cases SWITCH with one default statement will cause segfault (VAR variation) | ||
--INI-- | ||
opcache.enable=1 | ||
opcache.enable_cli=1 | ||
opcache.optimization_level=0x7FFFBFFF | ||
opcache.opt_debug_level=0x20000 | ||
opcache.preload= | ||
--EXTENSIONS-- | ||
opcache | ||
--FILE-- | ||
<?php | ||
function xx() { return "somegarbage"; } | ||
switch (xx()) { | ||
default: | ||
if (!empty($xx)) {return;} | ||
} | ||
?> | ||
--EXPECTF-- | ||
$_main: | ||
; (lines=4, args=0, vars=1, tmps=1) | ||
; (after optimizer) | ||
; %s | ||
0000 T1 = ISSET_ISEMPTY_CV (empty) CV0($xx) | ||
0001 JMPNZ T1 0003 | ||
0002 RETURN null | ||
0003 RETURN int(1) | ||
|
||
xx: | ||
; (lines=1, args=0, vars=0, tmps=0) | ||
; (after optimizer) | ||
; %s | ||
0000 RETURN string("somegarbage") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
--TEST-- | ||
GH-11245: In some specific cases SWITCH with one default statement will cause segfault (TMP variation) | ||
--INI-- | ||
opcache.enable=1 | ||
opcache.enable_cli=1 | ||
opcache.optimization_level=0x7FFFBFFF | ||
opcache.opt_debug_level=0x20000 | ||
opcache.preload= | ||
--EXTENSIONS-- | ||
opcache | ||
--FILE-- | ||
<?php | ||
class X { | ||
// Chosen to test for a memory leak. | ||
static $prop = "aa"; | ||
} | ||
switch (++X::$prop) { | ||
default: | ||
if (empty($xx)) {return;} | ||
} | ||
?> | ||
--EXPECTF-- | ||
$_main: | ||
; (lines=7, args=0, vars=1, tmps=2) | ||
; (after optimizer) | ||
; %s | ||
0000 T1 = PRE_INC_STATIC_PROP string("prop") string("X") | ||
0001 T2 = ISSET_ISEMPTY_CV (empty) CV0($xx) | ||
0002 JMPZ T2 0005 | ||
0003 FREE T1 | ||
0004 RETURN null | ||
0005 FREE T1 | ||
0006 RETURN int(1) | ||
LIVE RANGES: | ||
1: 0001 - 0005 (tmp/var) |