Skip to content

Commit 89cd082

Browse files
committed
Swift: {Method,Initializer}CallExpr + SelfRefExpr
Adds a bit of symmetry in the API. Also, fix a couple of tests that were using the old types.
1 parent 5f03099 commit 89cd082

File tree

9 files changed

+46
-6
lines changed

9 files changed

+46
-6
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
private import codeql.swift.elements.expr.MethodCallExpr
2+
private import codeql.swift.elements.expr.InitializerLookupExpr
3+
private import codeql.swift.elements.decl.ConstructorDecl
4+
5+
class InitializerCallExpr extends MethodCallExpr {
6+
InitializerCallExpr() { this.getFunction() instanceof InitializerLookupExpr }
7+
8+
override ConstructorDecl getStaticTarget() { result = super.getStaticTarget() }
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
private import codeql.swift.elements.expr.CallExpr
2+
private import codeql.swift.elements.expr.ApplyExpr
3+
private import codeql.swift.elements.expr.SuperRefExpr
4+
private import codeql.swift.elements.expr.SelfRefExpr
5+
6+
class MethodCallExpr extends CallExpr, MethodApplyExpr {
7+
predicate isSelfCall() { this.getQualifier() instanceof SelfRefExpr }
8+
9+
predicate isSuperCall() { this.getQualifier() instanceof SuperRefExpr }
10+
}

swift/ql/lib/codeql/swift/elements/expr/MethodCallExprConstructor.qll

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
private import codeql.swift.elements.expr.DeclRefExpr
2+
private import codeql.swift.elements.decl.MethodDecl
3+
private import codeql.swift.elements.decl.VarDecl
4+
5+
/** A reference to `self`. */
6+
class SelfRefExpr extends DeclRefExpr {
7+
MethodDecl methodDecl;
8+
9+
SelfRefExpr() { this.getDecl() = methodDecl.getSelfParam() }
10+
11+
VarDecl getSelf() { result = this.getDecl() }
12+
13+
MethodDecl getMethodDecl() { result = methodDecl }
14+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
private import codeql.swift.generated.expr.SuperRefExpr
2+
private import codeql.swift.elements.decl.MethodDecl
23

4+
/** A reference to `super`. */
35
class SuperRefExpr extends Generated::SuperRefExpr {
46
override string toString() { result = "super" }
7+
8+
MethodDecl getMethodDecl() { this.getSelf() = result.getSelfParam() }
59
}

swift/ql/lib/codeql/swift/security/XXE.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ private class XmlParserXxeSink extends XxeSink {
3131
/** The construction of a `XMLParser` that enables external entities. */
3232
private class VulnerableParser extends CallExpr {
3333
VulnerableParser() {
34-
resolvesExternalEntities(this) and this.getFunction() instanceof ConstructorRefCallExpr
34+
resolvesExternalEntities(this) and this.getFunction() instanceof InitializerLookupExpr
3535
}
3636
}
3737

swift/ql/lib/swift.qll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import codeql.swift.elements.expr.ArithmeticOperation
55
import codeql.swift.elements.expr.BitwiseOperation
66
import codeql.swift.elements.expr.LogicalOperation
77
import codeql.swift.elements.expr.InitializerLookupExpr
8+
import codeql.swift.elements.expr.MethodCallExpr
9+
import codeql.swift.elements.expr.InitializerCallExpr
10+
import codeql.swift.elements.expr.SelfRefExpr
811
import codeql.swift.elements.decl.MethodDecl
912
import codeql.swift.elements.decl.ClassOrStructDecl
1013
import codeql.swift.Unit

swift/ql/src/queries/Security/CWE-1204/StaticInitializationVector.ql

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,15 @@ class StaticInitializationVectorSource extends Expr {
3232
class EncryptionInitializationSink extends Expr {
3333
EncryptionInitializationSink() {
3434
// `iv` arg in `init` is a sink
35-
exists(CallExpr call, string fName |
35+
exists(InitializerCallExpr call, string fName |
3636
call.getStaticTarget()
37-
.(ConstructorDecl)
3837
.hasQualifiedName([
3938
"AES", "ChaCha20", "Blowfish", "Rabbit", "CBC", "CFB", "GCM", "OCB", "OFB", "PCBC",
4039
"CCM", "CTR"
4140
], fName) and
42-
call.getArgumentWithLabel("iv").getExpr() = this
41+
call.getArgumentWithLabel("iv").getExpr() = this and
42+
not call.isSelfCall() and
43+
not call.isSuperCall()
4344
)
4445
}
4546
}

swift/ql/src/queries/Security/CWE-757/InsecureTLS.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class InsecureTlsConfig extends TaintTracking::Configuration {
2626
* Holds for enum values that represent an insecure version of TLS
2727
*/
2828
override predicate isSource(DataFlow::Node node) {
29-
node.asExpr().(MethodRefExpr).getMember().(EnumElementDecl).getName() =
29+
node.asExpr().(MethodLookupExpr).getMember().(EnumElementDecl).getName() =
3030
["TLSv10", "TLSv11", "tlsProtocol10", "tlsProtocol11"]
3131
}
3232

0 commit comments

Comments
 (0)