mirror of
https://github.com/github/codeql.git
synced 2025-12-20 10:46:30 +01:00
Python: Handle positional construtor arguments
This commit is contained in:
@@ -279,12 +279,16 @@ module ArgumentPassing {
|
||||
|
||||
/**
|
||||
* Gets the argument to `call` that is passed to the `n`th parameter of `callable`.
|
||||
* If it is a positional argument, it must appear at position `argNr`.
|
||||
* `argNr` will differ from `n` for method- or class calls, where the first parameter
|
||||
* is `self` and the first positional arguemnt is passed to the second positional parameter.
|
||||
*/
|
||||
Node getArg(CallNode call, CallableValue callable, int n) {
|
||||
Node getArg(CallNode call, int argNr, CallableValue callable, int n) {
|
||||
connects(call, callable) and
|
||||
n - argNr in [0, 1] and // constrain for now to limit the size of the predicate; we only use it to insert one argument (self).
|
||||
(
|
||||
// positional argument
|
||||
result = TCfgNode(call.getArg(n))
|
||||
result = TCfgNode(call.getArg(argNr))
|
||||
or
|
||||
// keyword argument
|
||||
exists(Function f, string argName |
|
||||
@@ -305,7 +309,7 @@ module ArgumentPassing {
|
||||
or
|
||||
// argument unpacked from dict
|
||||
exists(string name |
|
||||
call_unpacks(call, callable, name, n) and
|
||||
call_unpacks(call, argNr, callable, name, n) and
|
||||
result = TKwUnpacked(call, callable, name)
|
||||
)
|
||||
)
|
||||
@@ -339,11 +343,12 @@ module ArgumentPassing {
|
||||
* Holds if `call` unpacks a dictionary argument in order to pass it via `name`.
|
||||
* It will then be passed to the `n`th parameter of `callable`.
|
||||
*/
|
||||
predicate call_unpacks(CallNode call, CallableValue callable, string name, int n) {
|
||||
predicate call_unpacks(CallNode call, int argNr, CallableValue callable, string name, int n) {
|
||||
connects(call, callable) and
|
||||
n - argNr in [0, 1] and
|
||||
exists(Function f |
|
||||
f = callable.getScope() and
|
||||
not exists(call.getArg(n)) and // no positional arguement available
|
||||
not exists(call.getArg(argNr)) and // no positional arguement available
|
||||
name = f.getArgName(n) and
|
||||
// not exists(call.getArgByName(name)) and // only matches keyword arguments not preceded by **
|
||||
not call.getNode().getANamedArg().(Keyword).getArg() = name and // no keyword argument available
|
||||
@@ -478,7 +483,7 @@ class CallNodeCall extends DataFlowCall, TCallNode {
|
||||
|
||||
override string toString() { result = call.toString() }
|
||||
|
||||
override Node getArg(int n) { result = getArg(call, callable.getCallableValue(), n) }
|
||||
override Node getArg(int n) { result = getArg(call, n, callable.getCallableValue(), n) }
|
||||
|
||||
override ControlFlowNode getNode() { result = call }
|
||||
|
||||
@@ -502,7 +507,7 @@ class ClassCall extends DataFlowCall, TClassCall {
|
||||
override string toString() { result = call.toString() }
|
||||
|
||||
override Node getArg(int n) {
|
||||
n > 0 and result = getArg(call, this.getCallableValue(), n - 1)
|
||||
n > 0 and result = getArg(call, n - 1, this.getCallableValue(), n)
|
||||
or
|
||||
n = 0 and result = TSyntheticPreUpdateNode(TCfgNode(call))
|
||||
}
|
||||
@@ -918,7 +923,7 @@ predicate kwUnpackReadStep(CfgNode nodeFrom, DictionaryElementContent c, Node no
|
||||
cached
|
||||
predicate clearsContent(Node n, Content c) {
|
||||
exists(CallNode call, CallableValue callable, string name |
|
||||
call_unpacks(call, callable, name, _) and
|
||||
call_unpacks(call, _, callable, name, _) and
|
||||
n = TKwOverflowNode(call, callable) and
|
||||
c.(DictionaryElementContent).getKey() = name
|
||||
)
|
||||
|
||||
@@ -46,7 +46,7 @@ newtype TNode =
|
||||
* to parameter `foo` of `callable.
|
||||
*/
|
||||
TKwUnpacked(CallNode call, CallableValue callable, string name) {
|
||||
call_unpacks(call, callable, name, _)
|
||||
call_unpacks(call, _, callable, name, _)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -74,74 +74,110 @@
|
||||
| examples.py:46:9:46:16 | ControlFlowNode for MyObj() | examples.py:46:3:46:5 | SSA variable obj |
|
||||
| examples.py:47:3:47:3 | SSA variable a | examples.py:48:10:48:10 | ControlFlowNode for a |
|
||||
| examples.py:47:7:47:13 | ControlFlowNode for Attribute | examples.py:47:3:47:3 | SSA variable a |
|
||||
| test.py:0:0:0:0 | GSSA Variable SINK | test.py:1:1:1:66 | GSSA Variable SINK |
|
||||
| test.py:0:0:0:0 | GSSA Variable SINK_F | test.py:1:1:1:66 | GSSA Variable SINK_F |
|
||||
| test.py:0:0:0:0 | GSSA Variable SOURCE | test.py:1:1:1:66 | GSSA Variable SOURCE |
|
||||
| test.py:0:0:0:0 | GSSA Variable __name__ | test.py:1:1:1:66 | GSSA Variable __name__ |
|
||||
| test.py:0:0:0:0 | GSSA Variable __package__ | test.py:1:1:1:66 | GSSA Variable __package__ |
|
||||
| test.py:0:0:0:0 | GSSA Variable object | test.py:1:1:1:66 | GSSA Variable object |
|
||||
| test.py:0:0:0:0 | GSSA Variable object | test.py:6:13:6:18 | ControlFlowNode for object |
|
||||
| test.py:0:0:0:0 | SSA variable $ | test.py:1:1:1:66 | SSA variable $ |
|
||||
| test.py:0:0:0:0 | SSA variable * | test.py:1:1:1:66 | SSA variable * |
|
||||
| test.py:6:1:6:20 | ControlFlowNode for ClassExpr | test.py:6:7:6:11 | GSSA Variable MyObj |
|
||||
| test.py:6:13:6:18 | ControlFlowNode for object | test.py:12:17:12:22 | ControlFlowNode for object |
|
||||
| test.py:8:5:8:28 | ControlFlowNode for FunctionExpr | test.py:8:9:8:16 | SSA variable __init__ |
|
||||
| test.py:8:18:8:21 | SSA variable self | test.py:9:9:9:12 | ControlFlowNode for self |
|
||||
| test.py:8:18:8:21 | SSA variable self | test.py:9:9:9:16 | SSA variable self |
|
||||
| test.py:8:24:8:26 | SSA variable foo | test.py:9:20:9:22 | ControlFlowNode for foo |
|
||||
| test.py:12:1:12:24 | ControlFlowNode for ClassExpr | test.py:12:7:12:15 | GSSA Variable NestedObj |
|
||||
| test.py:14:5:14:23 | ControlFlowNode for FunctionExpr | test.py:14:9:14:16 | SSA variable __init__ |
|
||||
| test.py:14:5:14:23 | GSSA Variable MyObj | test.py:15:20:15:24 | ControlFlowNode for MyObj |
|
||||
| test.py:14:18:14:21 | SSA variable self | test.py:15:9:15:12 | ControlFlowNode for self |
|
||||
| test.py:14:18:14:21 | SSA variable self | test.py:15:9:15:16 | SSA variable self |
|
||||
| test.py:17:5:17:21 | ControlFlowNode for FunctionExpr | test.py:17:9:17:14 | SSA variable getObj |
|
||||
| test.py:17:16:17:19 | SSA variable self | test.py:18:16:18:19 | ControlFlowNode for self |
|
||||
| test.py:21:1:21:19 | ControlFlowNode for FunctionExpr | test.py:21:5:21:10 | GSSA Variable setFoo |
|
||||
| test.py:21:1:21:19 | GSSA Variable SINK_F | test.py:22:5:22:10 | ControlFlowNode for SINK_F |
|
||||
| test.py:21:12:21:14 | SSA variable obj | test.py:22:12:22:14 | ControlFlowNode for obj |
|
||||
| test.py:21:12:21:14 | SSA variable obj | test.py:23:5:23:11 | SSA variable obj |
|
||||
| test.py:21:17:21:17 | SSA variable x | test.py:23:15:23:15 | ControlFlowNode for x |
|
||||
| test.py:22:12:22:14 | ControlFlowNode for obj | test.py:23:5:23:7 | ControlFlowNode for obj |
|
||||
| test.py:22:12:22:14 | [post read] ControlFlowNode for obj | test.py:23:5:23:7 | ControlFlowNode for obj |
|
||||
| test.py:26:1:26:20 | ControlFlowNode for FunctionExpr | test.py:26:5:26:17 | GSSA Variable test_example1 |
|
||||
| test.py:26:1:26:20 | GSSA Variable MyObj | test.py:27:13:27:17 | ControlFlowNode for MyObj |
|
||||
| test.py:26:1:26:20 | GSSA Variable SINK | test.py:30:5:30:8 | ControlFlowNode for SINK |
|
||||
| test.py:26:1:26:20 | GSSA Variable SOURCE | test.py:29:19:29:24 | ControlFlowNode for SOURCE |
|
||||
| test.py:26:1:26:20 | GSSA Variable setFoo | test.py:29:5:29:10 | ControlFlowNode for setFoo |
|
||||
| test.py:27:5:27:9 | SSA variable myobj | test.py:29:5:29:25 | SSA variable myobj |
|
||||
| test.py:27:5:27:9 | SSA variable myobj | test.py:29:12:29:16 | ControlFlowNode for myobj |
|
||||
| test.py:27:13:27:23 | ControlFlowNode for MyObj() | test.py:27:5:27:9 | SSA variable myobj |
|
||||
| test.py:29:12:29:16 | ControlFlowNode for myobj | test.py:30:10:30:14 | ControlFlowNode for myobj |
|
||||
| test.py:29:12:29:16 | [post arg] ControlFlowNode for myobj | test.py:30:10:30:14 | ControlFlowNode for myobj |
|
||||
| test.py:33:1:33:20 | ControlFlowNode for FunctionExpr | test.py:33:5:33:17 | GSSA Variable test_example2 |
|
||||
| test.py:33:1:33:20 | GSSA Variable NestedObj | test.py:36:9:36:17 | ControlFlowNode for NestedObj |
|
||||
| test.py:33:1:33:20 | GSSA Variable SINK | test.py:41:5:41:8 | ControlFlowNode for SINK |
|
||||
| test.py:33:1:33:20 | GSSA Variable SOURCE | test.py:34:9:34:14 | ControlFlowNode for SOURCE |
|
||||
| test.py:34:5:34:5 | SSA variable x | test.py:38:17:38:17 | ControlFlowNode for x |
|
||||
| test.py:34:9:34:14 | ControlFlowNode for SOURCE | test.py:34:5:34:5 | SSA variable x |
|
||||
| test.py:36:5:36:5 | SSA variable a | test.py:38:5:38:5 | ControlFlowNode for a |
|
||||
| test.py:36:5:36:5 | SSA variable a | test.py:39:5:39:14 | SSA variable a |
|
||||
| test.py:36:9:36:19 | ControlFlowNode for NestedObj() | test.py:36:5:36:5 | SSA variable a |
|
||||
| test.py:38:5:38:5 | ControlFlowNode for a | test.py:39:5:39:5 | ControlFlowNode for a |
|
||||
| test.py:38:5:38:5 | [post read] ControlFlowNode for a | test.py:39:5:39:5 | ControlFlowNode for a |
|
||||
| test.py:38:17:38:17 | ControlFlowNode for x | test.py:39:22:39:22 | ControlFlowNode for x |
|
||||
| test.py:39:5:39:5 | ControlFlowNode for a | test.py:41:10:41:10 | ControlFlowNode for a |
|
||||
| test.py:39:5:39:5 | [post read] ControlFlowNode for a | test.py:41:10:41:10 | ControlFlowNode for a |
|
||||
| test.py:44:1:44:20 | ControlFlowNode for FunctionExpr | test.py:44:5:44:17 | GSSA Variable test_example3 |
|
||||
| test.py:44:1:44:20 | GSSA Variable MyObj | test.py:45:11:45:15 | ControlFlowNode for MyObj |
|
||||
| test.py:44:1:44:20 | GSSA Variable SINK | test.py:46:5:46:8 | ControlFlowNode for SINK |
|
||||
| test.py:44:1:44:20 | GSSA Variable SOURCE | test.py:45:17:45:22 | ControlFlowNode for SOURCE |
|
||||
| test.py:45:5:45:7 | SSA variable obj | test.py:46:10:46:12 | ControlFlowNode for obj |
|
||||
| test.py:45:11:45:23 | ControlFlowNode for MyObj() | test.py:45:5:45:7 | SSA variable obj |
|
||||
| test.py:49:1:49:30 | ControlFlowNode for FunctionExpr | test.py:49:5:49:26 | GSSA Variable fields_with_local_flow |
|
||||
| test.py:49:1:49:30 | GSSA Variable MyObj | test.py:50:11:50:15 | ControlFlowNode for MyObj |
|
||||
| test.py:49:28:49:28 | SSA variable x | test.py:50:11:50:18 | SSA variable x |
|
||||
| test.py:49:28:49:28 | SSA variable x | test.py:50:17:50:17 | ControlFlowNode for x |
|
||||
| test.py:50:5:50:7 | SSA variable obj | test.py:51:9:51:11 | ControlFlowNode for obj |
|
||||
| test.py:50:11:50:18 | ControlFlowNode for MyObj() | test.py:50:5:50:7 | SSA variable obj |
|
||||
| test.py:51:5:51:5 | SSA variable a | test.py:52:12:52:12 | ControlFlowNode for a |
|
||||
| test.py:51:9:51:15 | ControlFlowNode for Attribute | test.py:51:5:51:5 | SSA variable a |
|
||||
| test.py:55:1:55:18 | ControlFlowNode for FunctionExpr | test.py:55:5:55:15 | GSSA Variable test_fields |
|
||||
| test.py:55:1:55:18 | GSSA Variable SINK | test.py:56:5:56:8 | ControlFlowNode for SINK |
|
||||
| test.py:55:1:55:18 | GSSA Variable SOURCE | test.py:56:33:56:38 | ControlFlowNode for SOURCE |
|
||||
| test.py:55:1:55:18 | GSSA Variable fields_with_local_flow | test.py:56:10:56:31 | ControlFlowNode for fields_with_local_flow |
|
||||
| test.py:2:13:2:26 | ControlFlowNode for Str | test.py:2:1:2:9 | GSSA Variable NONSOURCE |
|
||||
| test.py:3:10:3:17 | ControlFlowNode for Str | test.py:3:1:3:6 | GSSA Variable SOURCE |
|
||||
| test.py:6:1:6:17 | ControlFlowNode for FunctionExpr | test.py:6:5:6:13 | GSSA Variable is_source |
|
||||
| test.py:6:15:6:15 | SSA variable x | test.py:7:5:7:78 | SSA variable x |
|
||||
| test.py:6:15:6:15 | SSA variable x | test.py:7:12:7:12 | ControlFlowNode for x |
|
||||
| test.py:6:15:6:15 | SSA variable x | test.py:7:29:7:29 | SSA variable x |
|
||||
| test.py:7:5:7:78 | SSA variable x | test.py:7:5:7:78 | SSA variable x |
|
||||
| test.py:7:5:7:78 | SSA variable x | test.py:7:5:7:78 | SSA variable x |
|
||||
| test.py:7:5:7:78 | SSA variable x | test.py:7:5:7:78 | SSA variable x |
|
||||
| test.py:7:5:7:78 | SSA variable x | test.py:7:5:7:78 | SSA variable x |
|
||||
| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x |
|
||||
| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x |
|
||||
| test.py:7:29:7:29 | SSA variable x | test.py:7:5:7:78 | SSA variable x |
|
||||
| test.py:7:29:7:29 | SSA variable x | test.py:7:47:7:47 | SSA variable x |
|
||||
| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x |
|
||||
| test.py:7:47:7:47 | SSA variable x | test.py:7:5:7:78 | SSA variable x |
|
||||
| test.py:7:47:7:47 | SSA variable x | test.py:7:58:7:58 | SSA variable x |
|
||||
| test.py:7:58:7:58 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x |
|
||||
| test.py:7:58:7:58 | SSA variable x | test.py:7:5:7:78 | SSA variable x |
|
||||
| test.py:7:58:7:58 | SSA variable x | test.py:7:71:7:71 | SSA variable x |
|
||||
| test.py:7:71:7:71 | SSA variable x | test.py:7:5:7:78 | SSA variable x |
|
||||
| test.py:10:1:10:12 | ControlFlowNode for FunctionExpr | test.py:10:5:10:8 | GSSA Variable SINK |
|
||||
| test.py:10:1:10:12 | GSSA Variable is_source | test.py:11:8:11:16 | ControlFlowNode for is_source |
|
||||
| test.py:10:10:10:10 | SSA variable x | test.py:11:18:11:18 | ControlFlowNode for x |
|
||||
| test.py:10:10:10:10 | SSA variable x | test.py:12:9:12:13 | SSA variable x |
|
||||
| test.py:10:10:10:10 | SSA variable x | test.py:14:9:14:13 | SSA variable x |
|
||||
| test.py:11:18:11:18 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x |
|
||||
| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x |
|
||||
| test.py:12:9:12:13 | SSA variable x | test.py:10:1:10:12 | SSA variable x |
|
||||
| test.py:14:9:14:13 | SSA variable x | test.py:10:1:10:12 | SSA variable x |
|
||||
| test.py:17:1:17:14 | ControlFlowNode for FunctionExpr | test.py:17:5:17:10 | GSSA Variable SINK_F |
|
||||
| test.py:17:1:17:14 | GSSA Variable is_source | test.py:18:8:18:16 | ControlFlowNode for is_source |
|
||||
| test.py:17:12:17:12 | SSA variable x | test.py:18:18:18:18 | ControlFlowNode for x |
|
||||
| test.py:17:12:17:12 | SSA variable x | test.py:19:9:19:13 | SSA variable x |
|
||||
| test.py:17:12:17:12 | SSA variable x | test.py:21:9:21:13 | SSA variable x |
|
||||
| test.py:18:18:18:18 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x |
|
||||
| test.py:18:18:18:18 | [post arg] ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x |
|
||||
| test.py:19:9:19:13 | SSA variable x | test.py:17:1:17:14 | SSA variable x |
|
||||
| test.py:21:9:21:13 | SSA variable x | test.py:17:1:17:14 | SSA variable x |
|
||||
| test.py:25:1:25:20 | ControlFlowNode for ClassExpr | test.py:25:7:25:11 | GSSA Variable MyObj |
|
||||
| test.py:25:13:25:18 | ControlFlowNode for object | test.py:30:17:30:22 | ControlFlowNode for object |
|
||||
| test.py:26:5:26:28 | ControlFlowNode for FunctionExpr | test.py:26:9:26:16 | SSA variable __init__ |
|
||||
| test.py:26:18:26:21 | SSA variable self | test.py:27:9:27:12 | ControlFlowNode for self |
|
||||
| test.py:26:18:26:21 | SSA variable self | test.py:27:9:27:16 | SSA variable self |
|
||||
| test.py:26:24:26:26 | SSA variable foo | test.py:27:20:27:22 | ControlFlowNode for foo |
|
||||
| test.py:30:1:30:24 | ControlFlowNode for ClassExpr | test.py:30:7:30:15 | GSSA Variable NestedObj |
|
||||
| test.py:31:5:31:23 | ControlFlowNode for FunctionExpr | test.py:31:9:31:16 | SSA variable __init__ |
|
||||
| test.py:31:5:31:23 | GSSA Variable MyObj | test.py:32:20:32:24 | ControlFlowNode for MyObj |
|
||||
| test.py:31:18:31:21 | SSA variable self | test.py:32:9:32:12 | ControlFlowNode for self |
|
||||
| test.py:31:18:31:21 | SSA variable self | test.py:32:9:32:16 | SSA variable self |
|
||||
| test.py:34:5:34:21 | ControlFlowNode for FunctionExpr | test.py:34:9:34:14 | SSA variable getObj |
|
||||
| test.py:34:16:34:19 | SSA variable self | test.py:35:16:35:19 | ControlFlowNode for self |
|
||||
| test.py:38:1:38:19 | ControlFlowNode for FunctionExpr | test.py:38:5:38:10 | GSSA Variable setFoo |
|
||||
| test.py:38:1:38:19 | GSSA Variable SINK_F | test.py:39:5:39:10 | ControlFlowNode for SINK_F |
|
||||
| test.py:38:12:38:14 | SSA variable obj | test.py:39:12:39:14 | ControlFlowNode for obj |
|
||||
| test.py:38:12:38:14 | SSA variable obj | test.py:40:5:40:11 | SSA variable obj |
|
||||
| test.py:38:17:38:17 | SSA variable x | test.py:40:15:40:15 | ControlFlowNode for x |
|
||||
| test.py:39:12:39:14 | ControlFlowNode for obj | test.py:40:5:40:7 | ControlFlowNode for obj |
|
||||
| test.py:39:12:39:14 | [post read] ControlFlowNode for obj | test.py:40:5:40:7 | ControlFlowNode for obj |
|
||||
| test.py:43:1:43:20 | ControlFlowNode for FunctionExpr | test.py:43:5:43:17 | GSSA Variable test_example1 |
|
||||
| test.py:43:1:43:20 | GSSA Variable MyObj | test.py:44:13:44:17 | ControlFlowNode for MyObj |
|
||||
| test.py:43:1:43:20 | GSSA Variable SINK | test.py:47:5:47:8 | ControlFlowNode for SINK |
|
||||
| test.py:43:1:43:20 | GSSA Variable SOURCE | test.py:46:19:46:24 | ControlFlowNode for SOURCE |
|
||||
| test.py:43:1:43:20 | GSSA Variable setFoo | test.py:46:5:46:10 | ControlFlowNode for setFoo |
|
||||
| test.py:44:5:44:9 | SSA variable myobj | test.py:46:5:46:25 | SSA variable myobj |
|
||||
| test.py:44:5:44:9 | SSA variable myobj | test.py:46:12:46:16 | ControlFlowNode for myobj |
|
||||
| test.py:44:13:44:23 | ControlFlowNode for MyObj() | test.py:44:5:44:9 | SSA variable myobj |
|
||||
| test.py:46:12:46:16 | ControlFlowNode for myobj | test.py:47:10:47:14 | ControlFlowNode for myobj |
|
||||
| test.py:46:12:46:16 | [post arg] ControlFlowNode for myobj | test.py:47:10:47:14 | ControlFlowNode for myobj |
|
||||
| test.py:50:1:50:20 | ControlFlowNode for FunctionExpr | test.py:50:5:50:17 | GSSA Variable test_example2 |
|
||||
| test.py:50:1:50:20 | GSSA Variable NestedObj | test.py:53:9:53:17 | ControlFlowNode for NestedObj |
|
||||
| test.py:50:1:50:20 | GSSA Variable SINK | test.py:58:5:58:8 | ControlFlowNode for SINK |
|
||||
| test.py:50:1:50:20 | GSSA Variable SOURCE | test.py:51:9:51:14 | ControlFlowNode for SOURCE |
|
||||
| test.py:51:5:51:5 | SSA variable x | test.py:55:17:55:17 | ControlFlowNode for x |
|
||||
| test.py:51:9:51:14 | ControlFlowNode for SOURCE | test.py:51:5:51:5 | SSA variable x |
|
||||
| test.py:53:5:53:5 | SSA variable a | test.py:55:5:55:5 | ControlFlowNode for a |
|
||||
| test.py:53:5:53:5 | SSA variable a | test.py:56:5:56:14 | SSA variable a |
|
||||
| test.py:53:9:53:19 | ControlFlowNode for NestedObj() | test.py:53:5:53:5 | SSA variable a |
|
||||
| test.py:55:5:55:5 | ControlFlowNode for a | test.py:56:5:56:5 | ControlFlowNode for a |
|
||||
| test.py:55:5:55:5 | [post read] ControlFlowNode for a | test.py:56:5:56:5 | ControlFlowNode for a |
|
||||
| test.py:55:17:55:17 | ControlFlowNode for x | test.py:56:22:56:22 | ControlFlowNode for x |
|
||||
| test.py:56:5:56:5 | ControlFlowNode for a | test.py:58:10:58:10 | ControlFlowNode for a |
|
||||
| test.py:56:5:56:5 | [post read] ControlFlowNode for a | test.py:58:10:58:10 | ControlFlowNode for a |
|
||||
| test.py:61:1:61:20 | ControlFlowNode for FunctionExpr | test.py:61:5:61:17 | GSSA Variable test_example3 |
|
||||
| test.py:61:1:61:20 | GSSA Variable MyObj | test.py:62:11:62:15 | ControlFlowNode for MyObj |
|
||||
| test.py:61:1:61:20 | GSSA Variable SINK | test.py:63:5:63:8 | ControlFlowNode for SINK |
|
||||
| test.py:61:1:61:20 | GSSA Variable SOURCE | test.py:62:17:62:22 | ControlFlowNode for SOURCE |
|
||||
| test.py:62:5:62:7 | SSA variable obj | test.py:63:10:63:12 | ControlFlowNode for obj |
|
||||
| test.py:62:11:62:23 | ControlFlowNode for MyObj() | test.py:62:5:62:7 | SSA variable obj |
|
||||
| test.py:66:1:66:23 | ControlFlowNode for FunctionExpr | test.py:66:5:66:20 | GSSA Variable test_example3_kw |
|
||||
| test.py:66:1:66:23 | GSSA Variable MyObj | test.py:67:11:67:15 | ControlFlowNode for MyObj |
|
||||
| test.py:66:1:66:23 | GSSA Variable SINK | test.py:68:5:68:8 | ControlFlowNode for SINK |
|
||||
| test.py:66:1:66:23 | GSSA Variable SOURCE | test.py:67:21:67:26 | ControlFlowNode for SOURCE |
|
||||
| test.py:67:5:67:7 | SSA variable obj | test.py:68:10:68:12 | ControlFlowNode for obj |
|
||||
| test.py:67:11:67:27 | ControlFlowNode for MyObj() | test.py:67:5:67:7 | SSA variable obj |
|
||||
| test.py:71:1:71:30 | ControlFlowNode for FunctionExpr | test.py:71:5:71:26 | GSSA Variable fields_with_local_flow |
|
||||
| test.py:71:1:71:30 | GSSA Variable MyObj | test.py:72:11:72:15 | ControlFlowNode for MyObj |
|
||||
| test.py:71:28:71:28 | SSA variable x | test.py:72:11:72:18 | SSA variable x |
|
||||
| test.py:71:28:71:28 | SSA variable x | test.py:72:17:72:17 | ControlFlowNode for x |
|
||||
| test.py:72:5:72:7 | SSA variable obj | test.py:73:9:73:11 | ControlFlowNode for obj |
|
||||
| test.py:72:11:72:18 | ControlFlowNode for MyObj() | test.py:72:5:72:7 | SSA variable obj |
|
||||
| test.py:73:5:73:5 | SSA variable a | test.py:74:12:74:12 | ControlFlowNode for a |
|
||||
| test.py:73:9:73:15 | ControlFlowNode for Attribute | test.py:73:5:73:5 | SSA variable a |
|
||||
| test.py:77:1:77:18 | ControlFlowNode for FunctionExpr | test.py:77:5:77:15 | GSSA Variable test_fields |
|
||||
| test.py:77:1:77:18 | GSSA Variable SINK | test.py:78:5:78:8 | ControlFlowNode for SINK |
|
||||
| test.py:77:1:77:18 | GSSA Variable SOURCE | test.py:78:33:78:38 | ControlFlowNode for SOURCE |
|
||||
| test.py:77:1:77:18 | GSSA Variable fields_with_local_flow | test.py:78:10:78:31 | ControlFlowNode for fields_with_local_flow |
|
||||
|
||||
@@ -21,6 +21,7 @@ edges
|
||||
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:46:19:46:24 | ControlFlowNode for SOURCE |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:51:9:51:14 | ControlFlowNode for SOURCE |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:62:17:62:22 | ControlFlowNode for SOURCE |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:67:21:67:26 | ControlFlowNode for SOURCE |
|
||||
| test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test | test.py:78:33:78:38 | ControlFlowNode for SOURCE |
|
||||
| test.py:3:1:3:6 | GSSA Variable SOURCE | test.py:0:0:0:0 | ModuleVariableNode for Global Variable SOURCE in Module test |
|
||||
| test.py:3:10:3:17 | ControlFlowNode for Str | test.py:3:1:3:6 | GSSA Variable SOURCE |
|
||||
@@ -36,6 +37,9 @@ edges
|
||||
| test.py:62:11:62:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:63:10:63:12 | ControlFlowNode for obj [Attribute foo] |
|
||||
| test.py:62:17:62:22 | ControlFlowNode for SOURCE | test.py:62:11:62:23 | ControlFlowNode for MyObj() [Attribute foo] |
|
||||
| test.py:63:10:63:12 | ControlFlowNode for obj [Attribute foo] | test.py:63:10:63:16 | ControlFlowNode for Attribute |
|
||||
| test.py:67:11:67:27 | ControlFlowNode for MyObj() [Attribute foo] | test.py:68:10:68:12 | ControlFlowNode for obj [Attribute foo] |
|
||||
| test.py:67:21:67:26 | ControlFlowNode for SOURCE | test.py:67:11:67:27 | ControlFlowNode for MyObj() [Attribute foo] |
|
||||
| test.py:68:10:68:12 | ControlFlowNode for obj [Attribute foo] | test.py:68:10:68:16 | ControlFlowNode for Attribute |
|
||||
| test.py:78:33:78:38 | ControlFlowNode for SOURCE | test.py:78:10:78:39 | ControlFlowNode for fields_with_local_flow() |
|
||||
nodes
|
||||
| examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj [Attribute foo] | semmle.label | [post arg] ControlFlowNode for myobj [Attribute foo] |
|
||||
@@ -73,6 +77,10 @@ nodes
|
||||
| test.py:62:17:62:22 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| test.py:63:10:63:12 | ControlFlowNode for obj [Attribute foo] | semmle.label | ControlFlowNode for obj [Attribute foo] |
|
||||
| test.py:63:10:63:16 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute |
|
||||
| test.py:67:11:67:27 | ControlFlowNode for MyObj() [Attribute foo] | semmle.label | ControlFlowNode for MyObj() [Attribute foo] |
|
||||
| test.py:67:21:67:26 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
| test.py:68:10:68:12 | ControlFlowNode for obj [Attribute foo] | semmle.label | ControlFlowNode for obj [Attribute foo] |
|
||||
| test.py:68:10:68:16 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute |
|
||||
| test.py:78:10:78:39 | ControlFlowNode for fields_with_local_flow() | semmle.label | ControlFlowNode for fields_with_local_flow() |
|
||||
| test.py:78:33:78:38 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE |
|
||||
#select
|
||||
@@ -92,5 +100,7 @@ nodes
|
||||
| test.py:58:10:58:18 | ControlFlowNode for Attribute | test.py:51:9:51:14 | ControlFlowNode for SOURCE | test.py:58:10:58:18 | ControlFlowNode for Attribute | Flow found |
|
||||
| test.py:63:10:63:16 | ControlFlowNode for Attribute | test.py:3:10:3:17 | ControlFlowNode for Str | test.py:63:10:63:16 | ControlFlowNode for Attribute | Flow found |
|
||||
| test.py:63:10:63:16 | ControlFlowNode for Attribute | test.py:62:17:62:22 | ControlFlowNode for SOURCE | test.py:63:10:63:16 | ControlFlowNode for Attribute | Flow found |
|
||||
| test.py:68:10:68:16 | ControlFlowNode for Attribute | test.py:3:10:3:17 | ControlFlowNode for Str | test.py:68:10:68:16 | ControlFlowNode for Attribute | Flow found |
|
||||
| test.py:68:10:68:16 | ControlFlowNode for Attribute | test.py:67:21:67:26 | ControlFlowNode for SOURCE | test.py:68:10:68:16 | ControlFlowNode for Attribute | Flow found |
|
||||
| test.py:78:10:78:39 | ControlFlowNode for fields_with_local_flow() | test.py:3:10:3:17 | ControlFlowNode for Str | test.py:78:10:78:39 | ControlFlowNode for fields_with_local_flow() | Flow found |
|
||||
| test.py:78:10:78:39 | ControlFlowNode for fields_with_local_flow() | test.py:78:33:78:38 | ControlFlowNode for SOURCE | test.py:78:10:78:39 | ControlFlowNode for fields_with_local_flow() | Flow found |
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,10 +5,10 @@
|
||||
| examples.py:46:9:46:16 | ControlFlowNode for MyObj() | examples.py:46:3:46:5 | SSA variable obj |
|
||||
| examples.py:47:3:47:3 | SSA variable a | examples.py:48:10:48:10 | ControlFlowNode for a |
|
||||
| examples.py:47:7:47:13 | ControlFlowNode for Attribute | examples.py:47:3:47:3 | SSA variable a |
|
||||
| test.py:49:1:49:30 | GSSA Variable MyObj | test.py:50:11:50:15 | ControlFlowNode for MyObj |
|
||||
| test.py:49:28:49:28 | SSA variable x | test.py:50:11:50:18 | SSA variable x |
|
||||
| test.py:49:28:49:28 | SSA variable x | test.py:50:17:50:17 | ControlFlowNode for x |
|
||||
| test.py:50:5:50:7 | SSA variable obj | test.py:51:9:51:11 | ControlFlowNode for obj |
|
||||
| test.py:50:11:50:18 | ControlFlowNode for MyObj() | test.py:50:5:50:7 | SSA variable obj |
|
||||
| test.py:51:5:51:5 | SSA variable a | test.py:52:12:52:12 | ControlFlowNode for a |
|
||||
| test.py:51:9:51:15 | ControlFlowNode for Attribute | test.py:51:5:51:5 | SSA variable a |
|
||||
| test.py:71:1:71:30 | GSSA Variable MyObj | test.py:72:11:72:15 | ControlFlowNode for MyObj |
|
||||
| test.py:71:28:71:28 | SSA variable x | test.py:72:11:72:18 | SSA variable x |
|
||||
| test.py:71:28:71:28 | SSA variable x | test.py:72:17:72:17 | ControlFlowNode for x |
|
||||
| test.py:72:5:72:7 | SSA variable obj | test.py:73:9:73:11 | ControlFlowNode for obj |
|
||||
| test.py:72:11:72:18 | ControlFlowNode for MyObj() | test.py:72:5:72:7 | SSA variable obj |
|
||||
| test.py:73:5:73:5 | SSA variable a | test.py:74:12:74:12 | ControlFlowNode for a |
|
||||
| test.py:73:9:73:15 | ControlFlowNode for Attribute | test.py:73:5:73:5 | SSA variable a |
|
||||
|
||||
@@ -24,29 +24,43 @@
|
||||
| examples.py:46:15:46:15 | [post arg] ControlFlowNode for x | examples.py:46:15:46:15 | ControlFlowNode for x |
|
||||
| examples.py:47:7:47:9 | [post read] ControlFlowNode for obj | examples.py:47:7:47:9 | ControlFlowNode for obj |
|
||||
| examples.py:50:29:50:34 | [post arg] ControlFlowNode for SOURCE | examples.py:50:29:50:34 | ControlFlowNode for SOURCE |
|
||||
| test.py:9:9:9:12 | [post store] ControlFlowNode for self | test.py:9:9:9:12 | ControlFlowNode for self |
|
||||
| test.py:15:9:15:12 | [post store] ControlFlowNode for self | test.py:15:9:15:12 | ControlFlowNode for self |
|
||||
| test.py:15:20:15:30 | ControlFlowNode for MyObj() | test.py:15:20:15:30 | [pre objCreate] ControlFlowNode for MyObj() |
|
||||
| test.py:15:26:15:29 | [post arg] ControlFlowNode for Str | test.py:15:26:15:29 | ControlFlowNode for Str |
|
||||
| test.py:18:16:18:19 | [post read] ControlFlowNode for self | test.py:18:16:18:19 | ControlFlowNode for self |
|
||||
| test.py:22:12:22:14 | [post read] ControlFlowNode for obj | test.py:22:12:22:14 | ControlFlowNode for obj |
|
||||
| test.py:23:5:23:7 | [post store] ControlFlowNode for obj | test.py:23:5:23:7 | ControlFlowNode for obj |
|
||||
| test.py:27:13:27:23 | ControlFlowNode for MyObj() | test.py:27:13:27:23 | [pre objCreate] ControlFlowNode for MyObj() |
|
||||
| test.py:27:19:27:22 | [post arg] ControlFlowNode for Str | test.py:27:19:27:22 | ControlFlowNode for Str |
|
||||
| test.py:29:12:29:16 | [post arg] ControlFlowNode for myobj | test.py:29:12:29:16 | ControlFlowNode for myobj |
|
||||
| test.py:29:19:29:24 | [post arg] ControlFlowNode for SOURCE | test.py:29:19:29:24 | ControlFlowNode for SOURCE |
|
||||
| test.py:30:10:30:14 | [post read] ControlFlowNode for myobj | test.py:30:10:30:14 | ControlFlowNode for myobj |
|
||||
| test.py:36:9:36:19 | ControlFlowNode for NestedObj() | test.py:36:9:36:19 | [pre objCreate] ControlFlowNode for NestedObj() |
|
||||
| test.py:38:5:38:5 | [post read] ControlFlowNode for a | test.py:38:5:38:5 | ControlFlowNode for a |
|
||||
| test.py:38:5:38:9 | [post store] ControlFlowNode for Attribute | test.py:38:5:38:9 | ControlFlowNode for Attribute |
|
||||
| test.py:39:5:39:5 | [post read] ControlFlowNode for a | test.py:39:5:39:5 | ControlFlowNode for a |
|
||||
| test.py:39:5:39:14 | [post store] ControlFlowNode for Attribute() | test.py:39:5:39:14 | ControlFlowNode for Attribute() |
|
||||
| test.py:41:10:41:10 | [post read] ControlFlowNode for a | test.py:41:10:41:10 | ControlFlowNode for a |
|
||||
| test.py:41:10:41:14 | [post read] ControlFlowNode for Attribute | test.py:41:10:41:14 | ControlFlowNode for Attribute |
|
||||
| test.py:45:11:45:23 | ControlFlowNode for MyObj() | test.py:45:11:45:23 | [pre objCreate] ControlFlowNode for MyObj() |
|
||||
| test.py:45:17:45:22 | [post arg] ControlFlowNode for SOURCE | test.py:45:17:45:22 | ControlFlowNode for SOURCE |
|
||||
| test.py:46:10:46:12 | [post read] ControlFlowNode for obj | test.py:46:10:46:12 | ControlFlowNode for obj |
|
||||
| test.py:50:11:50:18 | ControlFlowNode for MyObj() | test.py:50:11:50:18 | [pre objCreate] ControlFlowNode for MyObj() |
|
||||
| test.py:50:17:50:17 | [post arg] ControlFlowNode for x | test.py:50:17:50:17 | ControlFlowNode for x |
|
||||
| test.py:51:9:51:11 | [post read] ControlFlowNode for obj | test.py:51:9:51:11 | ControlFlowNode for obj |
|
||||
| test.py:56:33:56:38 | [post arg] ControlFlowNode for SOURCE | test.py:56:33:56:38 | ControlFlowNode for SOURCE |
|
||||
| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:11:18:11:18 | ControlFlowNode for x |
|
||||
| test.py:18:18:18:18 | [post arg] ControlFlowNode for x | test.py:18:18:18:18 | ControlFlowNode for x |
|
||||
| test.py:19:15:19:31 | [post arg] ControlFlowNode for Str | test.py:19:15:19:31 | ControlFlowNode for Str |
|
||||
| test.py:19:34:19:34 | [post arg] ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x |
|
||||
| test.py:21:15:21:18 | [post arg] ControlFlowNode for Str | test.py:21:15:21:18 | ControlFlowNode for Str |
|
||||
| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:27:9:27:12 | ControlFlowNode for self |
|
||||
| test.py:32:9:32:12 | [post store] ControlFlowNode for self | test.py:32:9:32:12 | ControlFlowNode for self |
|
||||
| test.py:32:20:32:30 | ControlFlowNode for MyObj() | test.py:32:20:32:30 | [pre objCreate] ControlFlowNode for MyObj() |
|
||||
| test.py:32:26:32:29 | [post arg] ControlFlowNode for Str | test.py:32:26:32:29 | ControlFlowNode for Str |
|
||||
| test.py:35:16:35:19 | [post read] ControlFlowNode for self | test.py:35:16:35:19 | ControlFlowNode for self |
|
||||
| test.py:39:12:39:14 | [post read] ControlFlowNode for obj | test.py:39:12:39:14 | ControlFlowNode for obj |
|
||||
| test.py:39:12:39:18 | [post arg] ControlFlowNode for Attribute | test.py:39:12:39:18 | ControlFlowNode for Attribute |
|
||||
| test.py:40:5:40:7 | [post store] ControlFlowNode for obj | test.py:40:5:40:7 | ControlFlowNode for obj |
|
||||
| test.py:44:13:44:23 | ControlFlowNode for MyObj() | test.py:44:13:44:23 | [pre objCreate] ControlFlowNode for MyObj() |
|
||||
| test.py:44:19:44:22 | [post arg] ControlFlowNode for Str | test.py:44:19:44:22 | ControlFlowNode for Str |
|
||||
| test.py:46:12:46:16 | [post arg] ControlFlowNode for myobj | test.py:46:12:46:16 | ControlFlowNode for myobj |
|
||||
| test.py:46:19:46:24 | [post arg] ControlFlowNode for SOURCE | test.py:46:19:46:24 | ControlFlowNode for SOURCE |
|
||||
| test.py:47:10:47:14 | [post read] ControlFlowNode for myobj | test.py:47:10:47:14 | ControlFlowNode for myobj |
|
||||
| test.py:47:10:47:18 | [post arg] ControlFlowNode for Attribute | test.py:47:10:47:18 | ControlFlowNode for Attribute |
|
||||
| test.py:53:9:53:19 | ControlFlowNode for NestedObj() | test.py:53:9:53:19 | [pre objCreate] ControlFlowNode for NestedObj() |
|
||||
| test.py:55:5:55:5 | [post read] ControlFlowNode for a | test.py:55:5:55:5 | ControlFlowNode for a |
|
||||
| test.py:55:5:55:9 | [post store] ControlFlowNode for Attribute | test.py:55:5:55:9 | ControlFlowNode for Attribute |
|
||||
| test.py:56:5:56:5 | [post read] ControlFlowNode for a | test.py:56:5:56:5 | ControlFlowNode for a |
|
||||
| test.py:56:5:56:14 | [post store] ControlFlowNode for Attribute() | test.py:56:5:56:14 | ControlFlowNode for Attribute() |
|
||||
| test.py:58:10:58:10 | [post read] ControlFlowNode for a | test.py:58:10:58:10 | ControlFlowNode for a |
|
||||
| test.py:58:10:58:14 | [post read] ControlFlowNode for Attribute | test.py:58:10:58:14 | ControlFlowNode for Attribute |
|
||||
| test.py:58:10:58:18 | [post arg] ControlFlowNode for Attribute | test.py:58:10:58:18 | ControlFlowNode for Attribute |
|
||||
| test.py:62:11:62:23 | ControlFlowNode for MyObj() | test.py:62:11:62:23 | [pre objCreate] ControlFlowNode for MyObj() |
|
||||
| test.py:62:17:62:22 | [post arg] ControlFlowNode for SOURCE | test.py:62:17:62:22 | ControlFlowNode for SOURCE |
|
||||
| test.py:63:10:63:12 | [post read] ControlFlowNode for obj | test.py:63:10:63:12 | ControlFlowNode for obj |
|
||||
| test.py:63:10:63:16 | [post arg] ControlFlowNode for Attribute | test.py:63:10:63:16 | ControlFlowNode for Attribute |
|
||||
| test.py:67:11:67:27 | ControlFlowNode for MyObj() | test.py:67:11:67:27 | [pre objCreate] ControlFlowNode for MyObj() |
|
||||
| test.py:67:21:67:26 | [post arg] ControlFlowNode for SOURCE | test.py:67:21:67:26 | ControlFlowNode for SOURCE |
|
||||
| test.py:68:10:68:12 | [post read] ControlFlowNode for obj | test.py:68:10:68:12 | ControlFlowNode for obj |
|
||||
| test.py:68:10:68:16 | [post arg] ControlFlowNode for Attribute | test.py:68:10:68:16 | ControlFlowNode for Attribute |
|
||||
| test.py:72:11:72:18 | ControlFlowNode for MyObj() | test.py:72:11:72:18 | [pre objCreate] ControlFlowNode for MyObj() |
|
||||
| test.py:72:17:72:17 | [post arg] ControlFlowNode for x | test.py:72:17:72:17 | ControlFlowNode for x |
|
||||
| test.py:73:9:73:11 | [post read] ControlFlowNode for obj | test.py:73:9:73:11 | ControlFlowNode for obj |
|
||||
| test.py:78:10:78:39 | [post arg] ControlFlowNode for fields_with_local_flow() | test.py:78:10:78:39 | ControlFlowNode for fields_with_local_flow() |
|
||||
| test.py:78:33:78:38 | [post arg] ControlFlowNode for SOURCE | test.py:78:33:78:38 | ControlFlowNode for SOURCE |
|
||||
|
||||
@@ -65,7 +65,7 @@ def test_example3():
|
||||
|
||||
def test_example3_kw():
|
||||
obj = MyObj(foo=SOURCE)
|
||||
SINK(obj.foo) # Flow not found
|
||||
SINK(obj.foo)
|
||||
|
||||
|
||||
def fields_with_local_flow(x):
|
||||
|
||||
Reference in New Issue
Block a user