Skip to content

Commit 1332309

Browse files
committed
Swift: Add some (limited) test coverage for String <-> NSString conversions.
1 parent 8e069b7 commit 1332309

File tree

1 file changed

+23
-1
lines changed

1 file changed

+23
-1
lines changed

swift/ql/test/library-tests/dataflow/taint/libraries/nsstring.swift

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class NSString : NSObject, NSCopying, NSMutableCopying {
128128
var removingPercentEncoding: String? { get { return "" } }
129129
}
130130

131-
class NSMutableString: NSString {
131+
class NSMutableString : NSString {
132132
func append(_ aString: String) {}
133133
func insert(_ aString: String, at loc: Int) {}
134134
func replaceCharacters(in range: NSRange, with aString: String) {}
@@ -454,3 +454,25 @@ func taintThroughInterpolatedStrings() {
454454
sink(arg: sourceNSString().standardizingPath) // $ tainted=454
455455
sink(arg: sourceNSString().removingPercentEncoding) // $ tainted=455
456456
}
457+
458+
extension String {
459+
// an artificial initializer for initializing a `String` from an `NSString`. This can be done
460+
// in real-world Swift, but probably involves bridging magic and one of the other initializers.
461+
init(_: NSString) { self.init() }
462+
}
463+
464+
func taintThroughConversions() {
465+
// these are best effort tests as there's bridging magic between `String` and `NSString` that
466+
// we can't easily stub.
467+
let str1 = sourceString()
468+
let str2 = NSString(string: str1)
469+
sink(arg: str2) // $ tainted=467
470+
let str3 = str1 as! NSString // in real-world Swift you can just use `as` here
471+
sink(arg: str3) // $ tainted=467
472+
473+
let str5 = sourceNSString()
474+
let str6 = String(str5)
475+
sink(arg: str6) // $ tainted=473
476+
let str7 = str5 as! String // in real-world Swift you can just use `as` here
477+
sink(arg: str7) // $ tainted=473
478+
}

0 commit comments

Comments
 (0)