php / php/php-src

PHP8.5: Opcache can crash in `do_implement_interface` when trait causes implicit `Stringable` interface addition

Abierto
#23,567 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Bug Status: Needs Triage
Lenguaje dominante
C
Estrellas
40.4k
Forks
8.2k
Merge medio
2 d 13 h
PR fusionados (30 d)
96

Descripción

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_cli are enabled (This may not require enable_cli with other SAPIs, but my issue was on the CLI / this is where I have narrowed down the issue)
  • A trait exists which has a __toString method
  • 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 Stringable or not)

With the above conditions, then if you have:

  1. A process that runs for at least the time for the second/third steps)
  2. A process runs that loads the base class into opcache's shared memory
  3. 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

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comience con el archivo principal proporcionado y el reproductor subclass.php; después, ejecute las dos secuencias de comandos de Windows CLI con PHP 8.5 y Opcache habilitado. Confirme que cargar la clase base seguida de la subclase ya no termina con STATUS_ACCESS_VIOLATION y que, en su lugar, imprime “sub ok” con el código de salida 0; el issue no especifica ningún archivo de implementación ni test.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
php
Área
backend, performance
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Activo
Claridad
Bastante claro
Aptitud para principiantes
55/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.