Document and enable global storage ownership checks
This commit is contained in:
parent
f575258340
commit
935383f431
3 changed files with 63 additions and 0 deletions
32
AGENTS.md
32
AGENTS.md
|
|
@ -119,6 +119,15 @@ other contributors' agents: a function merges once "same" leads
|
||||||
symbol database, so the source survives new versions of the executable.
|
symbol database, so the source survives new versions of the executable.
|
||||||
If you need a new global, vtable or string, call `td_new_symbol` and use the
|
If you need a new global, vtable or string, call `td_new_symbol` and use the
|
||||||
returned annotation (`// GLOBAL: gl_00045`).
|
returned annotation (`// GLOBAL: gl_00045`).
|
||||||
|
- **Globals have one real definition.** Put a global's stable data annotation on its owning
|
||||||
|
`.cpp` definition, not on an `extern`. Shared declarations belong in its subsystem header;
|
||||||
|
source units include that header. A symbol-database record is not a C++ definition.
|
||||||
|
Recover initialization, object extent and lifetime from the original instructions and data,
|
||||||
|
not just symbol sizes. An evidenced member address uses `owner.member`, not a separate global.
|
||||||
|
Do not invent zero initialization or replace a nontrivial constructor with raw storage.
|
||||||
|
The project enables `globalRules`: both submission types and merge-time checks enforce
|
||||||
|
new/changed declarations and removal of required definitions. Existing unrelated violations
|
||||||
|
are not automatically corrected; report evidence gaps instead of manufacturing IDs.
|
||||||
- **No inline assembly, `__emit`, byte arrays of code, `#pragma code_seg`,
|
- **No inline assembly, `__emit`, byte arrays of code, `#pragma code_seg`,
|
||||||
`#pragma comment`, `#line`, or `__declspec(naked/allocate)`.** These are
|
`#pragma comment`, `#line`, or `__declspec(naked/allocate)`.** These are
|
||||||
rejected automatically, also when hidden behind macros.
|
rejected automatically, also when hidden behind macros.
|
||||||
|
|
@ -147,6 +156,29 @@ other contributors' agents: a function merges once "same" leads
|
||||||
Implement claimed functions and their single-caller helpers in the unit assigned by the claim;
|
Implement claimed functions and their single-caller helpers in the unit assigned by the claim;
|
||||||
do not split their implementation into separate helper `.cpp` files.
|
do not split their implementation into separate helper `.cpp` files.
|
||||||
|
|
||||||
|
## Structural maintenance (maintainers)
|
||||||
|
|
||||||
|
For data ownership, annotation moves and new owner units that belong to no function task:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
td maintenance submit --files Source/Owner.cpp,Source/Owner.h --notes "Evidence and reason"
|
||||||
|
td batch <batchId>
|
||||||
|
```
|
||||||
|
|
||||||
|
Name the exact locally checked payload and include all dependencies. Maintenance batches are
|
||||||
|
maintainer-only; they run the source gates, compile affected units/includers and compare effective
|
||||||
|
code with a fresh main build. A changed function uses the normal revision/review path instead.
|
||||||
|
The server registers new source units in `compile.json` on merge. A queued batch is not a merge.
|
||||||
|
|
||||||
|
The linked-code check does not validate data contents or reconstruct initialization/teardown.
|
||||||
|
Prove those separately before submitting. An offset-asserted partial layout is not evidence of a
|
||||||
|
complete object's size or constructor. Never retire a stable ID just because its address is
|
||||||
|
near another symbol: establish the member relationship from `this`-relative accesses/lifetime.
|
||||||
|
|
||||||
|
`td maintenance symbol <id> --size N --reason "binary evidence"` corrects a proven extent.
|
||||||
|
`--retire --reason "owner ID, offset and evidence"` retires a mistaken global only after its
|
||||||
|
annotation is removed from main. IDs remain reserved; unrelated symbols must not be renumbered.
|
||||||
|
|
||||||
## Common MSVC v142 matching tips
|
## Common MSVC v142 matching tips
|
||||||
|
|
||||||
- Declaration order of locals affects stack layout and register allocation.
|
- Declaration order of locals affects stack layout and register allocation.
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,36 @@ int g_resourceReuseDelay;
|
||||||
- Helper functions used only by one `.cpp` may stay `static` there, defined below the statics; they need no header
|
- Helper functions used only by one `.cpp` may stay `static` there, defined below the statics; they need no header
|
||||||
declaration.
|
declaration.
|
||||||
|
|
||||||
|
### Global storage and shared declarations
|
||||||
|
|
||||||
|
- Every reconstructed global has one actual definition in its owning subsystem's `.cpp`, with
|
||||||
|
its stable data annotation. File-local globals stay file-local. Function-local statics keep
|
||||||
|
their scope, guard/initialization behavior and stable identity.
|
||||||
|
- Shared headers contain plain `extern` declarations. Do not repeat `GLOBAL`, `STRING` or `VTABLE`
|
||||||
|
on those declarations. A `.cpp` includes the owner header instead of declaring a second extern.
|
||||||
|
Move permitted `STATIC` provenance with the definition; do not erase it to bypass a gate.
|
||||||
|
- The definition must exist on main or in the same payload. A name in the symbol database,
|
||||||
|
another declaration, a pending batch or a similarly named local does not allocate storage.
|
||||||
|
- Distinguish declarations from definitions: `extern int value;` is a declaration;
|
||||||
|
`extern int value = 1;` defines storage. Imported SDK/DLL data is not project-owned storage.
|
||||||
|
- Mutable pointers, arrays/tables, class-static definitions and local statics need stable IDs.
|
||||||
|
Scalar constants that are folded into code need no invented address. `constexpr` alone does
|
||||||
|
not exempt an addressable table or object. Use `STRING`/`VTABLE` only for that kind of original data.
|
||||||
|
- Check original loaded data, constructor/destructor paths and member accesses before deciding
|
||||||
|
type, size, alignment or initializer. The highest observed field gives a lower bound, not a
|
||||||
|
complete size. No xrefs or missing PE relocations do not prove an initializer is zero.
|
||||||
|
- A compiler may reference `global.member` by absolute address. Once that member relationship
|
||||||
|
is established, model it as a member with the evidenced offset, not independent storage or a
|
||||||
|
pointer alias that changes the generated access. Never infer membership solely from proximity.
|
||||||
|
- A partial class view does not reproduce the complete object's initialization or lifetime.
|
||||||
|
Do not silently replace an original nontrivial constructor/destructor with a trivial global.
|
||||||
|
|
||||||
|
The opt-in `globalRules` gate checks main plus the proposed payload in ordinary verification,
|
||||||
|
maintenance verification and again at merge. It checks changed declarations/annotations and
|
||||||
|
deletion of definitions still required by existing externs. It is a source-level guard, not a
|
||||||
|
complete C++ linker or proof that an address/initializer is correct. Unchanged legacy findings
|
||||||
|
remain audit findings; do not create speculative definitions or IDs to suppress them.
|
||||||
|
|
||||||
### `// INLINED` for functions that exist only inlined
|
### `// INLINED` for functions that exist only inlined
|
||||||
|
|
||||||
A function that exists only inlined has exactly one annotation, the bare line `// INLINED`, immediately above its definition:
|
A function that exists only inlined has exactly one annotation, the bare line `// INLINED`, immediately above its definition:
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
"Source/**/*.inl"
|
"Source/**/*.inl"
|
||||||
],
|
],
|
||||||
"toolchain": "ragnarok",
|
"toolchain": "ragnarok",
|
||||||
|
"globalRules": true,
|
||||||
"matchPolicy": {
|
"matchPolicy": {
|
||||||
"reviewAt": "match_unresolved",
|
"reviewAt": "match_unresolved",
|
||||||
"maxCleanupCycles": 5,
|
"maxCleanupCycles": 5,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue