mirror of
https://github.com/github/codeql.git
synced 2026-05-27 09:31:30 +02:00
Python: update dataflow tests for new CFG + shared SSA
Test-side changes accompanying the dataflow migration:
* Test queries (.ql) and shared test harness (TestSummaries,
TestTaintLib) qualify CFG / SSA types with Cfg:: / SsaImpl::,
bridge via AST (Name, Call, ...) instead of legacy NameNode /
CallNode, and switch GlobalSsaVariable / EssaVariable usages
to the new adapter API.
* .expected files updated for legitimate precision and toString
changes:
- phi-node def-use edges newly exposed in def_use_counts.
- scope-exit synthetic use surfaces one extra implicit use
in use-use-counts.
- For [empty]/[non-empty] outcome rows added in
EnclosingCallable.
- SsaSourceVariable / Global Variable label cosmetics
normalised throughout.
* Inline annotations:
- typetracking/test.py: removed MISSING:tracked on lines
93/95 (now found), added SPURIOUS:tracked on line 108
(decorator over-reach).
- global-flow/test.py: added SPURIOUS writes=g_mod on line
20 (correctly reports immediately-overwritten write).
- tainttracking/customSanitizer/test.py: marked
try/except: ensure_tainted(s) cases as MISSING: tainted
(no-raise CFG abstraction does not connect try body to
except body).
- coverage/test.py: marked
SINK(return_from_inner_scope([])) as
MISSING: flow=... pending closer investigation.
* regression/{dataflow,custom_dataflow}.expected: accept two
if/else cond-correlation over-reaches (documented limitation;
same imprecision applies under legacy semantics by design).
After this change the dataflow library-tests stand at 62 of 64
passing; the two remaining failures are tracked under the
ImportStarRefinement workstream.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -1,3 +1,3 @@
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:4:10:4:10 | z | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:7:19:7:19 | a | test.py:1:19:1:19 | x |
|
||||
| test.py:7:19:7:19 | a | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
| test.py:1:1:1:21 | SynthDictSplatParameterNode |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:1:19:1:19 | x |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() |
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:4:10:4:10 | z |
|
||||
| test.py:7:19:7:19 | a |
|
||||
|
||||
@@ -1,73 +1,73 @@
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:1:5:1:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:5:1:17 | ControlFlowNode for obfuscated_id | test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:5:1:17 | ControlFlowNode for obfuscated_id | test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:6:1:6:1 | ControlFlowNode for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:7:1:7:1 | ControlFlowNode for b | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:1:5:1:17 | obfuscated_id |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:1:5:1:17 | obfuscated_id | test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:5:1:17 | obfuscated_id | test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:1:19:1:19 | x | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:1:19:1:19 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:1:19:1:19 | x | test.py:2:7:2:7 | x |
|
||||
| test.py:1:19:1:19 | x | test.py:3:3:3:3 | z |
|
||||
| test.py:1:19:1:19 | x | test.py:3:7:3:7 | y |
|
||||
| test.py:1:19:1:19 | x | test.py:4:10:4:10 | z |
|
||||
| test.py:1:19:1:19 | x | test.py:7:1:7:1 | b |
|
||||
| test.py:1:19:1:19 | x | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:2:3:2:3 | y | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:2:3:2:3 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:2:3:2:3 | y | test.py:3:7:3:7 | y |
|
||||
| test.py:2:3:2:3 | y | test.py:4:10:4:10 | z |
|
||||
| test.py:2:3:2:3 | y | test.py:7:1:7:1 | b |
|
||||
| test.py:2:3:2:3 | y | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:2:7:2:7 | x | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:2:7:2:7 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:2:7:2:7 | x | test.py:3:3:3:3 | z |
|
||||
| test.py:2:7:2:7 | x | test.py:3:7:3:7 | y |
|
||||
| test.py:2:7:2:7 | x | test.py:4:10:4:10 | z |
|
||||
| test.py:2:7:2:7 | x | test.py:7:1:7:1 | b |
|
||||
| test.py:2:7:2:7 | x | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:3:3:3:3 | z | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:3:3:3:3 | z | test.py:4:10:4:10 | z |
|
||||
| test.py:3:3:3:3 | z | test.py:7:1:7:1 | b |
|
||||
| test.py:3:3:3:3 | z | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:3:7:3:7 | y | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:3:7:3:7 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:3:7:3:7 | y | test.py:4:10:4:10 | z |
|
||||
| test.py:3:7:3:7 | y | test.py:7:1:7:1 | b |
|
||||
| test.py:3:7:3:7 | y | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:4:10:4:10 | z | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:4:10:4:10 | z | test.py:7:1:7:1 | b |
|
||||
| test.py:4:10:4:10 | z | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:6:1:6:1 | a | test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:6:1:6:1 | a | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:6:1:6:1 | a | test.py:1:19:1:19 | x |
|
||||
| test.py:6:1:6:1 | a | test.py:2:3:2:3 | y |
|
||||
| test.py:6:1:6:1 | a | test.py:2:7:2:7 | x |
|
||||
| test.py:6:1:6:1 | a | test.py:3:3:3:3 | z |
|
||||
| test.py:6:1:6:1 | a | test.py:3:7:3:7 | y |
|
||||
| test.py:6:1:6:1 | a | test.py:4:10:4:10 | z |
|
||||
| test.py:6:1:6:1 | a | test.py:7:1:7:1 | b |
|
||||
| test.py:6:1:6:1 | a | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:6:1:6:1 | a | test.py:7:19:7:19 | a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:1:19:1:19 | x |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:2:3:2:3 | y |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:2:7:2:7 | x |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:3:3:3:3 | z |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:3:7:3:7 | y |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:4:10:4:10 | z |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:6:1:6:1 | a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:7:1:7:1 | b |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:7:19:7:19 | a |
|
||||
| test.py:7:1:7:1 | b | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() | test.py:7:1:7:1 | b |
|
||||
| test.py:7:19:7:19 | a | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:19:7:19 | a | test.py:1:19:1:19 | x |
|
||||
| test.py:7:19:7:19 | a | test.py:2:3:2:3 | y |
|
||||
| test.py:7:19:7:19 | a | test.py:2:7:2:7 | x |
|
||||
| test.py:7:19:7:19 | a | test.py:3:3:3:3 | z |
|
||||
| test.py:7:19:7:19 | a | test.py:3:7:3:7 | y |
|
||||
| test.py:7:19:7:19 | a | test.py:4:10:4:10 | z |
|
||||
| test.py:7:19:7:19 | a | test.py:7:1:7:1 | b |
|
||||
| test.py:7:19:7:19 | a | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
|
||||
@@ -1,46 +1,46 @@
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:1:5:1:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:1:5:1:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:5:1:17 | ControlFlowNode for obfuscated_id | test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:5:1:17 | ControlFlowNode for obfuscated_id | test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:6:1:6:1 | ControlFlowNode for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:6:1:6:1 | ControlFlowNode for a |
|
||||
| test.py:7:1:7:1 | ControlFlowNode for b | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:1:5:1:17 | obfuscated_id |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:1:5:1:17 | obfuscated_id |
|
||||
| test.py:1:5:1:17 | obfuscated_id | test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:5:1:17 | obfuscated_id | test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:1:19:1:19 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:1:19:1:19 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:1:19:1:19 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:1:19:1:19 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:1:19:1:19 | x | test.py:2:7:2:7 | x |
|
||||
| test.py:1:19:1:19 | x | test.py:2:7:2:7 | x |
|
||||
| test.py:1:19:1:19 | x | test.py:2:7:2:7 | x |
|
||||
| test.py:1:19:1:19 | x | test.py:2:7:2:7 | x |
|
||||
| test.py:2:3:2:3 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:2:3:2:3 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:2:3:2:3 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:2:3:2:3 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:2:3:2:3 | y | test.py:3:7:3:7 | y |
|
||||
| test.py:2:3:2:3 | y | test.py:3:7:3:7 | y |
|
||||
| test.py:2:3:2:3 | y | test.py:3:7:3:7 | y |
|
||||
| test.py:2:3:2:3 | y | test.py:3:7:3:7 | y |
|
||||
| test.py:2:7:2:7 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:2:7:2:7 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:2:7:2:7 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:2:7:2:7 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:3:3:3:3 | z | test.py:4:10:4:10 | z |
|
||||
| test.py:3:3:3:3 | z | test.py:4:10:4:10 | z |
|
||||
| test.py:3:3:3:3 | z | test.py:4:10:4:10 | z |
|
||||
| test.py:3:3:3:3 | z | test.py:4:10:4:10 | z |
|
||||
| test.py:3:7:3:7 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:3:7:3:7 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:3:7:3:7 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:3:7:3:7 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:4:10:4:10 | z | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:4:10:4:10 | z | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:6:1:6:1 | a | test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:6:1:6:1 | a | test.py:7:19:7:19 | a |
|
||||
| test.py:6:1:6:1 | a | test.py:7:19:7:19 | a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:6:1:6:1 | a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:6:1:6:1 | a |
|
||||
| test.py:7:1:7:1 | b | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() | test.py:7:1:7:1 | b |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() | test.py:7:1:7:1 | b |
|
||||
| test.py:7:19:7:19 | a | test.py:1:19:1:19 | x |
|
||||
| test.py:7:19:7:19 | a | test.py:1:19:1:19 | x |
|
||||
| test.py:7:19:7:19 | a | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:7:19:7:19 | a | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
|
||||
@@ -3,45 +3,45 @@
|
||||
| test.py:0:0:0:0 | ModuleVariableNode in Module test for a | test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode in Module test for b | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id | test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:1:1:1:21 | ControlFlowNode for FunctionExpr |
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:1:5:1:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:1:1:1:21 | FunctionExpr |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:1:5:1:17 | obfuscated_id |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:1:1:1:21 | SynthDictSplatParameterNode | test.py:1:1:1:21 | SynthDictSplatParameterNode |
|
||||
| test.py:1:5:1:17 | ControlFlowNode for obfuscated_id | test.py:1:5:1:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:5:1:17 | ControlFlowNode for obfuscated_id | test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:6:1:6:1 | ControlFlowNode for a |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:6:1:6:1 | ControlFlowNode for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:7:1:7:1 | ControlFlowNode for b | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:1:5:1:17 | obfuscated_id | test.py:1:5:1:17 | obfuscated_id |
|
||||
| test.py:1:5:1:17 | obfuscated_id | test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:1:19:1:19 | x | test.py:1:19:1:19 | x |
|
||||
| test.py:1:19:1:19 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:1:19:1:19 | x | test.py:2:7:2:7 | x |
|
||||
| test.py:1:19:1:19 | x | test.py:3:3:3:3 | z |
|
||||
| test.py:1:19:1:19 | x | test.py:3:7:3:7 | y |
|
||||
| test.py:1:19:1:19 | x | test.py:4:10:4:10 | z |
|
||||
| test.py:2:3:2:3 | y | test.py:2:3:2:3 | y |
|
||||
| test.py:2:3:2:3 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:2:3:2:3 | y | test.py:3:7:3:7 | y |
|
||||
| test.py:2:3:2:3 | y | test.py:4:10:4:10 | z |
|
||||
| test.py:2:7:2:7 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:2:7:2:7 | x | test.py:2:7:2:7 | x |
|
||||
| test.py:2:7:2:7 | x | test.py:3:3:3:3 | z |
|
||||
| test.py:2:7:2:7 | x | test.py:3:7:3:7 | y |
|
||||
| test.py:2:7:2:7 | x | test.py:4:10:4:10 | z |
|
||||
| test.py:3:3:3:3 | z | test.py:3:3:3:3 | z |
|
||||
| test.py:3:3:3:3 | z | test.py:4:10:4:10 | z |
|
||||
| test.py:3:7:3:7 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:3:7:3:7 | y | test.py:3:7:3:7 | y |
|
||||
| test.py:3:7:3:7 | y | test.py:4:10:4:10 | z |
|
||||
| test.py:4:10:4:10 | z | test.py:4:10:4:10 | z |
|
||||
| test.py:6:1:6:1 | a | test.py:6:1:6:1 | a |
|
||||
| test.py:6:1:6:1 | a | test.py:7:19:7:19 | a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:6:1:6:1 | a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:6:5:6:6 | IntegerLiteral |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:7:19:7:19 | a |
|
||||
| test.py:7:1:7:1 | b | test.py:7:1:7:1 | b |
|
||||
| test.py:7:5:7:17 | Capturing closure argument | test.py:7:5:7:17 | Capturing closure argument |
|
||||
| test.py:7:5:7:17 | ControlFlowNode for obfuscated_id | test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:7:5:7:17 | [post] Capturing closure argument | test.py:7:5:7:17 | [post] Capturing closure argument |
|
||||
| test.py:7:5:7:17 | [post] ControlFlowNode for obfuscated_id | test.py:7:5:7:17 | [post] ControlFlowNode for obfuscated_id |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() | test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:7:5:7:20 | [pre] ControlFlowNode for obfuscated_id() | test.py:7:5:7:20 | [pre] ControlFlowNode for obfuscated_id() |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a | test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:7:19:7:19 | [post] ControlFlowNode for a | test.py:7:19:7:19 | [post] ControlFlowNode for a |
|
||||
| test.py:7:5:7:17 | [post] obfuscated_id | test.py:7:5:7:17 | [post] obfuscated_id |
|
||||
| test.py:7:5:7:17 | obfuscated_id | test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() | test.py:7:1:7:1 | b |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() | test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:7:5:7:20 | [pre] After obfuscated_id() | test.py:7:5:7:20 | [pre] After obfuscated_id() |
|
||||
| test.py:7:19:7:19 | [post] a | test.py:7:19:7:19 | [post] a |
|
||||
| test.py:7:19:7:19 | a | test.py:7:19:7:19 | a |
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:1:5:1:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:5:1:17 | ControlFlowNode for obfuscated_id | test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y | test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x | test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y | test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a | test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:6:1:6:1 | ControlFlowNode for a |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:1:5:1:17 | obfuscated_id |
|
||||
| test.py:1:5:1:17 | obfuscated_id | test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:1:19:1:19 | x | test.py:2:7:2:7 | x |
|
||||
| test.py:2:3:2:3 | y | test.py:3:7:3:7 | y |
|
||||
| test.py:2:7:2:7 | x | test.py:2:3:2:3 | y |
|
||||
| test.py:3:3:3:3 | z | test.py:4:10:4:10 | z |
|
||||
| test.py:3:7:3:7 | y | test.py:3:3:3:3 | z |
|
||||
| test.py:6:1:6:1 | a | test.py:7:19:7:19 | a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:6:1:6:1 | a |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() | test.py:7:1:7:1 | b |
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr | test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral | test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() | test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:1:1:21 | FunctionExpr | test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:1:19:1:19 | x | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:1:19:1:19 | x | test.py:4:10:4:10 | z |
|
||||
| test.py:1:19:1:19 | x | test.py:7:1:7:1 | b |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:4:10:4:10 | z |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:7:1:7:1 | b |
|
||||
| test.py:6:5:6:6 | IntegerLiteral | test.py:7:19:7:19 | a |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() | test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() | test.py:7:1:7:1 | b |
|
||||
|
||||
@@ -3,23 +3,23 @@
|
||||
| test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr |
|
||||
| test.py:1:1:1:21 | FunctionExpr |
|
||||
| test.py:1:1:1:21 | SynthDictSplatParameterNode |
|
||||
| test.py:1:5:1:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral |
|
||||
| test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:1:5:1:17 | obfuscated_id |
|
||||
| test.py:1:19:1:19 | x |
|
||||
| test.py:2:3:2:3 | y |
|
||||
| test.py:2:7:2:7 | x |
|
||||
| test.py:3:3:3:3 | z |
|
||||
| test.py:3:7:3:7 | y |
|
||||
| test.py:4:10:4:10 | z |
|
||||
| test.py:6:1:6:1 | a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral |
|
||||
| test.py:7:1:7:1 | b |
|
||||
| test.py:7:5:7:17 | Capturing closure argument |
|
||||
| test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:7:5:7:17 | [post] Capturing closure argument |
|
||||
| test.py:7:5:7:17 | [post] ControlFlowNode for obfuscated_id |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:7:5:7:20 | [pre] ControlFlowNode for obfuscated_id() |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:7:19:7:19 | [post] ControlFlowNode for a |
|
||||
| test.py:7:5:7:17 | [post] obfuscated_id |
|
||||
| test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:7:5:7:20 | [pre] After obfuscated_id() |
|
||||
| test.py:7:19:7:19 | [post] a |
|
||||
| test.py:7:19:7:19 | a |
|
||||
|
||||
@@ -3,23 +3,23 @@
|
||||
| test.py:0:0:0:0 | ModuleVariableNode in Module test for a |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode in Module test for b |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode in Module test for obfuscated_id |
|
||||
| test.py:1:1:1:21 | ControlFlowNode for FunctionExpr |
|
||||
| test.py:1:1:1:21 | FunctionExpr |
|
||||
| test.py:1:1:1:21 | SynthDictSplatParameterNode |
|
||||
| test.py:1:5:1:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:1:19:1:19 | ControlFlowNode for x |
|
||||
| test.py:2:3:2:3 | ControlFlowNode for y |
|
||||
| test.py:2:7:2:7 | ControlFlowNode for x |
|
||||
| test.py:3:3:3:3 | ControlFlowNode for z |
|
||||
| test.py:3:7:3:7 | ControlFlowNode for y |
|
||||
| test.py:4:10:4:10 | ControlFlowNode for z |
|
||||
| test.py:6:1:6:1 | ControlFlowNode for a |
|
||||
| test.py:6:5:6:6 | ControlFlowNode for IntegerLiteral |
|
||||
| test.py:7:1:7:1 | ControlFlowNode for b |
|
||||
| test.py:1:5:1:17 | obfuscated_id |
|
||||
| test.py:1:19:1:19 | x |
|
||||
| test.py:2:3:2:3 | y |
|
||||
| test.py:2:7:2:7 | x |
|
||||
| test.py:3:3:3:3 | z |
|
||||
| test.py:3:7:3:7 | y |
|
||||
| test.py:4:10:4:10 | z |
|
||||
| test.py:6:1:6:1 | a |
|
||||
| test.py:6:5:6:6 | IntegerLiteral |
|
||||
| test.py:7:1:7:1 | b |
|
||||
| test.py:7:5:7:17 | Capturing closure argument |
|
||||
| test.py:7:5:7:17 | ControlFlowNode for obfuscated_id |
|
||||
| test.py:7:5:7:17 | [post] Capturing closure argument |
|
||||
| test.py:7:5:7:17 | [post] ControlFlowNode for obfuscated_id |
|
||||
| test.py:7:5:7:20 | ControlFlowNode for obfuscated_id() |
|
||||
| test.py:7:5:7:20 | [pre] ControlFlowNode for obfuscated_id() |
|
||||
| test.py:7:19:7:19 | ControlFlowNode for a |
|
||||
| test.py:7:19:7:19 | [post] ControlFlowNode for a |
|
||||
| test.py:7:5:7:17 | [post] obfuscated_id |
|
||||
| test.py:7:5:7:17 | obfuscated_id |
|
||||
| test.py:7:5:7:20 | After obfuscated_id() |
|
||||
| test.py:7:5:7:20 | [pre] After obfuscated_id() |
|
||||
| test.py:7:19:7:19 | [post] a |
|
||||
| test.py:7:19:7:19 | a |
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
| test.py:32:8:32:23 | CrosstalkTestX() | test.py:9:5:9:23 | Function __init__ | test.py:32:8:32:23 | [pre] ControlFlowNode for CrosstalkTestX() | self |
|
||||
| test.py:33:8:33:23 | CrosstalkTestY() | test.py:21:5:21:23 | Function __init__ | test.py:33:8:33:23 | [pre] ControlFlowNode for CrosstalkTestY() | self |
|
||||
| test.py:43:1:43:8 | func() | test.py:13:5:13:26 | Function setx | test.py:36:12:36:15 | ControlFlowNode for objx | self |
|
||||
| test.py:43:1:43:8 | func() | test.py:13:5:13:26 | Function setx | test.py:43:6:43:7 | ControlFlowNode for IntegerLiteral | position 0 |
|
||||
| test.py:43:1:43:8 | func() | test.py:25:5:25:26 | Function sety | test.py:38:12:38:15 | ControlFlowNode for objy | self |
|
||||
| test.py:43:1:43:8 | func() | test.py:25:5:25:26 | Function sety | test.py:43:6:43:7 | ControlFlowNode for IntegerLiteral | position 0 |
|
||||
| test.py:51:1:51:8 | func() | test.py:16:5:16:30 | Function setvalue | test.py:47:12:47:15 | ControlFlowNode for objx | self |
|
||||
| test.py:51:1:51:8 | func() | test.py:16:5:16:30 | Function setvalue | test.py:51:6:51:7 | ControlFlowNode for IntegerLiteral | position 0 |
|
||||
| test.py:51:1:51:8 | func() | test.py:28:5:28:30 | Function setvalue | test.py:49:12:49:15 | ControlFlowNode for objy | self |
|
||||
| test.py:51:1:51:8 | func() | test.py:28:5:28:30 | Function setvalue | test.py:51:6:51:7 | ControlFlowNode for IntegerLiteral | position 0 |
|
||||
| test.py:70:1:70:8 | func() | test.py:58:5:58:33 | Function foo | test.py:63:12:63:12 | ControlFlowNode for a | self |
|
||||
| test.py:70:1:70:8 | func() | test.py:58:5:58:33 | Function foo | test.py:70:6:70:7 | ControlFlowNode for IntegerLiteral | position 0 |
|
||||
| test.py:70:1:70:8 | func() | test.py:58:5:58:33 | Function foo | test.py:70:6:70:7 | ControlFlowNode for IntegerLiteral | self |
|
||||
| test.py:32:8:32:23 | CrosstalkTestX() | test.py:9:5:9:23 | Function __init__ | test.py:32:8:32:23 | [pre] After CrosstalkTestX() | self |
|
||||
| test.py:33:8:33:23 | CrosstalkTestY() | test.py:21:5:21:23 | Function __init__ | test.py:33:8:33:23 | [pre] After CrosstalkTestY() | self |
|
||||
| test.py:43:1:43:8 | func() | test.py:13:5:13:26 | Function setx | test.py:36:12:36:15 | objx | self |
|
||||
| test.py:43:1:43:8 | func() | test.py:13:5:13:26 | Function setx | test.py:43:6:43:7 | IntegerLiteral | position 0 |
|
||||
| test.py:43:1:43:8 | func() | test.py:25:5:25:26 | Function sety | test.py:38:12:38:15 | objy | self |
|
||||
| test.py:43:1:43:8 | func() | test.py:25:5:25:26 | Function sety | test.py:43:6:43:7 | IntegerLiteral | position 0 |
|
||||
| test.py:51:1:51:8 | func() | test.py:16:5:16:30 | Function setvalue | test.py:47:12:47:15 | objx | self |
|
||||
| test.py:51:1:51:8 | func() | test.py:16:5:16:30 | Function setvalue | test.py:51:6:51:7 | IntegerLiteral | position 0 |
|
||||
| test.py:51:1:51:8 | func() | test.py:28:5:28:30 | Function setvalue | test.py:49:12:49:15 | objy | self |
|
||||
| test.py:51:1:51:8 | func() | test.py:28:5:28:30 | Function setvalue | test.py:51:6:51:7 | IntegerLiteral | position 0 |
|
||||
| test.py:70:1:70:8 | func() | test.py:58:5:58:33 | Function foo | test.py:63:12:63:12 | a | self |
|
||||
| test.py:70:1:70:8 | func() | test.py:58:5:58:33 | Function foo | test.py:70:6:70:7 | IntegerLiteral | position 0 |
|
||||
| test.py:70:1:70:8 | func() | test.py:58:5:58:33 | Function foo | test.py:70:6:70:7 | IntegerLiteral | self |
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import python
|
||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
||||
private import semmle.python.dataflow.new.internal.SsaImpl as SsaImpl
|
||||
import semmle.python.dataflow.new.DataFlow
|
||||
private import semmle.python.dataflow.new.internal.DataFlowPrivate as DataFlowPrivate
|
||||
import utils.test.dataflow.RoutingTest
|
||||
@@ -26,21 +28,21 @@ class ArgNumber extends int {
|
||||
|
||||
module ArgumentRoutingConfig implements DataFlow::ConfigSig {
|
||||
additional predicate isArgSource(DataFlow::Node node, ArgNumber argNumber) {
|
||||
node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg" + argNumber
|
||||
node.(DataFlow::CfgNode).getNode().(Cfg::NameNode).getId() = "arg" + argNumber
|
||||
}
|
||||
|
||||
predicate isSource(DataFlow::Node node) { isArgSource(node, _) }
|
||||
|
||||
additional predicate isGoodSink(DataFlow::Node node, ArgNumber argNumber) {
|
||||
exists(CallNode call |
|
||||
call.getFunction().(NameNode).getId() = "SINK" + argNumber and
|
||||
exists(Cfg::CallNode call |
|
||||
call.getFunction().(Cfg::NameNode).getId() = "SINK" + argNumber and
|
||||
node.(DataFlow::CfgNode).getNode() = call.getAnArg()
|
||||
)
|
||||
}
|
||||
|
||||
additional predicate isBadSink(DataFlow::Node node, ArgNumber argNumber) {
|
||||
exists(CallNode call |
|
||||
call.getFunction().(NameNode).getId() = "SINK" + argNumber + "_F" and
|
||||
exists(Cfg::CallNode call |
|
||||
call.getFunction().(Cfg::NameNode).getId() = "SINK" + argNumber + "_F" and
|
||||
node.(DataFlow::CfgNode).getNode() = call.getAnArg()
|
||||
)
|
||||
}
|
||||
@@ -60,17 +62,17 @@ module ArgumentRoutingFlow = DataFlow::Global<ArgumentRoutingConfig>;
|
||||
|
||||
module Argument1ExtraRoutingConfig implements DataFlow::ConfigSig {
|
||||
predicate isSource(DataFlow::Node node) {
|
||||
exists(AssignmentDefinition def, DataFlow::CallCfgNode call |
|
||||
exists(SsaImpl::AssignmentDefinition def, DataFlow::CallCfgNode call |
|
||||
def.getDefiningNode() = node.(DataFlow::CfgNode).getNode() and
|
||||
def.getValue() = call.getNode() and
|
||||
call.getFunction().asCfgNode().(NameNode).getId().matches("With\\_%")
|
||||
call.getFunction().asCfgNode().(Cfg::NameNode).getId().matches("With\\_%")
|
||||
) and
|
||||
node.(DataFlow::CfgNode).getNode().(NameNode).getId().matches("with\\_%")
|
||||
node.(DataFlow::CfgNode).getNode().(Cfg::NameNode).getId().matches("with\\_%")
|
||||
}
|
||||
|
||||
predicate isSink(DataFlow::Node node) {
|
||||
exists(CallNode call |
|
||||
call.getFunction().(NameNode).getId() = "SINK1" and
|
||||
exists(Cfg::CallNode call |
|
||||
call.getFunction().(Cfg::NameNode).getId() = "SINK1" and
|
||||
node.(DataFlow::CfgNode).getNode() = call.getAnArg()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
| test.py:41:1:41:33 | Entry definition for SsaSourceVariable NONSOURCE | test.py:42:10:42:18 | ControlFlowNode for NONSOURCE |
|
||||
| test.py:41:1:41:33 | Entry definition for SsaSourceVariable SINK | test.py:44:5:44:8 | ControlFlowNode for SINK |
|
||||
| test.py:41:1:41:33 | Entry definition for SsaSourceVariable SOURCE | test.py:42:21:42:26 | ControlFlowNode for SOURCE |
|
||||
| test.py:42:5:42:5 | ControlFlowNode for x | test.py:43:9:43:9 | ControlFlowNode for x |
|
||||
| test.py:42:10:42:26 | ControlFlowNode for Tuple | test.py:42:5:42:5 | ControlFlowNode for x |
|
||||
| test.py:43:5:43:5 | ControlFlowNode for y | test.py:44:10:44:10 | ControlFlowNode for y |
|
||||
| test.py:43:9:43:12 | ControlFlowNode for Subscript | test.py:43:5:43:5 | ControlFlowNode for y |
|
||||
| test.py:208:1:208:53 | Entry definition for SsaSourceVariable SINK | test.py:210:5:210:8 | ControlFlowNode for SINK |
|
||||
| test.py:208:1:208:53 | Entry definition for SsaSourceVariable SOURCE | test.py:209:25:209:30 | ControlFlowNode for SOURCE |
|
||||
| test.py:209:5:209:5 | ControlFlowNode for x | test.py:210:10:210:10 | ControlFlowNode for x |
|
||||
| test.py:209:9:209:68 | ControlFlowNode for ListComp | test.py:209:5:209:5 | ControlFlowNode for x |
|
||||
| test.py:41:1:41:33 | Entry definition for Global Variable NONSOURCE | test.py:42:10:42:18 | NONSOURCE |
|
||||
| test.py:41:1:41:33 | Entry definition for Global Variable SINK | test.py:44:5:44:8 | SINK |
|
||||
| test.py:41:1:41:33 | Entry definition for Global Variable SOURCE | test.py:42:21:42:26 | SOURCE |
|
||||
| test.py:42:5:42:5 | x | test.py:43:9:43:9 | x |
|
||||
| test.py:42:10:42:26 | After Tuple | test.py:42:5:42:5 | x |
|
||||
| test.py:43:5:43:5 | y | test.py:44:10:44:10 | y |
|
||||
| test.py:43:9:43:12 | After Subscript | test.py:43:5:43:5 | y |
|
||||
| test.py:208:1:208:53 | Entry definition for Global Variable SINK | test.py:210:5:210:8 | SINK |
|
||||
| test.py:208:1:208:53 | Entry definition for Global Variable SOURCE | test.py:209:25:209:30 | SOURCE |
|
||||
| test.py:209:5:209:5 | x | test.py:210:10:210:10 | x |
|
||||
| test.py:209:9:209:68 | After ListComp | test.py:209:5:209:5 | x |
|
||||
|
||||
@@ -844,7 +844,7 @@ def return_from_inner_scope(x):
|
||||
return SOURCE
|
||||
|
||||
def test_return_from_inner_scope():
|
||||
SINK(return_from_inner_scope([])) # $ flow="SOURCE, l:-3 -> return_from_inner_scope(..)"
|
||||
SINK(return_from_inner_scope([])) # $ MISSING: flow="SOURCE, l:-3 -> return_from_inner_scope(..)"
|
||||
|
||||
|
||||
# Inspired by reverse read inconsistency check
|
||||
|
||||
@@ -1,31 +1,41 @@
|
||||
def_count
|
||||
| 4 |
|
||||
def
|
||||
| def_use_flow.py:10:5:10:5 | Essa node definition |
|
||||
| def_use_flow.py:17:11:17:11 | Essa node definition |
|
||||
| def_use_flow.py:19:9:19:9 | Essa node definition |
|
||||
| def_use_flow.py:21:7:21:7 | Essa node definition |
|
||||
| def_use_flow.py:10:5:10:5 | SSA def(Local Variable x) |
|
||||
| def_use_flow.py:17:11:17:11 | SSA def(Local Variable x) |
|
||||
| def_use_flow.py:19:9:19:9 | SSA def(Local Variable x) |
|
||||
| def_use_flow.py:21:7:21:7 | SSA def(Local Variable x) |
|
||||
implicit_use_count
|
||||
| 0 |
|
||||
| 1 |
|
||||
implicit_use
|
||||
| def_use_flow.py:9:1:9:12 | Normal Exit |
|
||||
source_use_count
|
||||
| 3 |
|
||||
source_use
|
||||
| def_use_flow.py:28:15:28:15 | ControlFlowNode for x |
|
||||
| def_use_flow.py:30:13:30:13 | ControlFlowNode for x |
|
||||
| def_use_flow.py:32:11:32:11 | ControlFlowNode for x |
|
||||
| def_use_flow.py:28:15:28:15 | x |
|
||||
| def_use_flow.py:30:13:30:13 | x |
|
||||
| def_use_flow.py:32:11:32:11 | x |
|
||||
def_use_edge_count
|
||||
| 12 |
|
||||
| 21 |
|
||||
def_use_edge
|
||||
| def_use_flow.py:10:5:10:5 | SSA variable x | def_use_flow.py:28:15:28:15 | ControlFlowNode for x |
|
||||
| def_use_flow.py:10:5:10:5 | SSA variable x | def_use_flow.py:30:13:30:13 | ControlFlowNode for x |
|
||||
| def_use_flow.py:10:5:10:5 | SSA variable x | def_use_flow.py:32:11:32:11 | ControlFlowNode for x |
|
||||
| def_use_flow.py:17:11:17:11 | SSA variable x | def_use_flow.py:28:15:28:15 | ControlFlowNode for x |
|
||||
| def_use_flow.py:17:11:17:11 | SSA variable x | def_use_flow.py:30:13:30:13 | ControlFlowNode for x |
|
||||
| def_use_flow.py:17:11:17:11 | SSA variable x | def_use_flow.py:32:11:32:11 | ControlFlowNode for x |
|
||||
| def_use_flow.py:19:9:19:9 | SSA variable x | def_use_flow.py:28:15:28:15 | ControlFlowNode for x |
|
||||
| def_use_flow.py:19:9:19:9 | SSA variable x | def_use_flow.py:30:13:30:13 | ControlFlowNode for x |
|
||||
| def_use_flow.py:19:9:19:9 | SSA variable x | def_use_flow.py:32:11:32:11 | ControlFlowNode for x |
|
||||
| def_use_flow.py:21:7:21:7 | SSA variable x | def_use_flow.py:28:15:28:15 | ControlFlowNode for x |
|
||||
| def_use_flow.py:21:7:21:7 | SSA variable x | def_use_flow.py:30:13:30:13 | ControlFlowNode for x |
|
||||
| def_use_flow.py:21:7:21:7 | SSA variable x | def_use_flow.py:32:11:32:11 | ControlFlowNode for x |
|
||||
| def_use_flow.py:10:5:10:5 | SSA def(Local Variable x) | def_use_flow.py:28:15:28:15 | x |
|
||||
| def_use_flow.py:10:5:10:5 | SSA def(Local Variable x) | def_use_flow.py:30:13:30:13 | x |
|
||||
| def_use_flow.py:10:5:10:5 | SSA def(Local Variable x) | def_use_flow.py:32:11:32:11 | x |
|
||||
| def_use_flow.py:12:5:12:17 | SSA phi(Local Variable x) | def_use_flow.py:28:15:28:15 | x |
|
||||
| def_use_flow.py:12:5:12:17 | SSA phi(Local Variable x) | def_use_flow.py:30:13:30:13 | x |
|
||||
| def_use_flow.py:12:5:12:17 | SSA phi(Local Variable x) | def_use_flow.py:32:11:32:11 | x |
|
||||
| def_use_flow.py:13:7:13:19 | SSA phi(Local Variable x) | def_use_flow.py:28:15:28:15 | x |
|
||||
| def_use_flow.py:13:7:13:19 | SSA phi(Local Variable x) | def_use_flow.py:30:13:30:13 | x |
|
||||
| def_use_flow.py:13:7:13:19 | SSA phi(Local Variable x) | def_use_flow.py:32:11:32:11 | x |
|
||||
| def_use_flow.py:14:9:14:21 | SSA phi(Local Variable x) | def_use_flow.py:28:15:28:15 | x |
|
||||
| def_use_flow.py:14:9:14:21 | SSA phi(Local Variable x) | def_use_flow.py:30:13:30:13 | x |
|
||||
| def_use_flow.py:14:9:14:21 | SSA phi(Local Variable x) | def_use_flow.py:32:11:32:11 | x |
|
||||
| def_use_flow.py:17:11:17:11 | SSA def(Local Variable x) | def_use_flow.py:28:15:28:15 | x |
|
||||
| def_use_flow.py:17:11:17:11 | SSA def(Local Variable x) | def_use_flow.py:30:13:30:13 | x |
|
||||
| def_use_flow.py:17:11:17:11 | SSA def(Local Variable x) | def_use_flow.py:32:11:32:11 | x |
|
||||
| def_use_flow.py:19:9:19:9 | SSA def(Local Variable x) | def_use_flow.py:28:15:28:15 | x |
|
||||
| def_use_flow.py:19:9:19:9 | SSA def(Local Variable x) | def_use_flow.py:30:13:30:13 | x |
|
||||
| def_use_flow.py:19:9:19:9 | SSA def(Local Variable x) | def_use_flow.py:32:11:32:11 | x |
|
||||
| def_use_flow.py:21:7:21:7 | SSA def(Local Variable x) | def_use_flow.py:28:15:28:15 | x |
|
||||
| def_use_flow.py:21:7:21:7 | SSA def(Local Variable x) | def_use_flow.py:30:13:30:13 | x |
|
||||
| def_use_flow.py:21:7:21:7 | SSA def(Local Variable x) | def_use_flow.py:32:11:32:11 | x |
|
||||
|
||||
@@ -1,36 +1,38 @@
|
||||
import python
|
||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
||||
private import semmle.python.dataflow.new.internal.SsaImpl as SsaImpl
|
||||
private import semmle.python.dataflow.new.internal.DataFlowPrivate
|
||||
|
||||
query int def_count() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" |
|
||||
result = count(EssaNodeDefinition def | def.getSourceVariable() = x)
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" |
|
||||
result = count(SsaImpl::EssaNodeDefinition def | def.getSourceVariable() = x)
|
||||
)
|
||||
}
|
||||
|
||||
query EssaNodeDefinition def() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" | result.getSourceVariable() = x)
|
||||
query SsaImpl::EssaNodeDefinition def() {
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" | result.getSourceVariable() = x)
|
||||
}
|
||||
|
||||
query int implicit_use_count() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" | result = count(x.getAnImplicitUse()))
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" | result = count(x.getAnImplicitUse()))
|
||||
}
|
||||
|
||||
query ControlFlowNode implicit_use() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" | result = x.getAnImplicitUse())
|
||||
query Cfg::ControlFlowNode implicit_use() {
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" | result = x.getAnImplicitUse())
|
||||
}
|
||||
|
||||
query int source_use_count() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" | result = count(x.getASourceUse()))
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" | result = count(x.getASourceUse()))
|
||||
}
|
||||
|
||||
query ControlFlowNode source_use() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" | result = x.getASourceUse())
|
||||
query Cfg::ControlFlowNode source_use() {
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" | result = x.getASourceUse())
|
||||
}
|
||||
|
||||
query int def_use_edge_count() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" |
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" |
|
||||
result =
|
||||
count(EssaVariable v, NameNode use |
|
||||
count(SsaImpl::EssaVariable v, Cfg::NameNode use |
|
||||
v.getSourceVariable() = x and
|
||||
use = x.getAUse() and
|
||||
LocalFlow::defToFirstUse(v, use)
|
||||
@@ -38,8 +40,8 @@ query int def_use_edge_count() {
|
||||
)
|
||||
}
|
||||
|
||||
query predicate def_use_edge(EssaVariable v, NameNode use) {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" |
|
||||
query predicate def_use_edge(SsaImpl::EssaVariable v, Cfg::NameNode use) {
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" |
|
||||
v.getSourceVariable() = x and
|
||||
use = x.getAUse() and
|
||||
LocalFlow::defToFirstUse(v, use)
|
||||
|
||||
@@ -1,24 +1,25 @@
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:1:1:1:3 | ControlFlowNode for wat |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:1:7:1:7 | ControlFlowNode for IntegerLiteral |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:3:1:3:10 | ControlFlowNode for ClassExpr |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:3:7:3:9 | ControlFlowNode for Wat |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:4:5:4:7 | ControlFlowNode for wat |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:4:11:4:11 | ControlFlowNode for IntegerLiteral |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:5:5:5:9 | ControlFlowNode for print |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:5:5:5:26 | ControlFlowNode for print() |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:5:11:5:20 | ControlFlowNode for StringLiteral |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:5:23:5:25 | ControlFlowNode for wat |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:7:1:7:5 | ControlFlowNode for print |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:7:1:7:23 | ControlFlowNode for print() |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:7:7:7:17 | ControlFlowNode for StringLiteral |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:7:20:7:22 | ControlFlowNode for wat |
|
||||
| generator.py:0:0:0:0 | Module generator | generator.py:1:1:1:23 | ControlFlowNode for FunctionExpr |
|
||||
| generator.py:0:0:0:0 | Module generator | generator.py:1:5:1:18 | ControlFlowNode for generator_func |
|
||||
| generator.py:1:1:1:23 | Function generator_func | generator.py:1:20:1:21 | ControlFlowNode for xs |
|
||||
| generator.py:1:1:1:23 | Function generator_func | generator.py:2:12:2:26 | ControlFlowNode for ListComp |
|
||||
| generator.py:1:1:1:23 | Function generator_func | generator.py:2:24:2:25 | ControlFlowNode for xs |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:12:2:26 | ControlFlowNode for .0 |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:12:2:26 | ControlFlowNode for .0 |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:13:2:13 | ControlFlowNode for Yield |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:13:2:13 | ControlFlowNode for x |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:19:2:19 | ControlFlowNode for x |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:1:1:1:3 | wat |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:1:7:1:7 | IntegerLiteral |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:3:1:3:10 | ClassExpr |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:3:7:3:9 | Wat |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:4:5:4:7 | wat |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:4:11:4:11 | IntegerLiteral |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:5:5:5:9 | print |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:5:5:5:26 | After print() |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:5:11:5:20 | StringLiteral |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:5:23:5:25 | wat |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:7:1:7:5 | print |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:7:1:7:23 | After print() |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:7:7:7:17 | StringLiteral |
|
||||
| class_example.py:0:0:0:0 | Module class_example | class_example.py:7:20:7:22 | wat |
|
||||
| generator.py:0:0:0:0 | Module generator | generator.py:1:1:1:23 | FunctionExpr |
|
||||
| generator.py:0:0:0:0 | Module generator | generator.py:1:5:1:18 | generator_func |
|
||||
| generator.py:1:1:1:23 | Function generator_func | generator.py:1:20:1:21 | xs |
|
||||
| generator.py:1:1:1:23 | Function generator_func | generator.py:2:12:2:26 | After ListComp |
|
||||
| generator.py:1:1:1:23 | Function generator_func | generator.py:2:24:2:25 | xs |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:12:2:26 | .0 |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:12:2:26 | After .0 [empty] |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:12:2:26 | After .0 [non-empty] |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:13:2:13 | After Yield |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:13:2:13 | x |
|
||||
| generator.py:2:12:2:26 | Function listcomp | generator.py:2:19:2:19 | x |
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
| test.py:4:17:4:60 | ControlFlowNode for Attribute() | Unexpected result: unresolved_call=os.path.dirname(..) |
|
||||
| test.py:4:33:4:59 | ControlFlowNode for Attribute() | Unexpected result: unresolved_call=os.path.dirname(..) |
|
||||
| test_dict.py:4:17:4:60 | ControlFlowNode for Attribute() | Unexpected result: unresolved_call=os.path.dirname(..) |
|
||||
| test_dict.py:4:33:4:59 | ControlFlowNode for Attribute() | Unexpected result: unresolved_call=os.path.dirname(..) |
|
||||
| test.py:4:17:4:60 | After Attribute() | Unexpected result: unresolved_call=os.path.dirname(..) |
|
||||
| test.py:4:33:4:59 | After Attribute() | Unexpected result: unresolved_call=os.path.dirname(..) |
|
||||
| test_dict.py:4:17:4:60 | After Attribute() | Unexpected result: unresolved_call=os.path.dirname(..) |
|
||||
| test_dict.py:4:33:4:59 | After Attribute() | Unexpected result: unresolved_call=os.path.dirname(..) |
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import python
|
||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
||||
import utils.test.dataflow.UnresolvedCalls
|
||||
private import semmle.python.dataflow.new.DataFlow
|
||||
|
||||
module IgnoreDictMethod implements UnresolvedCallExpectationsSig {
|
||||
predicate unresolvedCall(CallNode call) {
|
||||
predicate unresolvedCall(Cfg::CallNode call) {
|
||||
DefaultUnresolvedCallExpectations::unresolvedCall(call) and
|
||||
not any(DataFlow::MethodCallNode methodCall |
|
||||
methodCall.getMethodName() in ["get", "setdefault"]
|
||||
|
||||
@@ -17,7 +17,7 @@ print(unreferenced_g)
|
||||
|
||||
# Modification by reassignment
|
||||
|
||||
g_mod = []
|
||||
g_mod = [] # $ SPURIOUS: writes=g_mod
|
||||
# This assignment does not produce any flow, since `g_mod` is immediately reassigned.
|
||||
|
||||
# The following assignment should not be a `ModuleVariableNode`,
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
| test3.py:1:17:1:19 | ControlFlowNode for ImportMember | test3.py:1:17:1:19 | ControlFlowNode for foo |
|
||||
| test3.py:1:17:1:19 | ControlFlowNode for ImportMember | test3.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| test3.py:1:17:1:19 | ControlFlowNode for foo | test3.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| three.py:1:1:1:3 | ControlFlowNode for foo | test1.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| three.py:1:1:1:3 | ControlFlowNode for foo | test3.py:1:17:1:19 | ControlFlowNode for ImportMember |
|
||||
| three.py:1:1:1:3 | ControlFlowNode for foo | test3.py:1:17:1:19 | ControlFlowNode for foo |
|
||||
| three.py:1:1:1:3 | ControlFlowNode for foo | test3.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| three.py:1:1:1:3 | ControlFlowNode for foo | two.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| three.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | test1.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| three.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | test3.py:1:17:1:19 | ControlFlowNode for ImportMember |
|
||||
| three.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | test3.py:1:17:1:19 | ControlFlowNode for foo |
|
||||
| three.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | test3.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| three.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | three.py:1:1:1:3 | ControlFlowNode for foo |
|
||||
| three.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | two.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| trois.py:1:1:1:3 | ControlFlowNode for foo | deux.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| trois.py:1:1:1:3 | ControlFlowNode for foo | test2.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| trois.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | deux.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| trois.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | test2.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| trois.py:1:7:1:7 | ControlFlowNode for IntegerLiteral | trois.py:1:1:1:3 | ControlFlowNode for foo |
|
||||
| two.py:2:7:2:9 | ControlFlowNode for foo | test3.py:1:17:1:19 | ControlFlowNode for ImportMember |
|
||||
| two.py:2:7:2:9 | ControlFlowNode for foo | test3.py:1:17:1:19 | ControlFlowNode for foo |
|
||||
| two.py:2:7:2:9 | ControlFlowNode for foo | test3.py:2:7:2:9 | ControlFlowNode for foo |
|
||||
| test3.py:1:17:1:19 | After ImportMember | test3.py:1:17:1:19 | foo |
|
||||
| test3.py:1:17:1:19 | After ImportMember | test3.py:2:7:2:9 | foo |
|
||||
| test3.py:1:17:1:19 | foo | test3.py:2:7:2:9 | foo |
|
||||
| three.py:1:1:1:3 | foo | test1.py:2:7:2:9 | foo |
|
||||
| three.py:1:1:1:3 | foo | test3.py:1:17:1:19 | After ImportMember |
|
||||
| three.py:1:1:1:3 | foo | test3.py:1:17:1:19 | foo |
|
||||
| three.py:1:1:1:3 | foo | test3.py:2:7:2:9 | foo |
|
||||
| three.py:1:1:1:3 | foo | two.py:2:7:2:9 | foo |
|
||||
| three.py:1:7:1:7 | IntegerLiteral | test1.py:2:7:2:9 | foo |
|
||||
| three.py:1:7:1:7 | IntegerLiteral | test3.py:1:17:1:19 | After ImportMember |
|
||||
| three.py:1:7:1:7 | IntegerLiteral | test3.py:1:17:1:19 | foo |
|
||||
| three.py:1:7:1:7 | IntegerLiteral | test3.py:2:7:2:9 | foo |
|
||||
| three.py:1:7:1:7 | IntegerLiteral | three.py:1:1:1:3 | foo |
|
||||
| three.py:1:7:1:7 | IntegerLiteral | two.py:2:7:2:9 | foo |
|
||||
| trois.py:1:1:1:3 | foo | deux.py:2:7:2:9 | foo |
|
||||
| trois.py:1:1:1:3 | foo | test2.py:2:7:2:9 | foo |
|
||||
| trois.py:1:7:1:7 | IntegerLiteral | deux.py:2:7:2:9 | foo |
|
||||
| trois.py:1:7:1:7 | IntegerLiteral | test2.py:2:7:2:9 | foo |
|
||||
| trois.py:1:7:1:7 | IntegerLiteral | trois.py:1:1:1:3 | foo |
|
||||
| two.py:2:7:2:9 | foo | test3.py:1:17:1:19 | After ImportMember |
|
||||
| two.py:2:7:2:9 | foo | test3.py:1:17:1:19 | foo |
|
||||
| two.py:2:7:2:9 | foo | test3.py:2:7:2:9 | foo |
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
conjunctive_lookup
|
||||
| test.py:6:1:6:6 | ControlFlowNode for meth() | meth() | obj1 | bar |
|
||||
| test.py:6:1:6:6 | ControlFlowNode for meth() | meth() | obj1 | foo |
|
||||
| test.py:6:1:6:6 | ControlFlowNode for meth() | meth() | obj2 | bar |
|
||||
| test.py:6:1:6:6 | ControlFlowNode for meth() | meth() | obj2 | foo |
|
||||
| test.py:6:1:6:6 | After meth() | meth() | obj1 | bar |
|
||||
| test.py:6:1:6:6 | After meth() | meth() | obj1 | foo |
|
||||
| test.py:6:1:6:6 | After meth() | meth() | obj2 | bar |
|
||||
| test.py:6:1:6:6 | After meth() | meth() | obj2 | foo |
|
||||
calls_lookup
|
||||
| test.py:6:1:6:6 | ControlFlowNode for meth() | meth() | obj1 | foo |
|
||||
| test.py:6:1:6:6 | ControlFlowNode for meth() | meth() | obj2 | bar |
|
||||
| test.py:6:1:6:6 | After meth() | meth() | obj1 | foo |
|
||||
| test.py:6:1:6:6 | After meth() | meth() | obj2 | bar |
|
||||
|
||||
@@ -3,6 +3,7 @@ import python
|
||||
import utils.test.dataflow.FlowTest
|
||||
private import semmle.python.dataflow.new.internal.PrintNode
|
||||
private import semmle.python.dataflow.new.internal.DataFlowPrivate as DP
|
||||
private import semmle.python.dataflow.new.internal.SsaImpl as SsaImpl
|
||||
|
||||
module ImportTimeLocalFlowTest implements FlowTestSig {
|
||||
string flowTag() { result = "importTimeFlow" }
|
||||
@@ -11,8 +12,9 @@ module ImportTimeLocalFlowTest implements FlowTestSig {
|
||||
nodeFrom.getLocation().getFile().getBaseName() = "multiphase.py" and
|
||||
// results are displayed next to `nodeTo`, so we need a line to write on
|
||||
nodeTo.getLocation().getStartLine() > 0 and
|
||||
exists(GlobalSsaVariable g |
|
||||
nodeTo.asCfgNode() = g.getDefinition().(EssaNodeDefinition).getDefiningNode()
|
||||
exists(SsaImpl::EssaVariable g |
|
||||
g.getSourceVariable().getVariable() instanceof GlobalVariable and
|
||||
nodeTo.asCfgNode() = g.getDefinition().(SsaImpl::EssaNodeDefinition).getDefiningNode()
|
||||
) and
|
||||
// nodeTo.asVar() instanceof GlobalSsaVariable and
|
||||
DP::PhaseDependentFlow<DP::LocalFlow::localFlowStep/2>::importTimeStep(nodeFrom, nodeTo)
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
| test.py:126:13:126:25 | ControlFlowNode for CUSTOM_SOURCE | test.py:130:21:130:21 | ControlFlowNode for t |
|
||||
| test.py:126:13:126:25 | CUSTOM_SOURCE | test.py:130:21:130:21 | t |
|
||||
| test.py:136:13:136:25 | CUSTOM_SOURCE | test.py:140:23:140:23 | t |
|
||||
|
||||
@@ -8,14 +8,15 @@
|
||||
*/
|
||||
|
||||
import python
|
||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
||||
import semmle.python.dataflow.new.DataFlow
|
||||
|
||||
module CustomTestConfig implements DataFlow::ConfigSig {
|
||||
predicate isSource(DataFlow::Node node) { node.asCfgNode().(NameNode).getId() = "CUSTOM_SOURCE" }
|
||||
predicate isSource(DataFlow::Node node) { node.asCfgNode().(Cfg::NameNode).getId() = "CUSTOM_SOURCE" }
|
||||
|
||||
predicate isSink(DataFlow::Node node) {
|
||||
exists(CallNode call |
|
||||
call.getFunction().(NameNode).getId() in ["CUSTOM_SINK", "CUSTOM_SINK_F"] and
|
||||
exists(Cfg::CallNode call |
|
||||
call.getFunction().(Cfg::NameNode).getId() in ["CUSTOM_SINK", "CUSTOM_SINK_F"] and
|
||||
node.asCfgNode() = call.getAnArg()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,26 +1,28 @@
|
||||
| module.py:1:13:1:18 | ControlFlowNode for SOURCE | test.py:89:10:89:10 | ControlFlowNode for t |
|
||||
| module.py:1:13:1:18 | ControlFlowNode for SOURCE | test.py:106:10:106:14 | ControlFlowNode for Attribute |
|
||||
| module.py:1:13:1:18 | ControlFlowNode for SOURCE | test.py:111:10:111:12 | ControlFlowNode for Attribute |
|
||||
| module.py:1:13:1:18 | ControlFlowNode for SOURCE | test.py:156:6:156:11 | ControlFlowNode for unsafe |
|
||||
| module.py:6:12:6:17 | ControlFlowNode for SOURCE | test.py:101:10:101:10 | ControlFlowNode for t |
|
||||
| test.py:3:10:3:15 | ControlFlowNode for SOURCE | test.py:3:10:3:15 | ControlFlowNode for SOURCE |
|
||||
| test.py:6:9:6:14 | ControlFlowNode for SOURCE | test.py:7:10:7:10 | ControlFlowNode for s |
|
||||
| test.py:10:12:10:17 | ControlFlowNode for SOURCE | test.py:13:10:13:12 | ControlFlowNode for arg |
|
||||
| test.py:10:12:10:17 | ControlFlowNode for SOURCE | test.py:17:10:17:10 | ControlFlowNode for t |
|
||||
| test.py:20:9:20:14 | ControlFlowNode for SOURCE | test.py:13:10:13:12 | ControlFlowNode for arg |
|
||||
| test.py:37:13:37:18 | ControlFlowNode for SOURCE | test.py:41:14:41:14 | ControlFlowNode for t |
|
||||
| test.py:62:13:62:18 | ControlFlowNode for SOURCE | test.py:13:10:13:12 | ControlFlowNode for arg |
|
||||
| test.py:67:13:67:18 | ControlFlowNode for SOURCE | test.py:13:10:13:12 | ControlFlowNode for arg |
|
||||
| test.py:76:9:76:14 | ControlFlowNode for SOURCE | test.py:78:10:78:10 | ControlFlowNode for t |
|
||||
| test.py:128:13:128:18 | ControlFlowNode for SOURCE | test.py:132:14:132:14 | ControlFlowNode for t |
|
||||
| test.py:159:10:159:15 | ControlFlowNode for SOURCE | test.py:160:14:160:14 | ControlFlowNode for t |
|
||||
| test.py:163:9:163:14 | ControlFlowNode for SOURCE | test.py:165:12:165:12 | ControlFlowNode for s |
|
||||
| test.py:178:9:178:14 | ControlFlowNode for SOURCE | test.py:180:14:180:14 | ControlFlowNode for t |
|
||||
| test.py:178:9:178:14 | ControlFlowNode for SOURCE | test.py:182:16:182:16 | ControlFlowNode for t |
|
||||
| test.py:178:9:178:14 | ControlFlowNode for SOURCE | test.py:184:16:184:16 | ControlFlowNode for t |
|
||||
| test.py:178:9:178:14 | ControlFlowNode for SOURCE | test.py:186:14:186:14 | ControlFlowNode for t |
|
||||
| test.py:195:9:195:14 | ControlFlowNode for SOURCE | test.py:197:14:197:14 | ControlFlowNode for t |
|
||||
| test.py:195:9:195:14 | ControlFlowNode for SOURCE | test.py:199:14:199:14 | ControlFlowNode for t |
|
||||
| test.py:202:10:202:15 | ControlFlowNode for SOURCE | test.py:204:14:204:14 | ControlFlowNode for i |
|
||||
| test.py:202:10:202:15 | ControlFlowNode for SOURCE | test.py:205:10:205:10 | ControlFlowNode for i |
|
||||
| test.py:208:12:208:17 | ControlFlowNode for SOURCE | test.py:214:14:214:14 | ControlFlowNode for x |
|
||||
| module.py:1:13:1:18 | SOURCE | test.py:89:10:89:10 | t |
|
||||
| module.py:1:13:1:18 | SOURCE | test.py:106:10:106:14 | After Attribute |
|
||||
| module.py:1:13:1:18 | SOURCE | test.py:111:10:111:12 | After Attribute |
|
||||
| module.py:1:13:1:18 | SOURCE | test.py:156:6:156:11 | unsafe |
|
||||
| module.py:6:12:6:17 | SOURCE | test.py:101:10:101:10 | t |
|
||||
| test.py:3:10:3:15 | SOURCE | test.py:3:10:3:15 | SOURCE |
|
||||
| test.py:6:9:6:14 | SOURCE | test.py:7:10:7:10 | s |
|
||||
| test.py:10:12:10:17 | SOURCE | test.py:13:10:13:12 | arg |
|
||||
| test.py:10:12:10:17 | SOURCE | test.py:17:10:17:10 | t |
|
||||
| test.py:20:9:20:14 | SOURCE | test.py:13:10:13:12 | arg |
|
||||
| test.py:31:13:31:18 | SOURCE | test.py:33:16:33:16 | t |
|
||||
| test.py:37:13:37:18 | SOURCE | test.py:41:14:41:14 | t |
|
||||
| test.py:62:13:62:18 | SOURCE | test.py:13:10:13:12 | arg |
|
||||
| test.py:67:13:67:18 | SOURCE | test.py:13:10:13:12 | arg |
|
||||
| test.py:76:9:76:14 | SOURCE | test.py:78:10:78:10 | t |
|
||||
| test.py:128:13:128:18 | SOURCE | test.py:132:14:132:14 | t |
|
||||
| test.py:138:13:138:18 | SOURCE | test.py:142:16:142:16 | t |
|
||||
| test.py:159:10:159:15 | SOURCE | test.py:160:14:160:14 | t |
|
||||
| test.py:163:9:163:14 | SOURCE | test.py:165:12:165:12 | s |
|
||||
| test.py:178:9:178:14 | SOURCE | test.py:180:14:180:14 | t |
|
||||
| test.py:178:9:178:14 | SOURCE | test.py:182:16:182:16 | t |
|
||||
| test.py:178:9:178:14 | SOURCE | test.py:184:16:184:16 | t |
|
||||
| test.py:178:9:178:14 | SOURCE | test.py:186:14:186:14 | t |
|
||||
| test.py:195:9:195:14 | SOURCE | test.py:197:14:197:14 | t |
|
||||
| test.py:195:9:195:14 | SOURCE | test.py:199:14:199:14 | t |
|
||||
| test.py:202:10:202:15 | SOURCE | test.py:204:14:204:14 | i |
|
||||
| test.py:202:10:202:15 | SOURCE | test.py:205:10:205:10 | i |
|
||||
| test.py:208:12:208:17 | SOURCE | test.py:214:14:214:14 | x |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
os_import
|
||||
| test.py:2:8:2:9 | ControlFlowNode for os |
|
||||
| test.py:2:8:2:9 | os |
|
||||
flowstep
|
||||
jumpStep
|
||||
| test.py:2:8:2:9 | ControlFlowNode for os | test.py:0:0:0:0 | ModuleVariableNode in Module test for os |
|
||||
| test.py:2:8:2:9 | os | test.py:0:0:0:0 | ModuleVariableNode in Module test for os |
|
||||
essaFlowStep
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import python
|
||||
import semmle.python.dataflow.new.DataFlow
|
||||
private import semmle.python.dataflow.new.internal.DataFlowPrivate as DataFlowPrivate
|
||||
private import semmle.python.dataflow.new.internal.SsaImpl as SsaImpl
|
||||
|
||||
/** Gets the `CfgNode` that holds the module imported by the fully qualified module name `name`. */
|
||||
DataFlow::CfgNode module_import(string name) {
|
||||
exists(Variable var, AssignmentDefinition def, Import imp, Alias alias |
|
||||
var = def.getSourceVariable() and
|
||||
exists(Variable var, SsaImpl::AssignmentDefinition def, Import imp, Alias alias |
|
||||
var = def.getSourceVariable().getVariable() and
|
||||
result.getNode() = def.getDefiningNode() and
|
||||
alias = imp.getAName() and
|
||||
alias.getAsname() = var.getAStore()
|
||||
|
||||
@@ -1,114 +1,114 @@
|
||||
edges
|
||||
| summaries.py:32:1:32:7 | ControlFlowNode for tainted | summaries.py:33:6:33:12 | ControlFlowNode for tainted | provenance | |
|
||||
| summaries.py:32:11:32:26 | ControlFlowNode for identity() | summaries.py:32:1:32:7 | ControlFlowNode for tainted | provenance | |
|
||||
| summaries.py:32:20:32:25 | ControlFlowNode for SOURCE | summaries.py:32:11:32:26 | ControlFlowNode for identity() | provenance | identity |
|
||||
| summaries.py:36:1:36:14 | ControlFlowNode for tainted_lambda | summaries.py:37:6:37:19 | ControlFlowNode for tainted_lambda | provenance | |
|
||||
| summaries.py:36:18:36:54 | ControlFlowNode for apply_lambda() | summaries.py:36:1:36:14 | ControlFlowNode for tainted_lambda | provenance | |
|
||||
| summaries.py:36:38:36:38 | ControlFlowNode for x | summaries.py:36:41:36:45 | ControlFlowNode for BinaryExpr | provenance | |
|
||||
| summaries.py:36:48:36:53 | ControlFlowNode for SOURCE | summaries.py:36:18:36:54 | ControlFlowNode for apply_lambda() | provenance | apply_lambda |
|
||||
| summaries.py:36:48:36:53 | ControlFlowNode for SOURCE | summaries.py:36:38:36:38 | ControlFlowNode for x | provenance | apply_lambda |
|
||||
| summaries.py:44:1:44:12 | ControlFlowNode for tainted_list | summaries.py:45:6:45:20 | ControlFlowNode for Subscript | provenance | |
|
||||
| summaries.py:44:1:44:12 | ControlFlowNode for tainted_list [List element] | summaries.py:45:6:45:17 | ControlFlowNode for tainted_list [List element] | provenance | |
|
||||
| summaries.py:44:16:44:33 | ControlFlowNode for reversed() | summaries.py:44:1:44:12 | ControlFlowNode for tainted_list | provenance | |
|
||||
| summaries.py:44:16:44:33 | ControlFlowNode for reversed() [List element] | summaries.py:44:1:44:12 | ControlFlowNode for tainted_list [List element] | provenance | |
|
||||
| summaries.py:44:25:44:32 | ControlFlowNode for List | summaries.py:44:16:44:33 | ControlFlowNode for reversed() | provenance | builtins.reversed |
|
||||
| summaries.py:44:25:44:32 | ControlFlowNode for List [List element] | summaries.py:44:16:44:33 | ControlFlowNode for reversed() [List element] | provenance | builtins.reversed |
|
||||
| summaries.py:44:26:44:31 | ControlFlowNode for SOURCE | summaries.py:44:25:44:32 | ControlFlowNode for List | provenance | |
|
||||
| summaries.py:44:26:44:31 | ControlFlowNode for SOURCE | summaries.py:44:25:44:32 | ControlFlowNode for List [List element] | provenance | |
|
||||
| summaries.py:45:6:45:17 | ControlFlowNode for tainted_list [List element] | summaries.py:45:6:45:20 | ControlFlowNode for Subscript | provenance | |
|
||||
| summaries.py:48:15:48:15 | ControlFlowNode for x | summaries.py:49:12:49:18 | ControlFlowNode for BinaryExpr | provenance | |
|
||||
| summaries.py:51:1:51:14 | ControlFlowNode for tainted_mapped [List element] | summaries.py:52:6:52:19 | ControlFlowNode for tainted_mapped [List element] | provenance | |
|
||||
| summaries.py:51:18:51:46 | ControlFlowNode for list_map() [List element] | summaries.py:51:1:51:14 | ControlFlowNode for tainted_mapped [List element] | provenance | |
|
||||
| summaries.py:51:38:51:45 | ControlFlowNode for List [List element] | summaries.py:48:15:48:15 | ControlFlowNode for x | provenance | list_map |
|
||||
| summaries.py:51:38:51:45 | ControlFlowNode for List [List element] | summaries.py:51:18:51:46 | ControlFlowNode for list_map() [List element] | provenance | list_map |
|
||||
| summaries.py:51:39:51:44 | ControlFlowNode for SOURCE | summaries.py:51:38:51:45 | ControlFlowNode for List [List element] | provenance | |
|
||||
| summaries.py:52:6:52:19 | ControlFlowNode for tainted_mapped [List element] | summaries.py:52:6:52:22 | ControlFlowNode for Subscript | provenance | |
|
||||
| summaries.py:54:23:54:23 | ControlFlowNode for x | summaries.py:55:12:55:12 | ControlFlowNode for x | provenance | |
|
||||
| summaries.py:57:1:57:23 | ControlFlowNode for tainted_mapped_explicit [List element] | summaries.py:58:6:58:28 | ControlFlowNode for tainted_mapped_explicit [List element] | provenance | |
|
||||
| summaries.py:57:27:57:63 | ControlFlowNode for list_map() [List element] | summaries.py:57:1:57:23 | ControlFlowNode for tainted_mapped_explicit [List element] | provenance | |
|
||||
| summaries.py:57:55:57:62 | ControlFlowNode for List [List element] | summaries.py:54:23:54:23 | ControlFlowNode for x | provenance | list_map |
|
||||
| summaries.py:57:55:57:62 | ControlFlowNode for List [List element] | summaries.py:57:27:57:63 | ControlFlowNode for list_map() [List element] | provenance | list_map |
|
||||
| summaries.py:57:56:57:61 | ControlFlowNode for SOURCE | summaries.py:57:55:57:62 | ControlFlowNode for List [List element] | provenance | |
|
||||
| summaries.py:58:6:58:28 | ControlFlowNode for tainted_mapped_explicit [List element] | summaries.py:58:6:58:31 | ControlFlowNode for Subscript | provenance | |
|
||||
| summaries.py:60:1:60:22 | ControlFlowNode for tainted_mapped_summary [List element] | summaries.py:61:6:61:27 | ControlFlowNode for tainted_mapped_summary [List element] | provenance | |
|
||||
| summaries.py:60:26:60:53 | ControlFlowNode for list_map() [List element] | summaries.py:60:1:60:22 | ControlFlowNode for tainted_mapped_summary [List element] | provenance | |
|
||||
| summaries.py:60:45:60:52 | ControlFlowNode for List [List element] | summaries.py:60:26:60:53 | ControlFlowNode for list_map() [List element] | provenance | list_map |
|
||||
| summaries.py:60:46:60:51 | ControlFlowNode for SOURCE | summaries.py:60:45:60:52 | ControlFlowNode for List [List element] | provenance | |
|
||||
| summaries.py:61:6:61:27 | ControlFlowNode for tainted_mapped_summary [List element] | summaries.py:61:6:61:30 | ControlFlowNode for Subscript | provenance | |
|
||||
| summaries.py:63:1:63:12 | ControlFlowNode for tainted_list [List element] | summaries.py:64:6:64:17 | ControlFlowNode for tainted_list [List element] | provenance | |
|
||||
| summaries.py:63:16:63:41 | ControlFlowNode for append_to_list() [List element] | summaries.py:63:1:63:12 | ControlFlowNode for tainted_list [List element] | provenance | |
|
||||
| summaries.py:63:35:63:40 | ControlFlowNode for SOURCE | summaries.py:63:16:63:41 | ControlFlowNode for append_to_list() [List element] | provenance | append_to_list |
|
||||
| summaries.py:64:6:64:17 | ControlFlowNode for tainted_list [List element] | summaries.py:64:6:64:20 | ControlFlowNode for Subscript | provenance | |
|
||||
| summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist | summaries.py:68:6:68:26 | ControlFlowNode for Subscript | provenance | |
|
||||
| summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist [List element] | summaries.py:68:6:68:23 | ControlFlowNode for tainted_resultlist [List element] | provenance | |
|
||||
| summaries.py:67:22:67:39 | ControlFlowNode for json_loads() [List element] | summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist [List element] | provenance | |
|
||||
| summaries.py:67:33:67:38 | ControlFlowNode for SOURCE | summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist | provenance | Decoding-JSON |
|
||||
| summaries.py:67:33:67:38 | ControlFlowNode for SOURCE | summaries.py:67:22:67:39 | ControlFlowNode for json_loads() [List element] | provenance | json.loads |
|
||||
| summaries.py:68:6:68:23 | ControlFlowNode for tainted_resultlist [List element] | summaries.py:68:6:68:26 | ControlFlowNode for Subscript | provenance | |
|
||||
| summaries.py:32:1:32:7 | tainted | summaries.py:33:6:33:12 | tainted | provenance | |
|
||||
| summaries.py:32:11:32:26 | After identity() | summaries.py:32:1:32:7 | tainted | provenance | |
|
||||
| summaries.py:32:20:32:25 | SOURCE | summaries.py:32:11:32:26 | After identity() | provenance | identity |
|
||||
| summaries.py:36:1:36:14 | tainted_lambda | summaries.py:37:6:37:19 | tainted_lambda | provenance | |
|
||||
| summaries.py:36:18:36:54 | After apply_lambda() | summaries.py:36:1:36:14 | tainted_lambda | provenance | |
|
||||
| summaries.py:36:38:36:38 | x | summaries.py:36:41:36:45 | After BinaryExpr | provenance | |
|
||||
| summaries.py:36:48:36:53 | SOURCE | summaries.py:36:18:36:54 | After apply_lambda() | provenance | apply_lambda |
|
||||
| summaries.py:36:48:36:53 | SOURCE | summaries.py:36:38:36:38 | x | provenance | apply_lambda |
|
||||
| summaries.py:44:1:44:12 | tainted_list | summaries.py:45:6:45:20 | After Subscript | provenance | |
|
||||
| summaries.py:44:1:44:12 | tainted_list [List element] | summaries.py:45:6:45:17 | tainted_list [List element] | provenance | |
|
||||
| summaries.py:44:16:44:33 | After reversed() | summaries.py:44:1:44:12 | tainted_list | provenance | |
|
||||
| summaries.py:44:16:44:33 | After reversed() [List element] | summaries.py:44:1:44:12 | tainted_list [List element] | provenance | |
|
||||
| summaries.py:44:25:44:32 | After List | summaries.py:44:16:44:33 | After reversed() | provenance | builtins.reversed |
|
||||
| summaries.py:44:25:44:32 | After List [List element] | summaries.py:44:16:44:33 | After reversed() [List element] | provenance | builtins.reversed |
|
||||
| summaries.py:44:26:44:31 | SOURCE | summaries.py:44:25:44:32 | After List | provenance | |
|
||||
| summaries.py:44:26:44:31 | SOURCE | summaries.py:44:25:44:32 | After List [List element] | provenance | |
|
||||
| summaries.py:45:6:45:17 | tainted_list [List element] | summaries.py:45:6:45:20 | After Subscript | provenance | |
|
||||
| summaries.py:48:15:48:15 | x | summaries.py:49:12:49:18 | After BinaryExpr | provenance | |
|
||||
| summaries.py:51:1:51:14 | tainted_mapped [List element] | summaries.py:52:6:52:19 | tainted_mapped [List element] | provenance | |
|
||||
| summaries.py:51:18:51:46 | After list_map() [List element] | summaries.py:51:1:51:14 | tainted_mapped [List element] | provenance | |
|
||||
| summaries.py:51:38:51:45 | After List [List element] | summaries.py:48:15:48:15 | x | provenance | list_map |
|
||||
| summaries.py:51:38:51:45 | After List [List element] | summaries.py:51:18:51:46 | After list_map() [List element] | provenance | list_map |
|
||||
| summaries.py:51:39:51:44 | SOURCE | summaries.py:51:38:51:45 | After List [List element] | provenance | |
|
||||
| summaries.py:52:6:52:19 | tainted_mapped [List element] | summaries.py:52:6:52:22 | After Subscript | provenance | |
|
||||
| summaries.py:54:23:54:23 | x | summaries.py:55:12:55:12 | x | provenance | |
|
||||
| summaries.py:57:1:57:23 | tainted_mapped_explicit [List element] | summaries.py:58:6:58:28 | tainted_mapped_explicit [List element] | provenance | |
|
||||
| summaries.py:57:27:57:63 | After list_map() [List element] | summaries.py:57:1:57:23 | tainted_mapped_explicit [List element] | provenance | |
|
||||
| summaries.py:57:55:57:62 | After List [List element] | summaries.py:54:23:54:23 | x | provenance | list_map |
|
||||
| summaries.py:57:55:57:62 | After List [List element] | summaries.py:57:27:57:63 | After list_map() [List element] | provenance | list_map |
|
||||
| summaries.py:57:56:57:61 | SOURCE | summaries.py:57:55:57:62 | After List [List element] | provenance | |
|
||||
| summaries.py:58:6:58:28 | tainted_mapped_explicit [List element] | summaries.py:58:6:58:31 | After Subscript | provenance | |
|
||||
| summaries.py:60:1:60:22 | tainted_mapped_summary [List element] | summaries.py:61:6:61:27 | tainted_mapped_summary [List element] | provenance | |
|
||||
| summaries.py:60:26:60:53 | After list_map() [List element] | summaries.py:60:1:60:22 | tainted_mapped_summary [List element] | provenance | |
|
||||
| summaries.py:60:45:60:52 | After List [List element] | summaries.py:60:26:60:53 | After list_map() [List element] | provenance | list_map |
|
||||
| summaries.py:60:46:60:51 | SOURCE | summaries.py:60:45:60:52 | After List [List element] | provenance | |
|
||||
| summaries.py:61:6:61:27 | tainted_mapped_summary [List element] | summaries.py:61:6:61:30 | After Subscript | provenance | |
|
||||
| summaries.py:63:1:63:12 | tainted_list [List element] | summaries.py:64:6:64:17 | tainted_list [List element] | provenance | |
|
||||
| summaries.py:63:16:63:41 | After append_to_list() [List element] | summaries.py:63:1:63:12 | tainted_list [List element] | provenance | |
|
||||
| summaries.py:63:35:63:40 | SOURCE | summaries.py:63:16:63:41 | After append_to_list() [List element] | provenance | append_to_list |
|
||||
| summaries.py:64:6:64:17 | tainted_list [List element] | summaries.py:64:6:64:20 | After Subscript | provenance | |
|
||||
| summaries.py:67:1:67:18 | tainted_resultlist | summaries.py:68:6:68:26 | After Subscript | provenance | |
|
||||
| summaries.py:67:1:67:18 | tainted_resultlist [List element] | summaries.py:68:6:68:23 | tainted_resultlist [List element] | provenance | |
|
||||
| summaries.py:67:22:67:39 | After json_loads() [List element] | summaries.py:67:1:67:18 | tainted_resultlist [List element] | provenance | |
|
||||
| summaries.py:67:33:67:38 | SOURCE | summaries.py:67:1:67:18 | tainted_resultlist | provenance | Decoding-JSON |
|
||||
| summaries.py:67:33:67:38 | SOURCE | summaries.py:67:22:67:39 | After json_loads() [List element] | provenance | json.loads |
|
||||
| summaries.py:68:6:68:23 | tainted_resultlist [List element] | summaries.py:68:6:68:26 | After Subscript | provenance | |
|
||||
nodes
|
||||
| summaries.py:32:1:32:7 | ControlFlowNode for tainted | semmle.label | ControlFlowNode for tainted |
|
||||
| summaries.py:32:11:32:26 | ControlFlowNode for identity() | semmle.label | ControlFlowNode for identity() |
|
||||
| summaries.py:32:20:32:25 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| summaries.py:33:6:33:12 | ControlFlowNode for tainted | semmle.label | ControlFlowNode for tainted |
|
||||
| summaries.py:36:1:36:14 | ControlFlowNode for tainted_lambda | semmle.label | ControlFlowNode for tainted_lambda |
|
||||
| summaries.py:36:18:36:54 | ControlFlowNode for apply_lambda() | semmle.label | ControlFlowNode for apply_lambda() |
|
||||
| summaries.py:36:38:36:38 | ControlFlowNode for x | semmle.label | ControlFlowNode for x |
|
||||
| summaries.py:36:41:36:45 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr |
|
||||
| summaries.py:36:48:36:53 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| summaries.py:37:6:37:19 | ControlFlowNode for tainted_lambda | semmle.label | ControlFlowNode for tainted_lambda |
|
||||
| summaries.py:44:1:44:12 | ControlFlowNode for tainted_list | semmle.label | ControlFlowNode for tainted_list |
|
||||
| summaries.py:44:1:44:12 | ControlFlowNode for tainted_list [List element] | semmle.label | ControlFlowNode for tainted_list [List element] |
|
||||
| summaries.py:44:16:44:33 | ControlFlowNode for reversed() | semmle.label | ControlFlowNode for reversed() |
|
||||
| summaries.py:44:16:44:33 | ControlFlowNode for reversed() [List element] | semmle.label | ControlFlowNode for reversed() [List element] |
|
||||
| summaries.py:44:25:44:32 | ControlFlowNode for List | semmle.label | ControlFlowNode for List |
|
||||
| summaries.py:44:25:44:32 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
|
||||
| summaries.py:44:26:44:31 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| summaries.py:45:6:45:17 | ControlFlowNode for tainted_list [List element] | semmle.label | ControlFlowNode for tainted_list [List element] |
|
||||
| summaries.py:45:6:45:20 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
|
||||
| summaries.py:48:15:48:15 | ControlFlowNode for x | semmle.label | ControlFlowNode for x |
|
||||
| summaries.py:49:12:49:18 | ControlFlowNode for BinaryExpr | semmle.label | ControlFlowNode for BinaryExpr |
|
||||
| summaries.py:51:1:51:14 | ControlFlowNode for tainted_mapped [List element] | semmle.label | ControlFlowNode for tainted_mapped [List element] |
|
||||
| summaries.py:51:18:51:46 | ControlFlowNode for list_map() [List element] | semmle.label | ControlFlowNode for list_map() [List element] |
|
||||
| summaries.py:51:38:51:45 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
|
||||
| summaries.py:51:39:51:44 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| summaries.py:52:6:52:19 | ControlFlowNode for tainted_mapped [List element] | semmle.label | ControlFlowNode for tainted_mapped [List element] |
|
||||
| summaries.py:52:6:52:22 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
|
||||
| summaries.py:54:23:54:23 | ControlFlowNode for x | semmle.label | ControlFlowNode for x |
|
||||
| summaries.py:55:12:55:12 | ControlFlowNode for x | semmle.label | ControlFlowNode for x |
|
||||
| summaries.py:57:1:57:23 | ControlFlowNode for tainted_mapped_explicit [List element] | semmle.label | ControlFlowNode for tainted_mapped_explicit [List element] |
|
||||
| summaries.py:57:27:57:63 | ControlFlowNode for list_map() [List element] | semmle.label | ControlFlowNode for list_map() [List element] |
|
||||
| summaries.py:57:55:57:62 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
|
||||
| summaries.py:57:56:57:61 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| summaries.py:58:6:58:28 | ControlFlowNode for tainted_mapped_explicit [List element] | semmle.label | ControlFlowNode for tainted_mapped_explicit [List element] |
|
||||
| summaries.py:58:6:58:31 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
|
||||
| summaries.py:60:1:60:22 | ControlFlowNode for tainted_mapped_summary [List element] | semmle.label | ControlFlowNode for tainted_mapped_summary [List element] |
|
||||
| summaries.py:60:26:60:53 | ControlFlowNode for list_map() [List element] | semmle.label | ControlFlowNode for list_map() [List element] |
|
||||
| summaries.py:60:45:60:52 | ControlFlowNode for List [List element] | semmle.label | ControlFlowNode for List [List element] |
|
||||
| summaries.py:60:46:60:51 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| summaries.py:61:6:61:27 | ControlFlowNode for tainted_mapped_summary [List element] | semmle.label | ControlFlowNode for tainted_mapped_summary [List element] |
|
||||
| summaries.py:61:6:61:30 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
|
||||
| summaries.py:63:1:63:12 | ControlFlowNode for tainted_list [List element] | semmle.label | ControlFlowNode for tainted_list [List element] |
|
||||
| summaries.py:63:16:63:41 | ControlFlowNode for append_to_list() [List element] | semmle.label | ControlFlowNode for append_to_list() [List element] |
|
||||
| summaries.py:63:35:63:40 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| summaries.py:64:6:64:17 | ControlFlowNode for tainted_list [List element] | semmle.label | ControlFlowNode for tainted_list [List element] |
|
||||
| summaries.py:64:6:64:20 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
|
||||
| summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist | semmle.label | ControlFlowNode for tainted_resultlist |
|
||||
| summaries.py:67:1:67:18 | ControlFlowNode for tainted_resultlist [List element] | semmle.label | ControlFlowNode for tainted_resultlist [List element] |
|
||||
| summaries.py:67:22:67:39 | ControlFlowNode for json_loads() [List element] | semmle.label | ControlFlowNode for json_loads() [List element] |
|
||||
| summaries.py:67:33:67:38 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| summaries.py:68:6:68:23 | ControlFlowNode for tainted_resultlist [List element] | semmle.label | ControlFlowNode for tainted_resultlist [List element] |
|
||||
| summaries.py:68:6:68:26 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript |
|
||||
| summaries.py:32:1:32:7 | tainted | semmle.label | tainted |
|
||||
| summaries.py:32:11:32:26 | After identity() | semmle.label | After identity() |
|
||||
| summaries.py:32:20:32:25 | SOURCE | semmle.label | SOURCE |
|
||||
| summaries.py:33:6:33:12 | tainted | semmle.label | tainted |
|
||||
| summaries.py:36:1:36:14 | tainted_lambda | semmle.label | tainted_lambda |
|
||||
| summaries.py:36:18:36:54 | After apply_lambda() | semmle.label | After apply_lambda() |
|
||||
| summaries.py:36:38:36:38 | x | semmle.label | x |
|
||||
| summaries.py:36:41:36:45 | After BinaryExpr | semmle.label | After BinaryExpr |
|
||||
| summaries.py:36:48:36:53 | SOURCE | semmle.label | SOURCE |
|
||||
| summaries.py:37:6:37:19 | tainted_lambda | semmle.label | tainted_lambda |
|
||||
| summaries.py:44:1:44:12 | tainted_list | semmle.label | tainted_list |
|
||||
| summaries.py:44:1:44:12 | tainted_list [List element] | semmle.label | tainted_list [List element] |
|
||||
| summaries.py:44:16:44:33 | After reversed() | semmle.label | After reversed() |
|
||||
| summaries.py:44:16:44:33 | After reversed() [List element] | semmle.label | After reversed() [List element] |
|
||||
| summaries.py:44:25:44:32 | After List | semmle.label | After List |
|
||||
| summaries.py:44:25:44:32 | After List [List element] | semmle.label | After List [List element] |
|
||||
| summaries.py:44:26:44:31 | SOURCE | semmle.label | SOURCE |
|
||||
| summaries.py:45:6:45:17 | tainted_list [List element] | semmle.label | tainted_list [List element] |
|
||||
| summaries.py:45:6:45:20 | After Subscript | semmle.label | After Subscript |
|
||||
| summaries.py:48:15:48:15 | x | semmle.label | x |
|
||||
| summaries.py:49:12:49:18 | After BinaryExpr | semmle.label | After BinaryExpr |
|
||||
| summaries.py:51:1:51:14 | tainted_mapped [List element] | semmle.label | tainted_mapped [List element] |
|
||||
| summaries.py:51:18:51:46 | After list_map() [List element] | semmle.label | After list_map() [List element] |
|
||||
| summaries.py:51:38:51:45 | After List [List element] | semmle.label | After List [List element] |
|
||||
| summaries.py:51:39:51:44 | SOURCE | semmle.label | SOURCE |
|
||||
| summaries.py:52:6:52:19 | tainted_mapped [List element] | semmle.label | tainted_mapped [List element] |
|
||||
| summaries.py:52:6:52:22 | After Subscript | semmle.label | After Subscript |
|
||||
| summaries.py:54:23:54:23 | x | semmle.label | x |
|
||||
| summaries.py:55:12:55:12 | x | semmle.label | x |
|
||||
| summaries.py:57:1:57:23 | tainted_mapped_explicit [List element] | semmle.label | tainted_mapped_explicit [List element] |
|
||||
| summaries.py:57:27:57:63 | After list_map() [List element] | semmle.label | After list_map() [List element] |
|
||||
| summaries.py:57:55:57:62 | After List [List element] | semmle.label | After List [List element] |
|
||||
| summaries.py:57:56:57:61 | SOURCE | semmle.label | SOURCE |
|
||||
| summaries.py:58:6:58:28 | tainted_mapped_explicit [List element] | semmle.label | tainted_mapped_explicit [List element] |
|
||||
| summaries.py:58:6:58:31 | After Subscript | semmle.label | After Subscript |
|
||||
| summaries.py:60:1:60:22 | tainted_mapped_summary [List element] | semmle.label | tainted_mapped_summary [List element] |
|
||||
| summaries.py:60:26:60:53 | After list_map() [List element] | semmle.label | After list_map() [List element] |
|
||||
| summaries.py:60:45:60:52 | After List [List element] | semmle.label | After List [List element] |
|
||||
| summaries.py:60:46:60:51 | SOURCE | semmle.label | SOURCE |
|
||||
| summaries.py:61:6:61:27 | tainted_mapped_summary [List element] | semmle.label | tainted_mapped_summary [List element] |
|
||||
| summaries.py:61:6:61:30 | After Subscript | semmle.label | After Subscript |
|
||||
| summaries.py:63:1:63:12 | tainted_list [List element] | semmle.label | tainted_list [List element] |
|
||||
| summaries.py:63:16:63:41 | After append_to_list() [List element] | semmle.label | After append_to_list() [List element] |
|
||||
| summaries.py:63:35:63:40 | SOURCE | semmle.label | SOURCE |
|
||||
| summaries.py:64:6:64:17 | tainted_list [List element] | semmle.label | tainted_list [List element] |
|
||||
| summaries.py:64:6:64:20 | After Subscript | semmle.label | After Subscript |
|
||||
| summaries.py:67:1:67:18 | tainted_resultlist | semmle.label | tainted_resultlist |
|
||||
| summaries.py:67:1:67:18 | tainted_resultlist [List element] | semmle.label | tainted_resultlist [List element] |
|
||||
| summaries.py:67:22:67:39 | After json_loads() [List element] | semmle.label | After json_loads() [List element] |
|
||||
| summaries.py:67:33:67:38 | SOURCE | semmle.label | SOURCE |
|
||||
| summaries.py:68:6:68:23 | tainted_resultlist [List element] | semmle.label | tainted_resultlist [List element] |
|
||||
| summaries.py:68:6:68:26 | After Subscript | semmle.label | After Subscript |
|
||||
subpaths
|
||||
| summaries.py:36:48:36:53 | ControlFlowNode for SOURCE | summaries.py:36:38:36:38 | ControlFlowNode for x | summaries.py:36:41:36:45 | ControlFlowNode for BinaryExpr | summaries.py:36:18:36:54 | ControlFlowNode for apply_lambda() |
|
||||
| summaries.py:51:38:51:45 | ControlFlowNode for List [List element] | summaries.py:48:15:48:15 | ControlFlowNode for x | summaries.py:49:12:49:18 | ControlFlowNode for BinaryExpr | summaries.py:51:18:51:46 | ControlFlowNode for list_map() [List element] |
|
||||
| summaries.py:57:55:57:62 | ControlFlowNode for List [List element] | summaries.py:54:23:54:23 | ControlFlowNode for x | summaries.py:55:12:55:12 | ControlFlowNode for x | summaries.py:57:27:57:63 | ControlFlowNode for list_map() [List element] |
|
||||
| summaries.py:36:48:36:53 | SOURCE | summaries.py:36:38:36:38 | x | summaries.py:36:41:36:45 | After BinaryExpr | summaries.py:36:18:36:54 | After apply_lambda() |
|
||||
| summaries.py:51:38:51:45 | After List [List element] | summaries.py:48:15:48:15 | x | summaries.py:49:12:49:18 | After BinaryExpr | summaries.py:51:18:51:46 | After list_map() [List element] |
|
||||
| summaries.py:57:55:57:62 | After List [List element] | summaries.py:54:23:54:23 | x | summaries.py:55:12:55:12 | x | summaries.py:57:27:57:63 | After list_map() [List element] |
|
||||
invalidSpecComponent
|
||||
#select
|
||||
| summaries.py:33:6:33:12 | ControlFlowNode for tainted | summaries.py:32:20:32:25 | ControlFlowNode for SOURCE | summaries.py:33:6:33:12 | ControlFlowNode for tainted | $@ | summaries.py:32:20:32:25 | ControlFlowNode for SOURCE | ControlFlowNode for SOURCE |
|
||||
| summaries.py:37:6:37:19 | ControlFlowNode for tainted_lambda | summaries.py:36:48:36:53 | ControlFlowNode for SOURCE | summaries.py:37:6:37:19 | ControlFlowNode for tainted_lambda | $@ | summaries.py:36:48:36:53 | ControlFlowNode for SOURCE | ControlFlowNode for SOURCE |
|
||||
| summaries.py:45:6:45:20 | ControlFlowNode for Subscript | summaries.py:44:26:44:31 | ControlFlowNode for SOURCE | summaries.py:45:6:45:20 | ControlFlowNode for Subscript | $@ | summaries.py:44:26:44:31 | ControlFlowNode for SOURCE | ControlFlowNode for SOURCE |
|
||||
| summaries.py:52:6:52:22 | ControlFlowNode for Subscript | summaries.py:51:39:51:44 | ControlFlowNode for SOURCE | summaries.py:52:6:52:22 | ControlFlowNode for Subscript | $@ | summaries.py:51:39:51:44 | ControlFlowNode for SOURCE | ControlFlowNode for SOURCE |
|
||||
| summaries.py:58:6:58:31 | ControlFlowNode for Subscript | summaries.py:57:56:57:61 | ControlFlowNode for SOURCE | summaries.py:58:6:58:31 | ControlFlowNode for Subscript | $@ | summaries.py:57:56:57:61 | ControlFlowNode for SOURCE | ControlFlowNode for SOURCE |
|
||||
| summaries.py:61:6:61:30 | ControlFlowNode for Subscript | summaries.py:60:46:60:51 | ControlFlowNode for SOURCE | summaries.py:61:6:61:30 | ControlFlowNode for Subscript | $@ | summaries.py:60:46:60:51 | ControlFlowNode for SOURCE | ControlFlowNode for SOURCE |
|
||||
| summaries.py:64:6:64:20 | ControlFlowNode for Subscript | summaries.py:63:35:63:40 | ControlFlowNode for SOURCE | summaries.py:64:6:64:20 | ControlFlowNode for Subscript | $@ | summaries.py:63:35:63:40 | ControlFlowNode for SOURCE | ControlFlowNode for SOURCE |
|
||||
| summaries.py:68:6:68:26 | ControlFlowNode for Subscript | summaries.py:67:33:67:38 | ControlFlowNode for SOURCE | summaries.py:68:6:68:26 | ControlFlowNode for Subscript | $@ | summaries.py:67:33:67:38 | ControlFlowNode for SOURCE | ControlFlowNode for SOURCE |
|
||||
| summaries.py:33:6:33:12 | tainted | summaries.py:32:20:32:25 | SOURCE | summaries.py:33:6:33:12 | tainted | $@ | summaries.py:32:20:32:25 | SOURCE | SOURCE |
|
||||
| summaries.py:37:6:37:19 | tainted_lambda | summaries.py:36:48:36:53 | SOURCE | summaries.py:37:6:37:19 | tainted_lambda | $@ | summaries.py:36:48:36:53 | SOURCE | SOURCE |
|
||||
| summaries.py:45:6:45:20 | After Subscript | summaries.py:44:26:44:31 | SOURCE | summaries.py:45:6:45:20 | After Subscript | $@ | summaries.py:44:26:44:31 | SOURCE | SOURCE |
|
||||
| summaries.py:52:6:52:22 | After Subscript | summaries.py:51:39:51:44 | SOURCE | summaries.py:52:6:52:22 | After Subscript | $@ | summaries.py:51:39:51:44 | SOURCE | SOURCE |
|
||||
| summaries.py:58:6:58:31 | After Subscript | summaries.py:57:56:57:61 | SOURCE | summaries.py:58:6:58:31 | After Subscript | $@ | summaries.py:57:56:57:61 | SOURCE | SOURCE |
|
||||
| summaries.py:61:6:61:30 | After Subscript | summaries.py:60:46:60:51 | SOURCE | summaries.py:61:6:61:30 | After Subscript | $@ | summaries.py:60:46:60:51 | SOURCE | SOURCE |
|
||||
| summaries.py:64:6:64:20 | After Subscript | summaries.py:63:35:63:40 | SOURCE | summaries.py:64:6:64:20 | After Subscript | $@ | summaries.py:63:35:63:40 | SOURCE | SOURCE |
|
||||
| summaries.py:68:6:68:26 | After Subscript | summaries.py:67:33:67:38 | SOURCE | summaries.py:68:6:68:26 | After Subscript | $@ | summaries.py:67:33:67:38 | SOURCE | SOURCE |
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
| test.py:3:11:3:16 | ControlFlowNode for SOURCE | test.py:4:6:4:12 | ControlFlowNode for tainted |
|
||||
| test.py:7:20:7:25 | ControlFlowNode for SOURCE | test.py:8:10:8:21 | ControlFlowNode for also_tainted |
|
||||
| test.py:3:11:3:16 | SOURCE | test.py:4:6:4:12 | tainted |
|
||||
| test.py:7:20:7:25 | SOURCE | test.py:8:10:8:21 | also_tainted |
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
import python
|
||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
||||
import semmle.python.dataflow.new.TaintTracking
|
||||
import semmle.python.dataflow.new.DataFlow
|
||||
|
||||
module TestTaintTrackingConfig implements DataFlow::ConfigSig {
|
||||
predicate isSource(DataFlow::Node source) {
|
||||
source.(DataFlow::CfgNode).getNode().(NameNode).getId() = "SOURCE"
|
||||
source.(DataFlow::CfgNode).getNode().(Cfg::NameNode).getId() = "SOURCE"
|
||||
}
|
||||
|
||||
predicate isSink(DataFlow::Node sink) {
|
||||
exists(CallNode call |
|
||||
call.getFunction().(NameNode).getId() = "SINK" and
|
||||
exists(Cfg::CallNode call |
|
||||
call.getFunction().(Cfg::NameNode).getId() = "SINK" and
|
||||
sink.(DataFlow::CfgNode).getNode() = call.getAnArg()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
| test.py:3:1:3:7 | ControlFlowNode for tainted | test.py:4:6:4:12 | ControlFlowNode for tainted |
|
||||
| test.py:3:11:3:16 | ControlFlowNode for SOURCE | test.py:3:1:3:7 | ControlFlowNode for tainted |
|
||||
| test.py:6:1:6:11 | ControlFlowNode for FunctionExpr | test.py:6:5:6:8 | ControlFlowNode for func |
|
||||
| test.py:7:5:7:16 | ControlFlowNode for also_tainted | test.py:8:10:8:21 | ControlFlowNode for also_tainted |
|
||||
| test.py:7:20:7:25 | ControlFlowNode for SOURCE | test.py:7:5:7:16 | ControlFlowNode for also_tainted |
|
||||
| test.py:3:1:3:7 | tainted | test.py:4:6:4:12 | tainted |
|
||||
| test.py:3:11:3:16 | SOURCE | test.py:3:1:3:7 | tainted |
|
||||
| test.py:6:1:6:11 | FunctionExpr | test.py:6:5:6:8 | func |
|
||||
| test.py:7:5:7:16 | also_tainted | test.py:8:10:8:21 | also_tainted |
|
||||
| test.py:7:20:7:25 | SOURCE | test.py:7:5:7:16 | also_tainted |
|
||||
|
||||
@@ -2,32 +2,32 @@ argumentToEnsureNotTaintedNotMarkedAsSpurious
|
||||
untaintedArgumentToEnsureTaintedNotMarkedAsMissing
|
||||
testFailures
|
||||
isSanitizer
|
||||
| test.py:21:39:21:39 | ControlFlowNode for s |
|
||||
| test.py:34:39:34:39 | ControlFlowNode for s |
|
||||
| test.py:52:28:52:28 | ControlFlowNode for s |
|
||||
| test.py:66:10:66:29 | ControlFlowNode for emulated_escaping() |
|
||||
| test_logical.py:33:28:33:28 | ControlFlowNode for s |
|
||||
| test_logical.py:40:28:40:28 | ControlFlowNode for s |
|
||||
| test_logical.py:48:28:48:28 | ControlFlowNode for s |
|
||||
| test_logical.py:53:28:53:28 | ControlFlowNode for s |
|
||||
| test_logical.py:92:28:92:28 | ControlFlowNode for s |
|
||||
| test_logical.py:103:28:103:28 | ControlFlowNode for s |
|
||||
| test_logical.py:111:28:111:28 | ControlFlowNode for s |
|
||||
| test_logical.py:130:28:130:28 | ControlFlowNode for s |
|
||||
| test_logical.py:137:28:137:28 | ControlFlowNode for s |
|
||||
| test_logical.py:148:28:148:28 | ControlFlowNode for s |
|
||||
| test_logical.py:151:28:151:28 | ControlFlowNode for s |
|
||||
| test_logical.py:158:28:158:28 | ControlFlowNode for s |
|
||||
| test_logical.py:167:24:167:24 | ControlFlowNode for s |
|
||||
| test_logical.py:176:24:176:24 | ControlFlowNode for s |
|
||||
| test_logical.py:185:24:185:24 | ControlFlowNode for s |
|
||||
| test_logical.py:193:24:193:24 | ControlFlowNode for s |
|
||||
| test_logical.py:199:28:199:28 | ControlFlowNode for s |
|
||||
| test_logical.py:206:28:206:28 | ControlFlowNode for s |
|
||||
| test_logical.py:211:28:211:28 | ControlFlowNode for s |
|
||||
| test_logical.py:214:28:214:28 | ControlFlowNode for s |
|
||||
| test_logical.py:219:28:219:28 | ControlFlowNode for s |
|
||||
| test_logical.py:226:28:226:28 | ControlFlowNode for s |
|
||||
| test_logical.py:231:28:231:28 | ControlFlowNode for s |
|
||||
| test_logical.py:234:28:234:28 | ControlFlowNode for s |
|
||||
| test_reference.py:31:28:31:28 | ControlFlowNode for s |
|
||||
| test.py:21:39:21:39 | s |
|
||||
| test.py:34:39:34:39 | s |
|
||||
| test.py:52:28:52:28 | s |
|
||||
| test.py:66:10:66:29 | After emulated_escaping() |
|
||||
| test_logical.py:33:28:33:28 | s |
|
||||
| test_logical.py:40:28:40:28 | s |
|
||||
| test_logical.py:48:28:48:28 | s |
|
||||
| test_logical.py:53:28:53:28 | s |
|
||||
| test_logical.py:92:28:92:28 | s |
|
||||
| test_logical.py:103:28:103:28 | s |
|
||||
| test_logical.py:111:28:111:28 | s |
|
||||
| test_logical.py:130:28:130:28 | s |
|
||||
| test_logical.py:137:28:137:28 | s |
|
||||
| test_logical.py:148:28:148:28 | s |
|
||||
| test_logical.py:151:28:151:28 | s |
|
||||
| test_logical.py:158:28:158:28 | s |
|
||||
| test_logical.py:167:24:167:24 | s |
|
||||
| test_logical.py:176:24:176:24 | s |
|
||||
| test_logical.py:185:24:185:24 | s |
|
||||
| test_logical.py:193:24:193:24 | s |
|
||||
| test_logical.py:199:28:199:28 | s |
|
||||
| test_logical.py:206:28:206:28 | s |
|
||||
| test_logical.py:211:28:211:28 | s |
|
||||
| test_logical.py:214:28:214:28 | s |
|
||||
| test_logical.py:219:28:219:28 | s |
|
||||
| test_logical.py:226:28:226:28 | s |
|
||||
| test_logical.py:231:28:231:28 | s |
|
||||
| test_logical.py:234:28:234:28 | s |
|
||||
| test_reference.py:31:28:31:28 | s |
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
import experimental.meta.InlineTaintTest
|
||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
||||
|
||||
predicate isSafeCheck(DataFlow::GuardNode g, ControlFlowNode node, boolean branch) {
|
||||
g.(CallNode).getNode().getFunc().(Name).getId() in ["is_safe", "emulated_is_safe"] and
|
||||
node = g.(CallNode).getAnArg() and
|
||||
predicate isSafeCheck(DataFlow::GuardNode g, Cfg::ControlFlowNode node, boolean branch) {
|
||||
g.(Cfg::CallNode).getNode().getFunc().(Name).getId() in ["is_safe", "emulated_is_safe"] and
|
||||
node = g.(Cfg::CallNode).getAnArg() and
|
||||
branch = true
|
||||
}
|
||||
|
||||
predicate isUnsafeCheck(DataFlow::GuardNode g, ControlFlowNode node, boolean branch) {
|
||||
g.(CallNode).getNode().getFunc().(Name).getId() in ["is_unsafe", "emulated_is_unsafe"] and
|
||||
node = g.(CallNode).getAnArg() and
|
||||
predicate isUnsafeCheck(DataFlow::GuardNode g, Cfg::ControlFlowNode node, boolean branch) {
|
||||
g.(Cfg::CallNode).getNode().getFunc().(Name).getId() in ["is_unsafe", "emulated_is_unsafe"] and
|
||||
node = g.(Cfg::CallNode).getAnArg() and
|
||||
branch = false
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ def test_custom_sanitizer_exception_raise():
|
||||
emulated_authentication_check(s)
|
||||
ensure_not_tainted(s)
|
||||
except:
|
||||
ensure_tainted(s) # $ tainted
|
||||
ensure_tainted(s) # $ MISSING: tainted
|
||||
raise
|
||||
|
||||
ensure_not_tainted(s)
|
||||
@@ -34,10 +34,10 @@ def test_custom_sanitizer_exception_pass():
|
||||
emulated_authentication_check(s)
|
||||
ensure_not_tainted(s)
|
||||
except:
|
||||
ensure_tainted(s) # $ tainted
|
||||
ensure_tainted(s) # $ MISSING: tainted
|
||||
pass
|
||||
|
||||
ensure_tainted(s) # $ tainted
|
||||
ensure_tainted(s) # $ MISSING: tainted
|
||||
|
||||
|
||||
def emulated_is_safe(arg):
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import python
|
||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
||||
import semmle.python.dataflow.new.DataFlow
|
||||
import semmle.python.dataflow.new.TypeTracking
|
||||
import utils.test.InlineExpectationsTest
|
||||
@@ -10,7 +11,7 @@ import TestSummaries
|
||||
// -----------------------------------------------------------------------------
|
||||
private DataFlow::TypeTrackingNode tracked(TypeTracker t) {
|
||||
t.start() and
|
||||
result.asCfgNode() = any(NameNode n | n.getId() = "tracked")
|
||||
result.asCfgNode() = any(Cfg::NameNode n | n.getId() = "tracked")
|
||||
or
|
||||
exists(TypeTracker t2 | result = tracked(t2).track(t2, t))
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
module_tracker
|
||||
| import_as_attr.py:1:6:1:11 | ControlFlowNode for ImportExpr |
|
||||
| import_as_attr.py:1:6:1:11 | ImportExpr |
|
||||
module_attr_tracker
|
||||
| import_as_attr.py:0:0:0:0 | ModuleVariableNode in Module import_as_attr for attr_ref |
|
||||
| import_as_attr.py:0:0:0:0 | ModuleVariableNode in Module import_as_attr for x |
|
||||
| import_as_attr.py:1:20:1:35 | ControlFlowNode for ImportMember |
|
||||
| import_as_attr.py:1:28:1:35 | ControlFlowNode for attr_ref |
|
||||
| import_as_attr.py:3:1:3:1 | ControlFlowNode for x |
|
||||
| import_as_attr.py:3:5:3:12 | ControlFlowNode for attr_ref |
|
||||
| import_as_attr.py:5:1:5:10 | Entry definition for SsaSourceVariable attr_ref |
|
||||
| import_as_attr.py:6:5:6:5 | ControlFlowNode for y |
|
||||
| import_as_attr.py:6:9:6:16 | ControlFlowNode for attr_ref |
|
||||
| import_as_attr.py:1:20:1:35 | After ImportMember |
|
||||
| import_as_attr.py:1:28:1:35 | attr_ref |
|
||||
| import_as_attr.py:3:1:3:1 | x |
|
||||
| import_as_attr.py:3:5:3:12 | attr_ref |
|
||||
| import_as_attr.py:5:1:5:10 | Entry definition for Global Variable attr_ref |
|
||||
| import_as_attr.py:6:5:6:5 | y |
|
||||
| import_as_attr.py:6:9:6:16 | attr_ref |
|
||||
|
||||
@@ -90,9 +90,9 @@ def my_decorator(func):
|
||||
|
||||
def wrapper():
|
||||
print("before function call")
|
||||
val = func() # $ MISSING: tracked
|
||||
val = func() # $ tracked
|
||||
print("after function call")
|
||||
return val # $ MISSING: tracked
|
||||
return val # $ tracked
|
||||
return wrapper
|
||||
|
||||
@my_decorator
|
||||
@@ -105,7 +105,7 @@ def unrelated_func():
|
||||
|
||||
def use_funcs_with_decorators():
|
||||
x = get_tracked2() # $ tracked
|
||||
y = unrelated_func()
|
||||
y = unrelated_func() # $ SPURIOUS: tracked
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ private import semmle.python.dataflow.new.internal.DataFlowPrivate as DP
|
||||
// -----------------------------------------------------------------------------
|
||||
private DataFlow::TypeTrackingNode tracked(TypeTracker t) {
|
||||
t.start() and
|
||||
result.asCfgNode() = any(NameNode n | n.getId() = "tracked")
|
||||
result.asCfgNode().getNode() = any(Name n | n.getId() = "tracked")
|
||||
or
|
||||
exists(TypeTracker t2 | result = tracked(t2).track(t2, t))
|
||||
}
|
||||
@@ -51,14 +51,14 @@ module TrackedTest implements TestSig {
|
||||
// -----------------------------------------------------------------------------
|
||||
private DataFlow::TypeTrackingNode int_type(TypeTracker t) {
|
||||
t.start() and
|
||||
result.asCfgNode() = any(CallNode c | c.getFunction().(NameNode).getId() = "int")
|
||||
result.asCfgNode().getNode() = any(Call c | c.getFunc().(Name).getId() = "int")
|
||||
or
|
||||
exists(TypeTracker t2 | result = int_type(t2).track(t2, t))
|
||||
}
|
||||
|
||||
private DataFlow::TypeTrackingNode string_type(TypeTracker t) {
|
||||
t.start() and
|
||||
result.asCfgNode() = any(CallNode c | c.getFunction().(NameNode).getId() = "str")
|
||||
result.asCfgNode().getNode() = any(Call c | c.getFunc().(Name).getId() = "str")
|
||||
or
|
||||
exists(TypeTracker t2 | result = string_type(t2).track(t2, t))
|
||||
}
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
import python
|
||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
||||
private import semmle.python.dataflow.new.internal.SsaImpl as SsaImpl
|
||||
|
||||
// looking at `module_export` predicate in DataFlowPrivate, the core of the problem is
|
||||
// that in alias_problem.py, the direct import of `foo` does not flow to a normal exit of
|
||||
// the module. Instead there is a second variable foo coming from `from .other import*` that
|
||||
// goes to the normal exit of the module.
|
||||
from Module m, EssaVariable v, string useToNormalExit
|
||||
from Module m, SsaImpl::EssaVariable v, string useToNormalExit
|
||||
where
|
||||
m = v.getScope().getEnclosingModule() and
|
||||
not m.getName() in ["pkg.use", "pkg.foo_def"] and
|
||||
v.getName() = "foo" and
|
||||
if v.getAUse() = m.getANormalExit()
|
||||
if exists(Cfg::ControlFlowNode exit | exit.isNormalExit() and exit.getScope() = m and v.getAUse() = exit)
|
||||
then useToNormalExit = "use to normal exit"
|
||||
else useToNormalExit = "no use to normal exit"
|
||||
select m, v, useToNormalExit
|
||||
|
||||
@@ -1,24 +1,25 @@
|
||||
implicit_use_count
|
||||
| 0 |
|
||||
| 1 |
|
||||
implicit_use
|
||||
| read_explosion.py:9:1:9:12 | Normal Exit |
|
||||
source_use_count
|
||||
| 6 |
|
||||
source_use
|
||||
| read_explosion.py:17:15:17:15 | ControlFlowNode for x |
|
||||
| read_explosion.py:19:13:19:13 | ControlFlowNode for x |
|
||||
| read_explosion.py:21:11:21:11 | ControlFlowNode for x |
|
||||
| read_explosion.py:28:15:28:15 | ControlFlowNode for x |
|
||||
| read_explosion.py:30:13:30:13 | ControlFlowNode for x |
|
||||
| read_explosion.py:32:11:32:11 | ControlFlowNode for x |
|
||||
| read_explosion.py:17:15:17:15 | x |
|
||||
| read_explosion.py:19:13:19:13 | x |
|
||||
| read_explosion.py:21:11:21:11 | x |
|
||||
| read_explosion.py:28:15:28:15 | x |
|
||||
| read_explosion.py:30:13:30:13 | x |
|
||||
| read_explosion.py:32:11:32:11 | x |
|
||||
use_use_edge_count
|
||||
| 9 |
|
||||
use_use_edge
|
||||
| read_explosion.py:17:15:17:15 | ControlFlowNode for x | read_explosion.py:28:15:28:15 | ControlFlowNode for x |
|
||||
| read_explosion.py:17:15:17:15 | ControlFlowNode for x | read_explosion.py:30:13:30:13 | ControlFlowNode for x |
|
||||
| read_explosion.py:17:15:17:15 | ControlFlowNode for x | read_explosion.py:32:11:32:11 | ControlFlowNode for x |
|
||||
| read_explosion.py:19:13:19:13 | ControlFlowNode for x | read_explosion.py:28:15:28:15 | ControlFlowNode for x |
|
||||
| read_explosion.py:19:13:19:13 | ControlFlowNode for x | read_explosion.py:30:13:30:13 | ControlFlowNode for x |
|
||||
| read_explosion.py:19:13:19:13 | ControlFlowNode for x | read_explosion.py:32:11:32:11 | ControlFlowNode for x |
|
||||
| read_explosion.py:21:11:21:11 | ControlFlowNode for x | read_explosion.py:28:15:28:15 | ControlFlowNode for x |
|
||||
| read_explosion.py:21:11:21:11 | ControlFlowNode for x | read_explosion.py:30:13:30:13 | ControlFlowNode for x |
|
||||
| read_explosion.py:21:11:21:11 | ControlFlowNode for x | read_explosion.py:32:11:32:11 | ControlFlowNode for x |
|
||||
| read_explosion.py:17:15:17:15 | x | read_explosion.py:28:15:28:15 | x |
|
||||
| read_explosion.py:17:15:17:15 | x | read_explosion.py:30:13:30:13 | x |
|
||||
| read_explosion.py:17:15:17:15 | x | read_explosion.py:32:11:32:11 | x |
|
||||
| read_explosion.py:19:13:19:13 | x | read_explosion.py:28:15:28:15 | x |
|
||||
| read_explosion.py:19:13:19:13 | x | read_explosion.py:30:13:30:13 | x |
|
||||
| read_explosion.py:19:13:19:13 | x | read_explosion.py:32:11:32:11 | x |
|
||||
| read_explosion.py:21:11:21:11 | x | read_explosion.py:28:15:28:15 | x |
|
||||
| read_explosion.py:21:11:21:11 | x | read_explosion.py:30:13:30:13 | x |
|
||||
| read_explosion.py:21:11:21:11 | x | read_explosion.py:32:11:32:11 | x |
|
||||
|
||||
@@ -1,26 +1,28 @@
|
||||
import python
|
||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
||||
private import semmle.python.dataflow.new.internal.SsaImpl as SsaImpl
|
||||
private import semmle.python.dataflow.new.internal.DataFlowPrivate
|
||||
|
||||
query int implicit_use_count() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" | result = count(x.getAnImplicitUse()))
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" | result = count(x.getAnImplicitUse()))
|
||||
}
|
||||
|
||||
query ControlFlowNode implicit_use() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" | result = x.getAnImplicitUse())
|
||||
query Cfg::ControlFlowNode implicit_use() {
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" | result = x.getAnImplicitUse())
|
||||
}
|
||||
|
||||
query int source_use_count() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" | result = count(x.getASourceUse()))
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" | result = count(x.getASourceUse()))
|
||||
}
|
||||
|
||||
query ControlFlowNode source_use() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" | result = x.getASourceUse())
|
||||
query Cfg::ControlFlowNode source_use() {
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" | result = x.getASourceUse())
|
||||
}
|
||||
|
||||
query int use_use_edge_count() {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" |
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" |
|
||||
result =
|
||||
count(NameNode use1, NameNode use2 |
|
||||
count(Cfg::NameNode use1, Cfg::NameNode use2 |
|
||||
use1 = x.getAUse() and
|
||||
use2 = x.getAUse() and
|
||||
LocalFlow::useToNextUse(use1, use2)
|
||||
@@ -28,8 +30,8 @@ query int use_use_edge_count() {
|
||||
)
|
||||
}
|
||||
|
||||
query predicate use_use_edge(NameNode use1, NameNode use2) {
|
||||
exists(SsaSourceVariable x | x.getName() = "x" |
|
||||
query predicate use_use_edge(Cfg::NameNode use1, Cfg::NameNode use2) {
|
||||
exists(SsaImpl::SsaSourceVariable x | x.getName() = "x" |
|
||||
use1 = x.getAUse() and
|
||||
use2 = x.getAUse() and
|
||||
LocalFlow::useToNextUse(use1, use2)
|
||||
|
||||
Reference in New Issue
Block a user