TSan embed row counts only trace.c races and warms up on the main thread — first-use init races are invisible
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 68/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Domain
- compilers, testing-qa
Research direction
Start with tests/test_tsan.sh and the embed_concurrent row, then trace the eigs_open and eigs_eval_string calls used by the reproducer. Update the TSan check to cover reports beyond src/trace.c while keeping suppressions explicit, and run the first-use concurrent states without main-thread warm-up. Done means a planted lazy-table race makes the row fail, with calibration recorded in the PR.
Written by the indexing model from the issue text.
Description
Found by the blind critic on PR #1332 (#1275 batch B). The PR introduced a lexer data race: first-use initialisation of the operator filter tables. CI's TSan lane did not see it, for two reasons.
- The
embed_concurrentrow intests/test_tsan.shcounts only reports whose stack is insrc/trace.c, so a race anywhere else in the runtime passes. - Its main thread lexes before any worker does, so first-use initialisation always completes single-threaded.
The critic's reproducer races it in 5 of 10 runs (and 0 of 13 on main): two threads each call eigs_open, wait on a barrier, then eigs_eval_string.
Done when
- The TSan embed row fails on ANY ThreadSanitizer report, not only
src/trace.cones. Existing suppressions stay explicit and carry reasons. - A row runs two or more states that lex, compile and eval for the FIRST time concurrently (barrier-released, no main-thread warm-up).
- Calibrated once: a planted first-use init race (a lazily filled static table) makes the row red. Recorded in the PR.
- Dominant language
- C
- Stars
- 3
- Forks
- 7
- Avg merge
- 3h 56m
- Merged PRs (30d)
- 102
Getting set up
Starts the project's dev container in your browser, under your own GitHub account.
- Ships a Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from InauguralSystems/EigenScript
-
area:lint-tooling bug
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
InauguralSystems/EigenScript#1340 ·
Maintainers usually reply within 1 day
-
area:stdlib found-by:code-review kind:silent-wrong
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
InauguralSystems/EigenScript#1338 ·
Maintainers usually reply within 1 day
-
area:lint-tooling found-by:critic kind:docs-drift
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
InauguralSystems/EigenScript#1335 ·
Maintainers usually reply within 1 day
-
area:ci found-by:critic kind:gate-defect
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
InauguralSystems/EigenScript#1311 ·
Maintainers usually reply within 1 day
-
enrolment: decide test_gc_runner_controls.py (exempt vs enrol) and whether floors need a ratchetOpenarea:gates found-by:critic kind:decision
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
InauguralSystems/EigenScript#1280 · 1 comment ·
Maintainers usually reply within 1 day
All issues in InauguralSystems/EigenScript
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
libretro/libretro-common#233 ·
-
[Bug]: chunk_span_bounds and _validated_chunk_spans reject Pydantic models ChunkSpan and AudioFileOpen
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
BasedHardware/omi#19047 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
obsproject/obs-studio#13936 · 2 comments ·
Maintainers usually reply within 1 day