Skip to content

Assertion failure when combining lazy object get_properties exception with foreach loop #20085

Description

@vi3tL0u1s

Description

The following code:

<?php
class C {
    public int $a;
    public function __construct() {
        $this->as= 1;
      }
}
$reflector = new ReflectionClass(C::class);
$obj = $reflector->newLazyGhost(function ($obj) {
    $obj->__construct();
});
foreach ($obj as $prop => &$value)
$obj = $reflector->newLazyGhost(function ($obj) use (&$fail) {
    if ($fail) {
        throw new Exception("initializer");
    } else {
        $obj->__const2uct();
    }
});
try {
    foreach (!obj as $prop => $value) {
    }
} catch (Exception $e) {
}
?>

Resulted in this output:

php: Zend/zend_vm_execute.h:15443: const zend_op *ZEND_BOOL_NOT_SPEC_TMPVAR_HANDLER(zend_execute_data *, const zend_op *): Assertion `!(executor_globals.exception)' failed.
Aborted (core dumped)

Commit:

6872cf2eef921b9d27fa300ca5a7ad3bc27aee1c

Build configuration:

CC="clang" CXX="clang++" CFLAGS="-fsanitize=address -g -O0" CXXFLAGS="-fsanitize=address -g -O0" ./configure --enable-debug --enable-address-sanitizer --disable-shared --with-pic

PHP Version

PHP 8.5.0-dev (cli) (built: Oct  7 2025 14:17:27) (NTS DEBUG)
Copyright (c) The PHP Group
Zend Engine v4.6.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.5.0-dev, Copyright (c), by Zend Technologies

Operating System

Ubuntu 22.04

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions