Missing zend_return_unwrap_ref() calls trigger assertion failures:

Ouverte
#25,404 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

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
45/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
Active
Stack technique
c, php
Domaine
backend, testing-qa

Piste de recherche

Start by reading the linked issue #20628 and tracing the listed reproductions through RecursiveIteratorIterator::callHasChildren(), callGetChildren(), RecursiveFilterIterator::hasChildren(), and zend_call_method() in zend_test. Find where returned references need unwrapping, then add regression coverage for the reproductions and verify the assertion failures are gone.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Bug Extension: standard Extension: zend_test Status: Verified

The following cases trigger assertion failures, tested on latest 8.6 dev (0dbc4a7953a8aca38d0cf04fa4fb4ac076f00419)

php: Zend/zend_vm_execute.h:2167: const zend_op *ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER(zend_execute_data *, const zend_op *): Assertion `((call->func->common.fn_flags & (1 << 12)) && !zend_return_should_unwrap_ref(call)) ? (zval_get_type(&(*(ret))) == 10) : !(zval_get_type(&(*(ret))) == 10)' failed.
Aborted (core dumped)
`RecursiveIteratorIterator::callHasChildren()`
<?php

class Demo implements RecursiveIterator {

	public bool $v = true;

	public function getChildren(): ?RecursiveIterator { return null; }
	public function &hasChildren(): bool { return $this->v; }

	public function current(): mixed { return null; }
	public function key(): mixed { return null; }
	public function next(): void {}
	public function rewind(): void {}
	public function valid(): bool { return true; }

}

$r = new RecursiveIteratorIterator(new Demo());
var_dump($r->callHasChildren());
`RecursiveIteratorIterator::callGetChildren()`
<?php

class Demo implements RecursiveIterator {

	public mixed $v = null;

	public function &getChildren(): ?RecursiveIterator { return $this->v; }
	public function hasChildren(): bool { return true; }

	public function current(): mixed { return null; }
	public function key(): mixed { return null; }
	public function next(): void {}
	public function rewind(): void {}
	public function valid(): bool { return true; }

}

$r = new RecursiveIteratorIterator(new Demo());
var_dump($r->callGetChildren());
`RecursiveFilterIterator::hasChildren()`
<?php

class ConcreteRecursiveFilterIterator extends RecursiveFilterIterator {

	public function accept(): bool { return true; }

}

class Demo implements RecursiveIterator {

	public bool $v = true;

	public function getChildren(): ?RecursiveIterator { return null; }
	public function &hasChildren(): bool { return $this->v; }

	public function current(): mixed { return null; }
	public function key(): mixed { return null; }
	public function next(): void {}
	public function rewind(): void {}
	public function valid(): bool { return true; }

}

$r = new ConcreteRecursiveFilterIterator(new Demo());
var_dump($r->hasChildren());
`zend_call_method()` from zend_test
<?php

class Demo {
	public mixed $v = true;
	public function &returnsRef() { return $this->v; }
}

$d = new Demo();
var_dump(zend_call_method($d, 'returnsRef'));

Cross-link #20628

Langage dominant
C
Étoiles
41.8k
Forks
8.5k
Merge moyen
2 j 13 h
PR mergées (30 j)
145

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de php/php-src

Toutes les issues de php/php-src

Issues similaires

Plus d'issues C

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.