Skip to content

Commit 5a4d188

Browse files
committed
Swift: Fix for extensions.
1 parent d71eeb4 commit 5a4d188

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

swift/ql/lib/codeql/swift/dataflow/ExternalFlow.qll

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,14 @@ private NominalType getDeclType(IterableDeclContext decl) {
402402
result = decl.(ProtocolDecl).getType()
403403
}
404404

405+
private NominalTypeDecl resolveExtensions(IterableDeclContext decl) {
406+
// TODO: this should be a method on IterableDeclContext
407+
result = decl.(NominalTypeDecl)
408+
or
409+
result = decl.(ExtensionDecl).getExtendedTypeDecl()
410+
// TODO: or a protocol added by the extension
411+
}
412+
405413
/**
406414
* Gets the element in module `namespace` that satisfies the following properties:
407415
* 1. If the element is a member of a class-like type, then the class-like type has name `type`
@@ -453,10 +461,10 @@ private Element interpretElement0(
453461
result = field
454462
|
455463
subtypes = true and
456-
decl = nomTypeDecl.getADerivedTypeDecl*()
464+
resolveExtensions(decl) = nomTypeDecl.getADerivedTypeDecl*()
457465
or
458466
subtypes = false and
459-
decl = nomTypeDecl
467+
resolveExtensions(decl) = nomTypeDecl
460468
)
461469
)
462470
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,20 @@
2020
| generics.swift:55:9:55:17 | .source2 | external |
2121
| generics.swift:57:9:57:17 | .source4 | external |
2222
| generics.swift:58:9:58:17 | .source5 | external |
23+
| generics.swift:60:9:60:17 | .source7 | external |
2324
| generics.swift:62:9:62:18 | .source1 | external |
2425
| generics.swift:63:9:63:18 | .source2 | external |
2526
| generics.swift:65:9:65:18 | .source9 | external |
2627
| generics.swift:66:9:66:18 | .source10 | external |
2728
| generics.swift:67:9:67:27 | call to source11() | external |
29+
| generics.swift:68:9:68:18 | .source12 | external |
2830
| generics.swift:69:9:69:27 | call to source13() | external |
2931
| generics.swift:88:9:88:15 | .source1 | external |
3032
| generics.swift:89:9:89:15 | .source2 | external |
3133
| generics.swift:90:9:90:14 | .source1 | external |
34+
| generics.swift:91:9:91:14 | .source2 | external |
3235
| generics.swift:92:9:92:15 | .source1 | external |
36+
| generics.swift:93:9:93:15 | .source2 | external |
3337
| generics.swift:112:9:112:15 | .source1 | external |
3438
| generics.swift:113:9:113:15 | .source2 | external |
3539
| nsdata.swift:18:17:18:17 | call to init(contentsOf:) | external |

swift/ql/test/library-tests/dataflow/flowsources/generics.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,15 @@ func useDerived(generic: MyGeneric<Int>, generic2: MyGeneric<Any>, derived: MyDe
5757
_ = derived.source4 // SOURCE
5858
_ = derived.source5 // SOURCE
5959
_ = derived.source6() // SOURCE [NOT DETECTED]
60-
_ = derived.source7 // SOURCE [NOT DETECTED]
60+
_ = derived.source7 // SOURCE
6161
_ = derived.source8() // SOURCE [NOT DETECTED]
6262
_ = derived2.source1 // SOURCE
6363
_ = derived2.source2 // SOURCE
6464
_ = derived2.source3() // SOURCE [NOT DETECTED]
6565
_ = derived2.source9 // SOURCE
6666
_ = derived2.source10 // SOURCE
6767
_ = derived2.source11() // SOURCE
68-
_ = derived2.source12 // SOURCE [NOT DETECTED]
68+
_ = derived2.source12 // SOURCE
6969
_ = derived2.source13() // SOURCE
7070
}
7171

@@ -88,9 +88,9 @@ func useProtocol(proto: MyProtocol, impl: MyImpl<Int>, impl2: MyImpl<Any>) {
8888
_ = proto.source1 // SOURCE
8989
_ = proto.source2 // SOURCE
9090
_ = impl.source1 // SOURCE
91-
_ = impl.source2 // SOURCE [NOT DETECTED]
91+
_ = impl.source2 // SOURCE
9292
_ = impl2.source1 // SOURCE
93-
_ = impl2.source2 // SOURCE [NOT DETECTED]
93+
_ = impl2.source2 // SOURCE
9494
}
9595

9696
// ---

0 commit comments

Comments
 (0)