C# codegen: generated `Equals(object)` on `[SpacetimeDB.Type]` structs recurses forever

Fermée Adaptée aux débutants
#6,124 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Une pull request liée a déjà été fusionnée.

  • #6303 par @lisandroct — fusionnée

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
72/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
csharp
Domaine
devtools

Piste de recherche

Le bug se trouve dans le générateur de source C# à crates/bindings-csharp/BSATN.Codegen/Type.cs, autour des lignes 809-818, où la surcharge Equals(object) générée pour les structs appelle Equals(that_) sur un Nullable et se rappelle récursivement. Commence par lire le code de l'émetteur, puis reproduis le problème avec la struct Cell et l'exemple Equals(a, b) de l'issue. C'est terminé lorsque la surcharge générée déballe la valeur nullable, par exemple en appelant Equals(that_.Value), et que le reducer ne déborde plus la pile.

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

Description

Version: SpacetimeDB.Runtime 2.11.*, still on master e596513
Where: crates/bindings-csharp/BSATN.Codegen/Type.cs ~L809-818

public override bool Equals(object? that) {
    if (that == null) return false;
    var that_ = that as VoipCellCoord?;          // for structs this is Nullable<T>
    if (((object?)that_) == null) return false;
    return Equals(that_);                        // binds to Equals(object?) again → infinite recursion
}

Repro:

[SpacetimeDB.Type] public partial struct Cell { public int X; public int Y; }

[SpacetimeDB.Reducer]
public static void Repro(ReducerContext ctx) {
    Cell a = new() { X = 1 }; Cell? b = new Cell { X = 1 };
    var same = Equals(a, b);   // object.Equals → Cell.Equals(object) → stack overflow, wasm trap
}

Actual: the reducer traps with a deep recursion through VoipCellCoord__Equals_0 (RhBox at the bottom). Anything
that goes through Equals(object) is affected: object.Equals, EqualityComparer<T>.Default on boxed values,
collections of boxed structs.
Fix: for structs, return Equals(that_.Value); (or that is T t && Equals(t)).

Langage dominant
Rust
Étoiles
25.5k
Forks
1.1k
Merge moyen
3 j 19 h
PR mergées (30 j)
81

Préparer son environnement

  • Fournit un Dockerfile ou un fichier Docker Compose
  • Propose un modèle de pull request
  • Aucun 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.

Autres issues de clockworklabs/SpacetimeDB

Toutes les issues de clockworklabs/SpacetimeDB

Issues similaires

Plus d'issues Rust

Recevez les nouvelles issues par e-mail

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