Skip to content

Commit b1b3487

Browse files
committed
Swift: Add a test for MaD data sources in generics.
1 parent ace7146 commit b1b3487

File tree

3 files changed

+169
-0
lines changed

3 files changed

+169
-0
lines changed

swift/ql/test/library-tests/dataflow/flowsources/FlowSources.expected

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@
55
| customurlschemes.swift:48:9:48:28 | ...[...] | Remote URL in UIApplicationDelegate.application.launchOptions |
66
| data.swift:18:20:18:20 | call to init(contentsOf:options:) | external |
77
| data.swift:18:20:18:54 | call to init(contentsOf:options:) | external |
8+
| file://:0:0:0:0 | .source1 | external |
9+
| file://:0:0:0:0 | .source9 | external |
10+
| generics.swift:10:9:10:16 | .source1 | external |
11+
| generics.swift:11:9:11:16 | .source2 | external |
12+
| generics.swift:12:9:12:24 | call to source3() | external |
13+
| generics.swift:65:9:65:18 | .source9 | external |
14+
| generics.swift:66:9:66:18 | .source10 | external |
15+
| generics.swift:67:9:67:27 | call to source11() | external |
16+
| generics.swift:68:9:68:18 | .source12 | external |
17+
| generics.swift:69:9:69:27 | call to source13() | external |
18+
| generics.swift:88:9:88:15 | .source1 | external |
19+
| generics.swift:89:9:89:15 | .source2 | external |
20+
| generics.swift:112:9:112:15 | .source1 | external |
21+
| generics.swift:113:9:113:15 | .source2 | external |
822
| nsdata.swift:18:17:18:17 | call to init(contentsOf:) | external |
923
| nsdata.swift:18:17:18:40 | call to init(contentsOf:) | external |
1024
| nsdata.swift:19:17:19:17 | call to init(contentsOf:options:) | external |
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,42 @@
11
import swift
22
import codeql.swift.dataflow.FlowSources
3+
import codeql.swift.dataflow.ExternalFlow
4+
5+
/**
6+
* Custom flow sources for this test. These cases ensure that MaD source
7+
* definitions are able to successfully match a range of class fields and
8+
* member functions.
9+
*/
10+
class CustomTestSourcesCsv extends SourceModelCsv {
11+
override predicate row(string row) {
12+
row =
13+
[
14+
";MySimpleClass;true;source1;;;;remote",
15+
";MySimpleClass;true;source2;;;;remote",
16+
";MySimpleClass;true;source3();;;ReturnValue;remote",
17+
// ---
18+
";MyGeneric;true;source1;;;;remote",
19+
";MyGeneric;true;source2;;;;remote",
20+
";MyGeneric;true;source3();;;ReturnValue;remote",
21+
";MyDerived;true;source4;;;;remote",
22+
";MyDerived;true;source5;;;;remote",
23+
";MyDerived;true;source6();;;ReturnValue;remote",
24+
";MyDerived;true;source7;;;;remote",
25+
";MyDerived;true;source8();;;ReturnValue;remote",
26+
";MyDerived2;true;source9;;;;remote",
27+
";MyDerived2;true;source10;;;;remote",
28+
";MyDerived2;true;source11();;;ReturnValue;remote",
29+
";MyDerived2;true;source12;;;;remote",
30+
";MyDerived2;true;source13();;;ReturnValue;remote",
31+
// ---
32+
";MyProtocol;true;source1;;;;remote",
33+
";MyProtocol;true;source2;;;;remote",
34+
// ---
35+
";MyProtocol2;true;source1;;;;remote",
36+
";MyProtocol2;true;source2;;;;remote",
37+
]
38+
}
39+
}
340

