php / php/php-src

Assertion failure in check_node_running_in_fiber() when resuming a generator inside a Fiber destructor

Offen
#20,615 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Category: Engine Status: Verified
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.2k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

Description

The following code:

<?php
class a {
    static $b;
    static $max = 5.;
    function __destruct() {
        $a  = new a;
        static $gen = (function() {
            $from = (function () {
                $a = new a;
                yield;
            })();
            try {
                yield from $from;
            } finally {
            }
        })();
        $fiber = new Fiber(function () use ($gen, &$fiber) {
            $gen->next();
        });
        $fiber->start();
    }
}
new a;

Resulted in this output:

php: /path/to/php-src/Zend/zend_generators.c:217: _Bool check_node_running_in_fiber(zend_generator *): Assertion `generator->execute_data' failed.
Aborted

Commit:

56795d2810e

Build configuration:

CC="clang" CXX="clang++" CFLAGS="-fsanitize=address -g -O0" CXXFLAGS="-fsanitize=address -g -O0" LDFLAGS="-fsanitize=address" ./buildconf --force && ./configure --enable-debug --enable-address-sanitizer --disable-shared --with-pic --enable-mbstring --with-zlib
PHP Version
PHP 8.6.0-dev (cli) (built: Nov 29 2025 14:32:34) (NTS DEBUG)
Copyright (c) The PHP Group
Zend Engine v4.6.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.6.0-dev, Copyright (c), by Zend Technologies
Operating System

Ubuntu 22.04

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne bei Zend/zend_generators.c in der Nähe von check_node_running_in_fiber() in Zeile 217 und reproduziere anschließend das bereitgestellte Skript mit der debug- und AddressSanitizer-Konfiguration. Verfolge den Lebenszyklus von Generator und Fiber während der Objektzerstörung; fertig ist die Aufgabe, wenn der Reproduzierer nicht mehr aufgrund der Assertion abbricht und die Regressionstestabdeckung das Verhalten verifiziert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c, php
Bereich
backend
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.