@@ -44,80 +44,76 @@ class StringLengthConflationConfiguration extends DataFlow::Configuration {
4444 exists (
4545 AbstractFunctionDecl funcDecl , CallExpr call , string funcName , string paramName , int arg
4646 |
47- // arguments to method calls...
48- exists ( string className , ClassDecl c |
47+ (
48+ // arguments to method calls...
49+ exists ( string className , ClassDecl c |
50+ (
51+ // `NSRange.init`
52+ className = "NSRange" and
53+ funcName = "init(location:length:)" and
54+ paramName = [ "location" , "length" ]
55+ or
56+ // `NSString.character`
57+ className = [ "NSString" , "NSMutableString" ] and
58+ funcName = "character(at:)" and
59+ paramName = "at"
60+ or
61+ // `NSString.character`
62+ className = [ "NSString" , "NSMutableString" ] and
63+ funcName = "substring(from:)" and
64+ paramName = "from"
65+ or
66+ // `NSString.character`
67+ className = [ "NSString" , "NSMutableString" ] and
68+ funcName = "substring(to:)" and
69+ paramName = "to"
70+ or
71+ // `NSMutableString.insert`
72+ className = "NSMutableString" and
73+ funcName = "insert(_:at:)" and
74+ paramName = "at"
75+ ) and
76+ c .getName ( ) = className and
77+ c .getAMember ( ) = funcDecl and // TODO: will this even work if its defined in a parent class?
78+ call .getFunction ( ) .( ApplyExpr ) .getStaticTarget ( ) = funcDecl and
79+ flowstate = "String" // `String` length flowing into `NSString`
80+ )
81+ or
82+ // arguments to function calls...
83+ // `NSMakeRange`
84+ funcName = "NSMakeRange(_:_:)" and
85+ paramName = [ "loc" , "len" ] and
86+ call .getStaticTarget ( ) = funcDecl and
87+ flowstate = "String" // `String` length flowing into `NSString`
88+ or
89+ // arguments to function calls...
4990 (
50- // `NSRange.init`
51- className = "NSRange" and
52- funcName = "init(location:length:)" and
53- paramName = [ "location" , "length" ]
91+ // `String.dropFirst`, `String.dropLast`, `String.removeFirst`, `String.removeLast`
92+ funcName = [ "dropFirst(_:)" , "dropLast(_:)" , "removeFirst(_:)" , "removeLast(_:)" ] and
93+ paramName = "k"
5494 or
55- // `NSString.character`
56- className = [ "NSString" , "NSMutableString" ] and
57- funcName = "character(at:)" and
58- paramName = "at"
95+ // `String.prefix`, `String.suffix`
96+ funcName = [ "prefix(_:)" , "suffix(_:)" ] and
97+ paramName = "maxLength"
5998 or
60- // `NSString.character`
61- className = [ "NSString" , "NSMutableString" ] and
62- funcName = "substring(from:)" and
63- paramName = "from"
99+ // `String.Index.init`
100+ funcName = "init(encodedOffset:)" and
101+ paramName = "offset"
64102 or
65- // `NSString.character`
66- className = [ "NSString" , "NSMutableString" ] and
67- funcName = "substring(to:)" and
68- paramName = "to"
103+ // `String.index`
104+ funcName = [ "index(_:offsetBy:)" , "index(_:offsetBy:limitBy:)" ] and
105+ paramName = "n"
69106 or
70- // `NSMutableString.insert`
71- className = "NSMutableString" and
72- funcName = "insert(_:at:)" and
73- paramName = "at"
107+ // `String.formIndex`
108+ funcName = [ "formIndex(_:offsetBy:)" , "formIndex(_:offsetBy:limitBy:)" ] and
109+ paramName = "distance"
74110 ) and
75- c .getName ( ) = className and
76- c .getAMember ( ) = funcDecl and // TODO: will this even work if its defined in a parent class?
77111 call .getFunction ( ) .( ApplyExpr ) .getStaticTarget ( ) = funcDecl and
78- funcDecl .getName ( ) = funcName and
79- funcDecl .getParam ( pragma [ only_bind_into ] ( arg ) ) .getName ( ) = paramName and
80- call .getArgument ( pragma [ only_bind_into ] ( arg ) ) .getExpr ( ) = node .asExpr ( ) and
81- flowstate = "String" // `String` length flowing into `NSString`
82- )
83- or
84- // arguments to function calls...
85- // `NSMakeRange`
86- funcName = "NSMakeRange(_:_:)" and
87- paramName = [ "loc" , "len" ] and
88- call .getStaticTarget ( ) = funcDecl and
89- funcDecl .getName ( ) = funcName and
90- funcDecl .getParam ( pragma [ only_bind_into ] ( arg ) ) .getName ( ) = paramName and
91- call .getArgument ( pragma [ only_bind_into ] ( arg ) ) .getExpr ( ) = node .asExpr ( ) and
92- flowstate = "String" // `String` length flowing into `NSString`
93- or
94- // arguments to function calls...
95- (
96- // `String.dropFirst`, `String.dropLast`, `String.removeFirst`, `String.removeLast`
97- funcName = [ "dropFirst(_:)" , "dropLast(_:)" , "removeFirst(_:)" , "removeLast(_:)" ] and
98- paramName = "k"
99- or
100- // `String.prefix`, `String.suffix`
101- funcName = [ "prefix(_:)" , "suffix(_:)" ] and
102- paramName = "maxLength"
103- or
104- // `String.Index.init`
105- funcName = "init(encodedOffset:)" and
106- paramName = "offset"
107- or
108- // `String.index`
109- funcName = [ "index(_:offsetBy:)" , "index(_:offsetBy:limitBy:)" ] and
110- paramName = "n"
111- or
112- // `String.formIndex`
113- funcName = [ "formIndex(_:offsetBy:)" , "formIndex(_:offsetBy:limitBy:)" ] and
114- paramName = "distance"
112+ flowstate = "NSString" // `NSString` length flowing into `String`
115113 ) and
116- call .getFunction ( ) .( ApplyExpr ) .getStaticTarget ( ) = funcDecl and
117114 funcDecl .getName ( ) = funcName and
118115 funcDecl .getParam ( pragma [ only_bind_into ] ( arg ) ) .getName ( ) = paramName and
119- call .getArgument ( pragma [ only_bind_into ] ( arg ) ) .getExpr ( ) = node .asExpr ( ) and
120- flowstate = "NSString" // `NSString` length flowing into `String`
116+ call .getArgument ( pragma [ only_bind_into ] ( arg ) ) .getExpr ( ) = node .asExpr ( )
121117 )
122118 }
123119
0 commit comments