@@ -24,7 +24,6 @@ struct Locale {
2424
2525
2626
27-
2827
2928enum CInterop {
3029 typealias Char = CChar
@@ -104,6 +103,7 @@ extension StringProtocol {
104103 func substring ( from index : Self . Index ) -> String { return " " }
105104 func trimmingCharacters ( in set : CharacterSet ) -> String { return " " }
106105 func appending < T > ( _ aString : T ) -> String where T : StringProtocol { return " " }
106+ func appendingFormat < T > ( _ format : T , _ arguments : CVarArg ... ) -> String where T : StringProtocol { return " " }
107107 func padding < T > ( toLength newLength : Int , withPad padString : T , startingAt padIndex : Int ) -> String where T : StringProtocol { return " " }
108108 func components ( separatedBy separator : CharacterSet ) -> [ String ] { return [ ] }
109109 func folding ( options : String . CompareOptions = [ ] , locale : Locale ? ) -> String { return " " }
@@ -648,3 +648,42 @@ func furtherTaintThroughCallbacks() {
648648 let result6 = try? tainted . withContiguousStorageIfAvailable ( callbackWithTaintedPointer )
649649 sink ( arg : result6 ! ) // $ tainted=612
650650}
651+
652+ func testAppendingFormat ( ) {
653+ var s1 = source2 ( )
654+ sink ( arg : s1 . appendingFormat ( " %s %i " , " " , 0 ) ) // $ tainted=653
655+
656+ var s2 = " "
657+ sink ( arg : s2 . appendingFormat ( source2 ( ) , " " , 0 ) ) // $ tainted=657
658+
659+ var s3 = " "
660+ sink ( arg : s3 . appendingFormat ( " %s %i " , source2 ( ) , 0 ) ) // $ tainted=660
661+
662+ var s4 = " "
663+ sink ( arg : s4 . appendingFormat ( " %s %i " , " " , source ( ) ) ) // $ tainted=663
664+ }
665+
666+ func sourceUInt8 ( ) -> UInt8 { return 0 }
667+
668+ func testDecodeCString ( ) {
669+ var input : [ UInt8 ] = [ 1 , 2 , 3 , sourceUInt8 ( ) ]
670+
671+ let ( str1 , repaired1 ) = String . decodeCString ( input , as : UTF8 . self ) !
672+ sink ( arg : str1 ) // $ tainted=669
673+ sink ( arg : repaired1 )
674+
675+ input . withUnsafeBufferPointer ( {
676+ ptr in
677+ let ( str2 , repaired2 ) = String . decodeCString ( ptr . baseAddress , as : UTF8 . self ) !
678+ sink ( arg : str2 ) // $ MISSING: tainted=669
679+ sink ( arg : repaired2 )
680+ } )
681+
682+ let ( str3 , repaired3 ) = String . decodeCString ( source2 ( ) , as : UTF8 . self ) !
683+ sink ( arg : str3 ) // $ tainted=682
684+ sink ( arg : repaired3 )
685+
686+ let ( str4 , repaired4 ) = String . decodeCString ( & input , as : UTF8 . self ) !
687+ sink ( arg : str4 ) // $ tainted=669
688+ sink ( arg : repaired4 )
689+ }
0 commit comments