Repository navigation
Conversation
Assisted-by: Claude
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
With the function JIT,
$x % -1with a literal-1divisor crashes with SIGFPE when$xisPHP_INT_MIN, where the interpreter returnsint(0). The cause is inzend_jit_long_math_helper(): forZEND_MODwith a constant divisor, only 0 and powers of two get special handling. Every other constant, -1 included, becomes a plainir_MOD_L(), i.e. anidivby -1, and that traps onZEND_LONG_MIN. The non-constant branch just below already guards against this.The fix adds an
op2_lval == -1case to the constant branch that sets the result to the constant 0, the same thingmod_function()does. For the test, I added amodNeg1(PHP_INT_MIN)call toext/opcache/tests/jit/mod_002.phpt, which already covers constant divisors including-1. On PHP-8.4 (debug + ASan build), that test and the reproducer from the issue both die with an FPE underopcache.jit=functionwithout the fix, and printint(0)with it. All ofext/opcache/tests/jitpasses under both the function and the tracing JIT.It targets PHP-8.4, the lowest branch still taking bug fixes; the issue also reproduces on master.
Fixes #24390.
Found with an LLM-based testing tool; I wrote this fix with help from Claude and reviewed it myself.