Skip to content

Commit 3ec5358

Browse files
committed
wip2
1 parent 90d7b4c commit 3ec5358

File tree

5 files changed

+60
-20
lines changed

5 files changed

+60
-20
lines changed

csharp/ql/test/library-tests/dataflow/reverse-flow/ReverseFlow.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,31 @@ public void M9(A a)
5858
a.Nested.Field = Source<string>(3);
5959
}
6060

61+
public void M10()
62+
{
63+
var a = new A();
64+
Sink(a);
65+
Sink(a.Nested.Nested.Field);
66+
GetNestedNested(a).Field = Source<string>(4);
67+
Sink(a.Nested.Nested.Field); // $ hasValueFlow=4
68+
}
69+
70+
public void M11(A a)
71+
{
72+
73+
}
74+
75+
public void M11()
76+
{
77+
var a = new A();
78+
M11(a);
79+
Sink(a.Field);
80+
a.Field = Source<string>(5);
81+
Sink(a.Field); // $ hasValueFlow=5
82+
}
83+
84+
public A GetNestedNested(A a) => a.Nested.Nested;
85+
6186
public static void Sink(object o) { }
6287

6388
static T Source<T>(object source) => throw null;

csharp/ql/test/library-tests/dataflow/reverse-flow/ReverseFlow.expected

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@ edges
3434
| ReverseFlow.cs:58:9:58:9 | [post] access to parameter a : A [field Nested, field Field] : String | ReverseFlow.cs:56:22:56:22 | a [Return] : A [field Nested, field Field] : String | provenance | |
3535
| ReverseFlow.cs:58:9:58:16 | [post] access to field Nested : A [field Field] : String | ReverseFlow.cs:58:9:58:9 | [post] access to parameter a : A [field Nested, field Field] : String | provenance | |
3636
| ReverseFlow.cs:58:26:58:42 | call to method Source<String> : String | ReverseFlow.cs:58:9:58:16 | [post] access to field Nested : A [field Field] : String | provenance | |
37+
| ReverseFlow.cs:66:9:66:26 | [post] call to method GetNestedNested : A [field Field] : String | ReverseFlow.cs:66:9:66:26 | call to method GetNestedNested [Reverse] : A [field Field] : String | provenance | |
38+
| ReverseFlow.cs:66:9:66:26 | call to method GetNestedNested [Reverse] : A [field Field] : String | ReverseFlow.cs:66:25:66:25 | [post] access to local variable a : A [field Nested, field Nested, field Field] : String | provenance | |
39+
| ReverseFlow.cs:66:9:66:26 | call to method GetNestedNested [Reverse] : A [field Field] : String | ReverseFlow.cs:84:38:84:52 | access to field Nested [Reverse] : A [field Field] : String | provenance | |
40+
| ReverseFlow.cs:66:25:66:25 | [post] access to local variable a : A [field Nested, field Nested, field Field] : String | ReverseFlow.cs:67:14:67:14 | access to local variable a : A [field Nested, field Nested, field Field] : String | provenance | |
41+
| ReverseFlow.cs:66:36:66:52 | call to method Source<String> : String | ReverseFlow.cs:66:9:66:26 | [post] call to method GetNestedNested : A [field Field] : String | provenance | |
42+
| ReverseFlow.cs:67:14:67:14 | access to local variable a : A [field Nested, field Nested, field Field] : String | ReverseFlow.cs:67:14:67:21 | access to field Nested : A [field Nested, field Field] : String | provenance | |
43+
| ReverseFlow.cs:67:14:67:21 | access to field Nested : A [field Nested, field Field] : String | ReverseFlow.cs:67:14:67:28 | access to field Nested : A [field Field] : String | provenance | |
44+
| ReverseFlow.cs:67:14:67:28 | access to field Nested : A [field Field] : String | ReverseFlow.cs:67:14:67:34 | access to field Field | provenance | |
45+
| ReverseFlow.cs:80:9:80:9 | [post] access to local variable a : A [field Field] : String | ReverseFlow.cs:81:14:81:14 | access to local variable a : A [field Field] : String | provenance | |
46+
| ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | ReverseFlow.cs:80:9:80:9 | [post] access to local variable a : A [field Field] : String | provenance | |
47+
| ReverseFlow.cs:81:14:81:14 | access to local variable a : A [field Field] : String | ReverseFlow.cs:81:14:81:20 | access to field Field | provenance | |
48+
| ReverseFlow.cs:84:38:84:38 | access to parameter a [Reverse] : A [field Nested, field Nested, field Field] : String | ReverseFlow.cs:84:32:84:32 | a [Return] : A [field Nested, field Nested, field Field] : String | provenance | |
49+
| ReverseFlow.cs:84:38:84:45 | access to field Nested [Reverse] : A [field Nested, field Field] : String | ReverseFlow.cs:84:38:84:38 | access to parameter a [Reverse] : A [field Nested, field Nested, field Field] : String | provenance | |
50+
| ReverseFlow.cs:84:38:84:52 | access to field Nested [Reverse] : A [field Field] : String | ReverseFlow.cs:84:38:84:45 | access to field Nested [Reverse] : A [field Nested, field Field] : String | provenance | |
3751
nodes
3852
| ReverseFlow.cs:10:12:10:12 | [post] access to local variable a : A [field Nested, field Field] : String | semmle.label | [post] access to local variable a : A [field Nested, field Field] : String |
3953
| ReverseFlow.cs:11:14:11:14 | access to local variable a : A [field Nested, field Field] : String | semmle.label | access to local variable a : A [field Nested, field Field] : String |
@@ -72,8 +86,27 @@ nodes
7286
| ReverseFlow.cs:58:9:58:9 | [post] access to parameter a : A [field Nested, field Field] : String | semmle.label | [post] access to parameter a : A [field Nested, field Field] : String |
7387
| ReverseFlow.cs:58:9:58:16 | [post] access to field Nested : A [field Field] : String | semmle.label | [post] access to field Nested : A [field Field] : String |
7488
| ReverseFlow.cs:58:26:58:42 | call to method Source<String> : String | semmle.label | call to method Source<String> : String |
89+
| ReverseFlow.cs:66:9:66:26 | [post] call to method GetNestedNested : A [field Field] : String | semmle.label | [post] call to method GetNestedNested : A [field Field] : String |
90+
| ReverseFlow.cs:66:9:66:26 | call to method GetNestedNested [Reverse] : A [field Field] : String | semmle.label | call to method GetNestedNested [Reverse] : A [field Field] : String |
91+
| ReverseFlow.cs:66:25:66:25 | [post] access to local variable a : A [field Nested, field Nested, field Field] : String | semmle.label | [post] access to local variable a : A [field Nested, field Nested, field Field] : String |
92+
| ReverseFlow.cs:66:36:66:52 | call to method Source<String> : String | semmle.label | call to method Source<String> : String |
93+
| ReverseFlow.cs:67:14:67:14 | access to local variable a : A [field Nested, field Nested, field Field] : String | semmle.label | access to local variable a : A [field Nested, field Nested, field Field] : String |
94+
| ReverseFlow.cs:67:14:67:21 | access to field Nested : A [field Nested, field Field] : String | semmle.label | access to field Nested : A [field Nested, field Field] : String |
95+
| ReverseFlow.cs:67:14:67:28 | access to field Nested : A [field Field] : String | semmle.label | access to field Nested : A [field Field] : String |
96+
| ReverseFlow.cs:67:14:67:34 | access to field Field | semmle.label | access to field Field |
97+
| ReverseFlow.cs:80:9:80:9 | [post] access to local variable a : A [field Field] : String | semmle.label | [post] access to local variable a : A [field Field] : String |
98+
| ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | semmle.label | call to method Source<String> : String |
99+
| ReverseFlow.cs:81:14:81:14 | access to local variable a : A [field Field] : String | semmle.label | access to local variable a : A [field Field] : String |
100+
| ReverseFlow.cs:81:14:81:20 | access to field Field | semmle.label | access to field Field |
101+
| ReverseFlow.cs:84:32:84:32 | a [Return] : A [field Nested, field Nested, field Field] : String | semmle.label | a [Return] : A [field Nested, field Nested, field Field] : String |
102+
| ReverseFlow.cs:84:38:84:38 | access to parameter a [Reverse] : A [field Nested, field Nested, field Field] : String | semmle.label | access to parameter a [Reverse] : A [field Nested, field Nested, field Field] : String |
103+
| ReverseFlow.cs:84:38:84:45 | access to field Nested [Reverse] : A [field Nested, field Field] : String | semmle.label | access to field Nested [Reverse] : A [field Nested, field Field] : String |
104+
| ReverseFlow.cs:84:38:84:52 | access to field Nested [Reverse] : A [field Field] : String | semmle.label | access to field Nested [Reverse] : A [field Field] : String |
75105
subpaths
106+
| ReverseFlow.cs:66:9:66:26 | call to method GetNestedNested [Reverse] : A [field Field] : String | ReverseFlow.cs:84:38:84:52 | access to field Nested [Reverse] : A [field Field] : String | ReverseFlow.cs:84:32:84:32 | a [Return] : A [field Nested, field Nested, field Field] : String | ReverseFlow.cs:66:25:66:25 | [post] access to local variable a : A [field Nested, field Nested, field Field] : String |
76107
#select
77108
| ReverseFlow.cs:11:14:11:27 | access to field Field | ReverseFlow.cs:22:19:22:35 | call to method Source<String> : String | ReverseFlow.cs:11:14:11:27 | access to field Field | $@ | ReverseFlow.cs:22:19:22:35 | call to method Source<String> : String | call to method Source<String> : String |
78109
| ReverseFlow.cs:28:14:28:30 | access to field Field | ReverseFlow.cs:39:22:39:38 | call to method Source<String> : String | ReverseFlow.cs:28:14:28:30 | access to field Field | $@ | ReverseFlow.cs:39:22:39:38 | call to method Source<String> : String | call to method Source<String> : String |
79110
| ReverseFlow.cs:46:14:46:20 | access to field Field | ReverseFlow.cs:58:26:58:42 | call to method Source<String> : String | ReverseFlow.cs:46:14:46:20 | access to field Field | $@ | ReverseFlow.cs:58:26:58:42 | call to method Source<String> : String | call to method Source<String> : String |
111+
| ReverseFlow.cs:67:14:67:34 | access to field Field | ReverseFlow.cs:66:36:66:52 | call to method Source<String> : String | ReverseFlow.cs:67:14:67:34 | access to field Field | $@ | ReverseFlow.cs:66:36:66:52 | call to method Source<String> : String | call to method Source<String> : String |
112+
| ReverseFlow.cs:81:14:81:20 | access to field Field | ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | ReverseFlow.cs:81:14:81:20 | access to field Field | $@ | ReverseFlow.cs:80:19:80:35 | call to method Source<String> : String | call to method Source<String> : String |

shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -959,7 +959,8 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
959959
this.asNode().(ArgNode).argumentOf(call_, pos_.asArgumentPosition())
960960
or
961961
// this.asNodeReverse() = getAnOutNodeExt(call_, pos_.asReturnKind()) and
962-
this.asNodeReverse() = getAnOutNode(call_, pos_.asReturnKind().(ValueReturnKind).getKind()) //and
962+
this.asNodeReverse() = getAnOutNode(call_, pos_.asReturnKind().(ValueReturnKind).getKind()) and //and
963+
not this.asNodeReverse() instanceof PostUpdateNode // needed for swift
963964
// call_.toString().matches("%GetBox1%")
964965
}
965966

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,2 @@
11
testFailures
2-
| custom.swift:54:12:54:12 | mc1 | Unexpected result: tainted=data3 |
3-
| custom.swift:55:12:55:17 | ...[...] | Unexpected result: tainted=data3 |
4-
| custom.swift:62:12:62:12 | mc2 | Unexpected result: tainted=data4 |
5-
| custom.swift:63:12:63:17 | ...[...] | Unexpected result: tainted=data4 |
6-
| custom.swift:70:12:70:12 | mc3 | Unexpected result: tainted=data1 |
7-
| custom.swift:71:12:71:17 | ...[...] | Unexpected result: tainted=data1 |
8-
| custom.swift:78:12:78:12 | mc4 | Unexpected result: tainted=data1 |
9-
| custom.swift:79:12:79:17 | ...[...] | Unexpected result: tainted=data1 |
10-
| custom.swift:106:12:106:12 | mc6 | Unexpected result: tainted=data9 |
11-
| custom.swift:107:12:107:17 | ...[...] | Unexpected result: tainted=data9 |
122
failures
Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
1-
/**
2-
* @kind path-problem
3-
*/
4-
51
import TestUtilities.InlineFlowTest
62

73
string customTaintFlowTag() { result = "tainted" }
84

95
import FlowTest<NoFlowConfig, DefaultFlowConfig, defaultValueFlowTag/0, customTaintFlowTag/0>
10-
import PathGraph
11-
12-
from PathNode source, PathNode sink
13-
where flowPath(source, sink)
14-
select sink, source, sink, "$@", source, source.toString()

0 commit comments

Comments
 (0)