mirror of
https://github.com/norandom/OpenUltraSAST.git
synced 2026-10-16 03:49:26 +00:00
spec(access-control-prover): control flow decides dominance; the trace carries each guard's relation, effect and the operation's control context
Requirement 10, the structural control-flow graph per function and CfgDominance behind the existing protocol, tasks 4.4 and 4.5. Textual order stays the checker's default; the prover selects control flow. Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
12d09faeed
commit
52ecbb76ab
@@ -220,6 +220,20 @@ from its own request-derived values keeps `request_input`; anything the walk can
|
||||
inter-procedural dataflow beyond the call sites on the path. The trace never carries language, framework,
|
||||
repository, size or count fields.
|
||||
|
||||
### cfg and CfgDominance (owned here)
|
||||
`src/openultrasast/semantic/cfg.py`: `FunctionCfg.from_cst(node, language)` builds basic blocks and edges from
|
||||
the tree-sitter syntax tree of one function (blocks, if/else, switch arms, loops with back edges, try/catch/
|
||||
finally, return, throw, break, continue, exit) and computes dominators (`dominates(a_line, b_line)`) and the
|
||||
control context of a line (`context(line) -> ControlContext(conditions, in_loop, in_try, catches, on_exception_path)`).
|
||||
`src/openultrasast/semantic/obligations/cfg_dominance.py::CfgDominance` implements the `Dominance` protocol:
|
||||
a statement witness dominates when its block dominates the operation's block and its failure effect is
|
||||
`throws`, `returns` or `exits` (the guard's condition leads to an exit on the failing arm; a bare boolean
|
||||
whose value no branch or exit consumes before the operation is `value_only`); router and decorator scopes
|
||||
dominate as before; along a path record, a witness on an earlier hop dominates as before. Without a graph for
|
||||
a function, `CfgDominance` falls back to `OrderDominance` and records `cfg_unavailable`.
|
||||
The trace's `Guard` gains `relation` (`all_paths`, `some_paths`, `none`, `after`) and `effect`
|
||||
(`throws`, `returns`, `exits`, `value_only`); the trace gains `operation_context: ControlContext`.
|
||||
|
||||
### obligations.enforcement
|
||||
```python
|
||||
def witnesses(*, root: Path, texts: Mapping[str, str], entries: Sequence[EntryPointRecord], language: str) -> list[Discharge]
|
||||
|
||||
Reference in New Issue
Block a user