@@ -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