mirror of
https://github.com/github/codeql.git
synced 2026-04-19 14:04:09 +02:00
Swift: Add a test for MaD data sources in generics.
This commit is contained in:
@@ -5,6 +5,20 @@
|
||||
| customurlschemes.swift:48:9:48:28 | ...[...] | Remote URL in UIApplicationDelegate.application.launchOptions |
|
||||
| data.swift:18:20:18:20 | call to init(contentsOf:options:) | external |
|
||||
| data.swift:18:20:18:54 | call to init(contentsOf:options:) | external |
|
||||
| file://:0:0:0:0 | .source1 | external |
|
||||
| file://:0:0:0:0 | .source9 | external |
|
||||
| generics.swift:10:9:10:16 | .source1 | external |
|
||||
| generics.swift:11:9:11:16 | .source2 | external |
|
||||
| generics.swift:12:9:12:24 | call to source3() | external |
|
||||
| generics.swift:65:9:65:18 | .source9 | external |
|
||||
| generics.swift:66:9:66:18 | .source10 | external |
|
||||
| generics.swift:67:9:67:27 | call to source11() | external |
|
||||
| generics.swift:68:9:68:18 | .source12 | external |
|
||||
| generics.swift:69:9:69:27 | call to source13() | external |
|
||||
| generics.swift:88:9:88:15 | .source1 | external |
|
||||
| generics.swift:89:9:89:15 | .source2 | external |
|
||||
| generics.swift:112:9:112:15 | .source1 | external |
|
||||
| generics.swift:113:9:113:15 | .source2 | external |
|
||||
| nsdata.swift:18:17:18:17 | call to init(contentsOf:) | external |
|
||||
| nsdata.swift:18:17:18:40 | call to init(contentsOf:) | external |
|
||||
| nsdata.swift:19:17:19:17 | call to init(contentsOf:options:) | external |
|
||||
|
||||
@@ -1,5 +1,42 @@
|
||||
import swift
|
||||
import codeql.swift.dataflow.FlowSources
|
||||
import codeql.swift.dataflow.ExternalFlow
|
||||
|
||||
/**
|
||||
* Custom flow sources for this test. These cases ensure that MaD source
|
||||
* definitions are able to successfully match a range of class fields and
|
||||
* member functions.
|
||||
*/
|
||||
class CustomTestSourcesCsv extends SourceModelCsv {
|
||||
override predicate row(string row) {
|
||||
row =
|
||||
[
|
||||
";MySimpleClass;true;source1;;;;remote",
|
||||
";MySimpleClass;true;source2;;;;remote",
|
||||
";MySimpleClass;true;source3();;;ReturnValue;remote",
|
||||
// ---
|
||||
";MyGeneric;true;source1;;;;remote",
|
||||
";MyGeneric;true;source2;;;;remote",
|
||||
";MyGeneric;true;source3();;;ReturnValue;remote",
|
||||
";MyDerived;true;source4;;;;remote",
|
||||
";MyDerived;true;source5;;;;remote",
|
||||
";MyDerived;true;source6();;;ReturnValue;remote",
|
||||
";MyDerived;true;source7;;;;remote",
|
||||
";MyDerived;true;source8();;;ReturnValue;remote",
|
||||
";MyDerived2;true;source9;;;;remote",
|
||||
";MyDerived2;true;source10;;;;remote",
|
||||
";MyDerived2;true;source11();;;ReturnValue;remote",
|
||||
";MyDerived2;true;source12;;;;remote",
|
||||
";MyDerived2;true;source13();;;ReturnValue;remote",
|
||||
// ---
|
||||
";MyProtocol;true;source1;;;;remote",
|
||||
";MyProtocol;true;source2;;;;remote",
|
||||
// ---
|
||||
";MyProtocol2;true;source1;;;;remote",
|
||||
";MyProtocol2;true;source2;;;;remote",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
from RemoteFlowSource source
|
||||
select source, concat(source.getSourceType(), ", ")
|
||||
|
||||
118
swift/ql/test/library-tests/dataflow/flowsources/generics.swift
Normal file
118
swift/ql/test/library-tests/dataflow/flowsources/generics.swift
Normal file
@@ -0,0 +1,118 @@
|
||||
|
||||
class MySimpleClass
|
||||
{
|
||||
let source1: Int = 0
|
||||
var source2: Int { get { return 0 } }
|
||||
func source3() -> Int { return 0 }
|
||||
}
|
||||
|
||||
func useMySimpleClass(simple: MySimpleClass) {
|
||||
_ = simple.source1 // SOURCE
|
||||
_ = simple.source2 // SOURCE
|
||||
_ = simple.source3() // SOURCE
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
class MyGeneric<T> {
|
||||
let source1: Int = 0
|
||||
var source2: T? { get { return nil } }
|
||||
func source3() -> Int { return 0 }
|
||||
}
|
||||
|
||||
class MyDerived<T> : MyGeneric<T> {
|
||||
let source4: Int = 0
|
||||
var source5: T? { get { return nil } }
|
||||
func source6() -> Int { return 0 }
|
||||
}
|
||||
|
||||
extension MyDerived
|
||||
{
|
||||
var source7: Int { get { return 0 } }
|
||||
func source8() -> Int { return 0 }
|
||||
}
|
||||
|
||||
class MyDerived2 : MyGeneric<Int> {
|
||||
let source9: Int = 0
|
||||
var source10: Int { get { return 0 } }
|
||||
func source11() -> Int { return 0 }
|
||||
}
|
||||
|
||||
extension MyDerived2
|
||||
{
|
||||
var source12: Int { get { return 0 } }
|
||||
func source13() -> Int { return 0 }
|
||||
}
|
||||
|
||||
func useDerived(generic: MyGeneric<Int>, generic2: MyGeneric<Any>, derived: MyDerived<Int>, derived2: MyDerived2) {
|
||||
_ = generic.source1 // SOURCE [NOT DETECTED]
|
||||
_ = generic.source2 // SOURCE [NOT DETECTED]
|
||||
_ = generic.source3() // SOURCE [NOT DETECTED]
|
||||
_ = generic2.source1 // SOURCE [NOT DETECTED]
|
||||
_ = generic2.source2 // SOURCE [NOT DETECTED]
|
||||
_ = generic2.source3() // SOURCE [NOT DETECTED]
|
||||
_ = derived.source1 // SOURCE [NOT DETECTED]
|
||||
_ = derived.source2 // SOURCE [NOT DETECTED]
|
||||
_ = derived.source3() // SOURCE [NOT DETECTED]
|
||||
_ = derived.source4 // SOURCE [NOT DETECTED]
|
||||
_ = derived.source5 // SOURCE [NOT DETECTED]
|
||||
_ = derived.source6() // SOURCE [NOT DETECTED]
|
||||
_ = derived.source7 // SOURCE [NOT DETECTED]
|
||||
_ = derived.source8() // SOURCE [NOT DETECTED]
|
||||
_ = derived2.source1 // SOURCE [NOT DETECTED]
|
||||
_ = derived2.source2 // SOURCE [NOT DETECTED]
|
||||
_ = derived2.source3() // SOURCE [NOT DETECTED]
|
||||
_ = derived2.source9 // SOURCE
|
||||
_ = derived2.source10 // SOURCE
|
||||
_ = derived2.source11() // SOURCE
|
||||
_ = derived2.source12 // SOURCE
|
||||
_ = derived2.source13() // SOURCE
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
protocol MyProtocol {
|
||||
var source1: Int { get }
|
||||
var source2: Int { get }
|
||||
}
|
||||
|
||||
class MyImpl<T> : MyProtocol {
|
||||
var source1: Int { get { return 0 } }
|
||||
}
|
||||
|
||||
extension MyImpl {
|
||||
var source2: Int { get { return 0 } }
|
||||
}
|
||||
|
||||
func useProtocol(proto: MyProtocol, impl: MyImpl<Int>, impl2: MyImpl<Any>) {
|
||||
_ = proto.source1 // SOURCE
|
||||
_ = proto.source2 // SOURCE
|
||||
_ = impl.source1 // SOURCE [NOT DETECTED]
|
||||
_ = impl.source2 // SOURCE [NOT DETECTED]
|
||||
_ = impl2.source1 // SOURCE [NOT DETECTED]
|
||||
_ = impl2.source2 // SOURCE [NOT DETECTED]
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
protocol MyProtocol2 {
|
||||
var source1: Int { get }
|
||||
var source2: Int { get }
|
||||
}
|
||||
|
||||
class MyImpl2<T> {
|
||||
var source1: Int { get { return 0 } }
|
||||
}
|
||||
|
||||
extension MyImpl2 : MyProtocol2 {
|
||||
var source2: Int { get { return 0 } }
|
||||
}
|
||||
|
||||
func useProtocol2(proto: MyProtocol2, impl: MyImpl2<Int>, impl2: MyImpl2<Any>) {
|
||||
_ = proto.source1 // SOURCE
|
||||
_ = proto.source2 // SOURCE
|
||||
_ = impl.source1 // SOURCE [NOT DETECTED]
|
||||
_ = impl.source2 // SOURCE [NOT DETECTED]
|
||||
_ = impl2.source1 // SOURCE [NOT DETECTED]
|
||||
_ = impl2.source2 // SOURCE [NOT DETECTED]
|
||||
}
|
||||
Reference in New Issue
Block a user