441
from RemoteFlowSource source
542
select source, concat(source.getSourceType(), ", ")
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
2+
class MySimpleClass
3+
{
4+
let source1: Int = 0
5+
var source2: Int { get { return 0 } }
6+
func source3() -> Int { return 0 }
7+
}
8+
9+
func useMySimpleClass(simple: MySimpleClass) {
10+
_ = simple.source1 // SOURCE
11+
_ = simple.source2 // SOURCE
12+
_ = simple.source3() // SOURCE
13+
}
14+
15+
// ---
16+
17+
class MyGeneric<T> {
18+
let source1: Int = 0
19+
var source2: T? { get { return nil } }
20+
func source3() -> Int { return 0 }
21+
}
22+
23+
class MyDerived<T> : MyGeneric<T> {
24+
let source4: Int = 0
25+
var source5: T? { get { return nil } }
26+
func source6() -> Int { return 0 }
27+
}
28+
29+
extension MyDerived
30+
{
31+
var source7: Int { get { return 0 } }
32+
func source8() -> Int { return 0 }
33+
}
34+
35+
class MyDerived2 : MyGeneric<Int> {
36+
let source9: Int = 0
37+
var source10: Int { get { return 0 } }
38+
func source11() -> Int { return 0 }
39+
}
40+
41+
extension MyDerived2
42+
{
43+
var source12: Int { get { return 0 } }
44+
func source13() -> Int { return 0 }
45+
}
46+
47+
func useDerived(generic: MyGeneric<Int>, generic2: MyGeneric<Any>, derived: MyDerived<Int>, derived2: MyDerived2) {
48+
_ = generic.source1 // SOURCE [NOT DETECTED]
49+
_ = generic.source2 // SOURCE [NOT DETECTED]
50+
_ = generic.source3() // SOURCE [NOT DETECTED]
51+
_ = generic2.source1 // SOURCE [NOT DETECTED]
52+
_ = generic2.source2 // SOURCE [NOT DETECTED]
53+
_ = generic2.source3() // SOURCE [NOT DETECTED]
54+
_ = derived.source1 // SOURCE [NOT DETECTED]
55+
_ = derived.source2 // SOURCE [NOT DETECTED]
56+
_ = derived.source3() // SOURCE [NOT DETECTED]
57+
_ = derived.source4 // SOURCE [NOT DETECTED]
58+
_ = derived.source5 // SOURCE [NOT DETECTED]
59+
_ = derived.source6() // SOURCE [NOT DETECTED]
60+
_ = derived.source7 // SOURCE [NOT DETECTED]
61+
_ = derived.source8() // SOURCE [NOT DETECTED]
62+
_ = derived2.source1 // SOURCE [NOT DETECTED]
63+
_ = derived2.source2 // SOURCE [NOT DETECTED]
64+
_ = derived2.source3() // SOURCE [NOT DETECTED]
65+
_ = derived2.source9 // SOURCE
66+
_ = derived2.source10 // SOURCE
67+
_ = derived2.source11() // SOURCE
68+
_ = derived2.source12 // SOURCE
69+
_ = derived2.source13() // SOURCE
70+
}
71+
72+
// ---
73+
74+
protocol MyProtocol {
75+
var source1: Int { get }
76+
var source2: Int { get }
77+
}
78+
79+
class MyImpl<T> : MyProtocol {
80+
var source1: Int { get { return 0 } }
81+
}
82+
83+
extension MyImpl {
84+
var source2: Int { get { return 0 } }
85+
}
86+
87+
func useProtocol(proto: MyProtocol, impl: MyImpl<Int>, impl2: MyImpl<Any>) {
88+
_ = proto.source1 // SOURCE
89+
_ = proto.source2 // SOURCE
90+
_ = impl.source1 // SOURCE [NOT DETECTED]
91+
_ = impl.source2 // SOURCE [NOT DETECTED]
92+
_ = impl2.source1 // SOURCE [NOT DETECTED]
93+
_ = impl2.source2 // SOURCE [NOT DETECTED]
94+
}
95+
96+
// ---
97+
98+
protocol MyProtocol2 {
99+
var source1: Int { get }
100+
var source2: Int { get }
101+
}
102+
103+
class MyImpl2<T> {
104+
var source1: Int { get { return 0 } }
105+
}
106+
107+
extension MyImpl2 : MyProtocol2 {
108+
var source2: Int { get { return 0 } }
109+
}
110+
111+
func useProtocol2(proto: MyProtocol2, impl: MyImpl2<Int>, impl2: MyImpl2<Any>) {
112+
_ = proto.source1 // SOURCE
113+
_ = proto.source2 // SOURCE
114+
_ = impl.source1 // SOURCE [NOT DETECTED]
115+
_ = impl.source2 // SOURCE [NOT DETECTED]
116+
_ = impl2.source1 // SOURCE [NOT DETECTED]
117+
_ = impl2.source2 // SOURCE [NOT DETECTED]
118+
}

0 commit comments

Comments
 (0)