php / php/php-src

Inner expression compilation (for match) can result in wrong line numbers

Ouverte
#18,985 10 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Category: Engine Status: Verified
Langage dominant
C
Étoiles
40.4k
Forks
8.1k
Merge moyen
2 j 13 h
PR mergées (30 j)
96

Description

Description

The following code:

<?php
echo match(15) {
    13 => "A",
    15 => "B",
    default => "C",
};

Resulted in this output:

L0002 0000 MATCH int(15) 13: 0001, 15: 0003, default: 0005
L0003 0001 T1 = QM_ASSIGN string("A")
L0003 0002 JMP 0007
L0004 0003 T1 = QM_ASSIGN string("B")
L0004 0004 JMP 0007
L0005 0005 T1 = QM_ASSIGN string("C")
L0005 0006 JMP 0007
L0005 0007 ECHO T1    <<<<<<<<<<<<<<<<<<<<<<<< line 5 instead of 2!
L0007 0008 RETURN int(1)

But I expected this output instead:

L0002 0000 MATCH int(15) 13: 0001, 15: 0003, default: 0005
L0003 0001 T1 = QM_ASSIGN string("A")
L0003 0002 JMP 0007
L0004 0003 T1 = QM_ASSIGN string("B")
L0004 0004 JMP 0007
L0005 0005 T1 = QM_ASSIGN string("C")
L0005 0006 JMP 0007
L0002 0007 ECHO T1
L0007 0008 RETURN int(1)

The echo is on line 2, not line 5. This is because the line no gets overwritten. There's probably many more of these cases.
Discovered via https://github.com/krakjoe/pcov/issues/87

Possible fix idea (may be incomplete):
https://gist.github.com/nielsdos/fe1a4b30aee84efff23f32dc4b0e5ffe

cc @iluuu1994

PHP Version
8.3+
Operating System

No response

Guide de contribution

Ouvrir le guide de contribution

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.

Piste de recherche

Commencez par reproduire l’expression match PHP 8.3+ présentée et examiner le comportement de compilation de l’expression interne décrit dans l’issue. Comparez la sortie générée avec les numéros de ligne attendus et utilisez le correctif possible vers lequel pointe le lien comme contexte ; c’est terminé lorsque l’instruction ECHO indique la ligne 2 au lieu de la ligne 5, sans régression pour les autres instructions affichées.

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

Évaluation

Stack technique
c, php
Domaine
compilers
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
47/100

Recevez les nouvelles issues par e-mail

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