C# codegen: generated `Equals(object)` on `[SpacetimeDB.Type]` structs recurses forever
Maintainer thường phản hồi trong vòng 1 ngày
Một pull request liên quan đã được merge.
- #6303 của @lisandroct — đã merge
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 72/100
Hướng nghiên cứu
Lỗi nằm trong bộ sinh mã nguồn C# tại crates/bindings-csharp/BSATN.Codegen/Type.cs, khoảng dòng 809-818, nơi phương thức ghi đè Equals(object) được sinh ra cho struct gọi Equals(that_) trên một Nullable rồi đệ quy. Hãy bắt đầu bằng cách đọc mã của emitter, sau đó tái hiện lỗi với struct Cell và ví dụ Equals(a, b) trong issue. Hoàn thành khi phương thức ghi đè được sinh ra lấy giá trị từ nullable, chẳng hạn bằng cách gọi Equals(that_.Value), và reducer không còn tràn stack nữa.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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)).
- Ngôn ngữ chính
- Rust
- Star
- 25.3k
- Fork
- 1.1k
- Merge trung bình
- 2 ngày 18 giờ
- Pull request đã merge (30 ngày)
- 65
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Có mẫu pull request
- Không có hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của clockworklabs/SpacetimeDB
-
Unreal SDK: no way to set confirmed reads on the connection (Rust SDK has with_confirmed_reads)Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
clockworklabs/SpacetimeDB#6328 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
clockworklabs/SpacetimeDB#6314 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
clockworklabs/SpacetimeDB#6288 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
TypeScript server `ctx.random()`: first draw of every transaction is heavily biased (signed shift in `pcg32` seeding)Có thể đã có người làm @Tyagiquamar đã nhận 2 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
clockworklabs/SpacetimeDB#6247 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
clockworklabs/SpacetimeDB#6146 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của clockworklabs/SpacetimeDB
Issue tương tự
-
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 88/100
fritzprix/libr-agent#2165 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
area:ecosystem bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
Chelis-Lang/chelis#3942 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
needs-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 63/100
Maintainer thường phản hồi trong vòng 1 ngày
-
review-bot
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 86/100
Maintainer thường phản hồi trong vòng 1 ngày