PHP8.5: Opcache can crash in `do_implement_interface` when trait causes implicit `Stringable` interface addition
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 55/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- php
- Domaine
- backend, performance
Piste de recherche
Commencez par le fichier principal fourni et le reproducteur subclass.php, puis exécutez les deux séquences de commandes Windows CLI avec PHP 8.5 et Opcache activé. Vérifiez que le chargement de la classe de base suivi de celui de la sous-classe ne se termine plus par STATUS_ACCESS_VIOLATION et affiche à la place « sub ok » avec le code de sortie 0 ; l’issue ne désigne aucun fichier d’implémentation ni aucun test.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Description
Just expanding on the description a little, in the following conditions:
- PHP8.5 is used (8.4 at least is not affected)
opcache.enable&opcache.enable_cliare enabled (This may not requireenable_cliwith other SAPIs, but my issue was on the CLI / this is where I have narrowed down the issue)- A trait exists which has a
__toStringmethod - A class uses the above trait without declaring it implements
Stringable(the base class) - A sub-class in a different file extends the base class (regardless of if implements
Stringableor not)
With the above conditions, then if you have:
- A process that runs for at least the time for the second/third steps)
- A process runs that loads the base class into opcache's shared memory
- A process runs that loads the file the sub-class is in is ran
The process in step 3 will crash with an exit code of -1073741819 (0xC0000005 - STATUS_ACCESS_VIOLATION).
The above process will also cause the crash if the long running process loads the base class into opcache's shared memory - the important points are that when step 3 happens there is a process that was running when the base class was loaded - it isn't relevant if it is the process that did the loading or not.
Full code for replicating:
Main file
<?php
$mode = $argv[1] ?? "";
if($mode === "hold"){
\sleep(30);
echo "hold ok\n";
exit(0);
}
trait TestTrait{
public function __toString() : string{
return "testString";
}
}
class TestBaseClass{
use TestTrait;
}
switch($mode){
case "base":
echo "base ok\n";
exit(0);
case "sub":
require __DIR__ . "/subclass.php";
echo "sub ok\n";
exit(0);
}
subclass.php:
<?php
class TestSubclass extends TestBaseClass{}
Commands to run (terminal one):
php -n -d opcache.enable=1 -d opcache.enable_cli=1 test.php hold
Commands to run (terminal two):
php -n -d opcache.enable=1 -d opcache.enable_cli=1 test.php base
echo %errorlevel%
php -n -d opcache.enable=1 -d opcache.enable_cli=1 test.php sub
echo %errorlevel%
Resulted in this output (terminal one):
hold ok
Resulted in this output (terminal two):
base ok
0
-1073741819
But I expected this output instead (terminal one):
hold ok
But I expected this output instead (terminal two):
base ok
0
sub ok
0
PHP Version
PHP 8.4.6 (cli) (built: Apr 9 2025 09:45:15) (ZTS Visual C++ 2022 x64)
Copyright (c) The PHP Group
Zend Engine v4.4.6, Copyright (c) Zend Technologies
Operating System
Windows 11 x64
- Langage dominant
- C
- Étoiles
- 40.4k
- Forks
- 8.2k
- Merge moyen
- 2 j 3 h
- PR mergées (30 j)
- 151
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de php/php-src
-
Bug Status: Needs Triage
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
Bug Status: Needs Feedback
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
php/php-src#24121 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Variant analysis: 1 unfixed sibling safety gap in php-srcPeut-être pris @kamil-tekiela l’a pris il y a 6 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
php/php-src#23958 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
sapi_lsapi_ub_write does not return bytes written in lsapi modePeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. OuverteBug Status: Needs Triage
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
Les mainteneurs répondent en général sous 1 jour
-
Bug Status: Needs Triage
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de php/php-src
Issues similaires
-
systemd-binfmt exits 1 when the binfmt_misc flush fails, even though all rules register successfullyPeut-être pris @turbcool l’a pris aujourd’hui. Ouvertebinfmt
Difficulté 2/5 1-3 heures Accessibilité débutants 80/100
Les mainteneurs répondent en général sous 1 jour
-
follow: logical decoding messages (wal2json "M") stop apply; on main follow then reports endpos reached with changes missingPeut-être pris @vgul l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
xmake-io/xmake#7822 · 3 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
libsdl-org/SDL#16444 ·
Les mainteneurs répondent en général sous 1 jour
-
bug Component component: net
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
RT-Thread/rt-thread#11852 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour