Skip to content

gc: PERRY_GC_TRACE=1 SIGSEGVs under the evacuating arms — the liveness instrument crashes on the corpus file that most needs it #7018

Description

@proggeramlug

Summary

PERRY_GC_TRACE=1 crashes the program it is supposed to be observing. Under the evacuating arms, test_gap_repsel_scalar_replaced_locals SIGSEGVs with the flag set and passes without it.

This matters more than an ordinary flag bug: PERRY_GC_TRACE=1 is the tool this whole campaign relies on to prove a GC arm was live. PERRY_GC_DIAG under-reports (it only prints on some paths), so GC_TRACE's one-marker-per-completed-cycle output is the primary evidence that a green cell means anything. A green cell from an inert arm is exactly the false confidence that invalidated months of this project's earlier results (#6942, #6946, #6950).

So the instrument crashes on the case that most needs instrumenting.

Reproduction

PERRY_GC_HEAP_LIMIT=8 PERRY_GC_INCREMENTAL=0 PERRY_CONSERVATIVE_STACK_SCAN=off \
PERRY_GC_TRACE=1 ./test_gap_repsel_scalar_replaced_locals
  • with PERRY_GC_TRACE=1 → SIGSEGV
  • without it → passes, byte-identical to the pinned Node 26.5.0 oracle, with copied_objects in the 261 251 – 379 072 range

Not a regression from the hoist

Confirmed pre-existing: reproduced identically on a rebuilt main without PR #7013, same arms, same failure. Reported during #7013's validation and deliberately not folded into that PR.

Status of this report

Measured by the agent that landed #7013; I have not independently re-verified it. First step for whoever picks this up is to reproduce both arms above before doing anything else.

Why it is plausible

The tracer runs inside a collection, walking structures the collector is mid-way through mutating — during an evacuating cycle, objects are being copied and forwarded while the trace reads them. A tracer that dereferences a forwarded-but-not-yet-rewritten pointer, or reads a header on an object already evacuated, would fault exactly here. That is a hypothesis, not a diagnosis; the stack will say.

Note the interaction with #6998 and #6995: both concern root words that are not what the decoder expects, and is_plausible_heap_addr is the shared predicate. If the tracer classifies raw words the same way, it may share their root cause.

Why it should be fixed rather than worked around

Every liveness claim in this campaign — "the arm moved N objects", "no green cell came from an inert arm" — is downstream of this flag. If it cannot run on the evacuating arms for some corpus files, then for those files we have no liveness evidence at all, and cells we currently call verified are only presumed verified.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions