Method call may leak if releasing EG(This) triggers GC
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- C
- Sterne
- 40.4k
- Forks
- 8.1k
- Ø Merge
- 2 T. 13 Std.
- Gemergte PRs (30 T.)
- 96
Beschreibung
Description
Method calls may cause their return value to leak if releasing EG(This) triggers GC.
The following code:
<?php
class A {
public $cycle;
public function __construct() { $this->cycle = $this; }
}
class B {
public function get() {
return new A();
}
}
$c = new B();
$objs = [];
while (gc_status()['roots']+2 < gc_status()['threshold']) {
$obj = new stdClass;
$objs[] = $obj;
}
var_dump($c->get());
Resulted in a memory leak:
Script: 'test.php'
Zend/zend_objects.c(189) : Freeing 0x00007ffff7a5c840 (56 bytes), script=test.php
=== Total 1 memory leaks detected ===
Here is what is happening:
- After returning from
get(),$cis released, which triggers GCAis removed from buffer, and is not collected because it's referenced by the call stack
- After returning from
var_dump(),zend_vm_stack_free_args()releasesAwithzval_ptr_dtor_nogc(), soAis not added to the GC buffer - At this point nothing references
Abut itself, andAis not in the GC buffer, so it leaks
I'm not sure how to fix this appart from switching to zval_ptr_dtor().
PHP Version
master
Operating System
No response
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Reproduzieren Sie das Leak mit dem Beispiel test.php, untersuchen Sie dann die verknüpften zend_vm_def.h-Aufrufstellen um die Zeilen 2866 und 4019 sowie den Leak-Bericht aus Zend/zend_objects.c. Bestätigen Sie, dass der Fix verhindert, dass das zurückgegebene zyklische Objekt nicht eingesammelt wird, und dass das Beispiel kein Memory-Leak mehr meldet.
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
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 38/100