@@ -128,7 +128,7 @@ class NSString : NSObject, NSCopying, NSMutableCopying {
128
128
var removingPercentEncoding : String ? { get { return " " } }
129
129
}
130
130
131
- class NSMutableString : NSString {
131
+ class NSMutableString : NSString {
132
132
func append( _ aString: String ) { }
133
133
func insert( _ aString: String , at loc: Int ) { }
134
134
func replaceCharacters( in range: NSRange , with aString: String ) { }
@@ -454,3 +454,25 @@ func taintThroughInterpolatedStrings() {
454
454
sink ( arg: sourceNSString ( ) . standardizingPath) // $ tainted=454
455
455
sink ( arg: sourceNSString ( ) . removingPercentEncoding) // $ tainted=455
456
456
}
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