mirror of
https://github.com/github/codeql.git
synced 2026-06-03 04:40:14 +02:00
Preparatory refactor for the shared-CFG dataflow migration. Adds the new Python CFG library additively, without changing any production behaviour. Library additions: - semmle.python.controlflow.internal.AstNodeImpl — mediates between the Python AST and the shared codeql.controlflow.ControlFlowGraph signature. Wraps Python's Stmt/Expr/Scope/Pattern and adds two synthetic kinds of node (BlockStmt for body slots, intermediate nodes for multi-operand boolean expressions). - semmle.python.controlflow.internal.Cfg — public facade re-exposing the same API surface as semmle/python/Flow.qll (ControlFlowNode, CallNode, BasicBlock, NameNode, DefinitionNode, CompareNode, ...), backed by the shared CFG. - lib/printCfgNew.ql — debug/visualisation query for the new CFG. - consistency-queries/CfgConsistency.ql — consistency query running the shared CFG's standard checks against Python. Shared library: - shared.controlflow.ControlFlowGraph — adds two defaulted getWhileElse / getForeachElse predicates to AstSig so Python can model while-else / for-else (no behavioural change for other languages). Test additions: - ControlFlow/bindings/* — annotation-driven SSA-binding tests for the new CFG (annassign, compound, comprehension, decorated, except_handler, imports, match_pattern, parameters, simple, type_params, walrus_starred, with_stmt, dead_under_no_raise). - ControlFlow/store-load/* — basic store/load coverage. - ControlFlow/evaluation-order/NewCfg*.ql — mirrors of the existing OldCfg evaluation-order self-validation suite, run against the new CFG via NewCfgImpl.qll. - Minor extensions to existing test_if.py / test_boolean.py + cosmetic .expected churn on a handful of OldCfg tests. No dataflow, SSA, or production query is migrated yet — that lands in follow-up PRs. The new CFG library has zero callers in lib/ and src/. Verified by: - All lib + src + consistency-queries compile clean (367 queries). - All 56 ControlFlow library-tests pass. - All 474 dataflow + PointsTo library-tests + consistency tests pass. - syntax_error/CONSISTENCY/CfgConsistency passes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
# Store/load/delete/parameter classification on the new-CFG facade.
|
|
#
|
|
# Each annotated location carries the (sorted, deduplicated) set of
|
|
# kinds the CFG facade reports there. Comparing against the legacy
|
|
# 'semmle.python.Flow' classification is done by the comparison query
|
|
# 'StoreLoadParity.ql' — annotations here are only the positive
|
|
# assertions for the new facade.
|
|
#
|
|
# Tags:
|
|
# load=<id> -- isLoad() fires on the Name
|
|
# store=<id> -- isStore() fires
|
|
# delete=<id> -- isDelete() fires
|
|
# param=<id> -- isParameter() fires
|
|
# augload=<id> -- isAugLoad() fires (the LHS of x += ... when read)
|
|
# augstore=<id> -- isAugStore() fires (the LHS of x += ... when written)
|
|
|
|
|
|
# --- plain load / store / delete ---
|
|
|
|
x = 1 # $ store=x
|
|
y = x + 1 # $ store=y load=x
|
|
print(y) # $ load=print load=y
|
|
del x # $ delete=x
|
|
|
|
|
|
# --- function definitions (parameters) ---
|
|
|
|
def f(a, b=2, *args, c, **kwargs): # $ store=f param=a param=b param=args param=c param=kwargs
|
|
return a + b + c # $ load=a load=b load=c
|
|
|
|
|
|
# --- augmented assignment splits one Name into load + store halves ---
|
|
|
|
def aug(): # $ store=aug
|
|
n = 0 # $ store=n
|
|
n += 1 # $ augload=n augstore=n
|
|
return n # $ load=n
|
|
|
|
|
|
# --- subscript / attribute stores ---
|
|
|
|
class C: # $ store=C
|
|
pass
|
|
|
|
|
|
def stores(obj, container, idx): # $ store=stores param=obj param=container param=idx
|
|
obj.attr = 1 # $ load=obj
|
|
container[idx] = 2 # $ load=container load=idx
|
|
return obj # $ load=obj
|
|
|
|
|
|
# --- tuple unpacking ---
|
|
|
|
def unpack(pair): # $ store=unpack param=pair
|
|
a, b = pair # $ store=a store=b load=pair
|
|
return a + b # $ load=a load=b
|