freestanding_check: hosted-RNG check misses rand/srand in headers, macro aliases and function pointers

Open
#2,309 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Active
Tech stack
c, shell

Research direction

Start in tools/freestanding_check.sh, where the hosted-RNG stage greps src/.c and extensions/.c for rand( and srand(), and read tools/freestanding_allowlist.txt to see why stage 1 passes. The proposed fix replaces the textual check with an nm -u scan of the hosted objects built by the gate's rows, so the design needs deciding first. Done when the four planted cases (static inline in a header, macro alias, function pointer, untracked file) make make freestanding-check exit nonzero, and src/freestanding/ stays green.

Written by the indexing model from the issue text.

Description

area:gates kind:gate-defect

The hosted-RNG half of tools/freestanding_check.sh (#1818; fail-closed fix in the PR for #2308) searches only tracked src/*.c and extensions/*.c, outside src/freestanding/, for the literal spelling rand( / srand(. The following reach libc rand/srand from hosted runtime code without being seen:

  1. A call inside a static inline function, or a macro body, in a header (src/*.h, extensions/*.h).
  2. A call through a macro alias, e.g. #define RNG rand and then RNG(), or through a function pointer (int (*r)(void) = rand;).
  3. Untracked files. git grep searches the index, so a new file that has not been git added is skipped in a local run. CI only sees committed files, so this matters only locally.

Stage 1 cannot catch any of these, because rand/srand are in tools/freestanding_allowlist.txt.

Possible root fix: check the symbol level instead of the spelling. Every hosted object built by the gate's rows would have no undefined reference to rand/srand (nm -u over the objects that are not freestanding), so headers, macros and pointers are all covered. The textual grep could stay as a fast first pass.

Found while reviewing the hq#58 fix (https://github.com/InauguralSystems/hq/issues/58).

Done when
  • A planted static inline int r(void) { return rand(); } in a header that a runtime .c file includes and calls makes make freestanding-check exit nonzero.
  • A planted #define RNG rand plus RNG() in src/*.c makes it exit nonzero.
  • A planted int (*p)(void) = rand; in src/*.c makes it exit nonzero.
  • src/freestanding/ keeps its own rand implementation, and that case is still green.

Generated by Claude Code

Dominant language
C
Stars
3
Forks
7
Avg merge
6h 32m
Merged PRs (30d)
285

Getting set up

Open in Codespaces

Starts the project's dev container in your browser, under your own GitHub account.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from InauguralSystems/EigenScript

All issues in InauguralSystems/EigenScript

Similar issues

More C issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.