@@ -94,37 +94,35 @@ class StringLengthConflationConfiguration extends DataFlow::Configuration {
94
94
* that sink. We actually want to report incorrect flow states.
95
95
*/
96
96
predicate isSinkImpl ( DataFlow:: Node node , string flowstate ) {
97
- exists (
98
- AbstractFunctionDecl funcDecl , CallExpr call , string funcName , string paramName , int arg
99
- |
97
+ exists ( AbstractFunctionDecl funcDecl , CallExpr call , string funcName , int arg |
100
98
(
101
99
// arguments to method calls...
102
100
exists ( string className , ClassOrStructDecl c |
103
101
(
104
102
// `NSRange.init`
105
103
className = "NSRange" and
106
104
funcName = "init(location:length:)" and
107
- paramName = [ "location" , "length" ]
105
+ arg = [ 0 , 1 ]
108
106
or
109
107
// `NSString.character`
110
108
className = [ "NSString" , "NSMutableString" ] and
111
109
funcName = "character(at:)" and
112
- paramName = "at"
110
+ arg = 0
113
111
or
114
112
// `NSString.character`
115
113
className = [ "NSString" , "NSMutableString" ] and
116
114
funcName = "substring(from:)" and
117
- paramName = "from"
115
+ arg = 0
118
116
or
119
117
// `NSString.character`
120
118
className = [ "NSString" , "NSMutableString" ] and
121
119
funcName = "substring(to:)" and
122
- paramName = "to"
120
+ arg = 0
123
121
or
124
122
// `NSMutableString.insert`
125
123
className = "NSMutableString" and
126
124
funcName = "insert(_:at:)" and
127
- paramName = "at"
125
+ arg = 1
128
126
) and
129
127
c .getName ( ) = className and
130
128
c .getABaseTypeDecl * ( ) .( ClassOrStructDecl ) .getAMember ( ) = funcDecl and
@@ -135,39 +133,38 @@ class StringLengthConflationConfiguration extends DataFlow::Configuration {
135
133
// arguments to function calls...
136
134
// `NSMakeRange`
137
135
funcName = "NSMakeRange(_:_:)" and
138
- paramName = [ "loc" , "len" ] and
136
+ arg = [ 0 , 1 ] and
139
137
call .getStaticTarget ( ) = funcDecl and
140
138
flowstate = "NSString"
141
139
or
142
140
// arguments to method calls...
143
141
(
144
142
// `String.dropFirst`, `String.dropLast`, `String.removeFirst`, `String.removeLast`
145
143
funcName = [ "dropFirst(_:)" , "dropLast(_:)" , "removeFirst(_:)" , "removeLast(_:)" ] and
146
- paramName = "k"
144
+ arg = 0
147
145
or
148
146
// `String.prefix`, `String.suffix`
149
147
funcName = [ "prefix(_:)" , "suffix(_:)" ] and
150
- paramName = "maxLength"
148
+ arg = 0
151
149
or
152
150
// `String.Index.init`
153
151
funcName = "init(encodedOffset:)" and
154
- paramName = "offset"
152
+ arg = 0
155
153
or
156
154
// `String.index`
157
155
funcName = [ "index(_:offsetBy:)" , "index(_:offsetBy:limitBy:)" ] and
158
- paramName = [ "n" , "distance" ]
156
+ arg = [ 0 , 1 ]
159
157
or
160
158
// `String.formIndex`
161
159
funcName = [ "formIndex(_:offsetBy:)" , "formIndex(_:offsetBy:limitBy:)" ] and
162
- paramName = "distance"
160
+ arg = [ 0 , 1 ]
163
161
) and
164
162
call .getStaticTarget ( ) = funcDecl and
165
163
flowstate = "String"
166
164
) and
167
165
// match up `funcName`, `paramName`, `arg`, `node`.
168
166
funcDecl .getName ( ) = funcName and
169
- funcDecl .getParam ( pragma [ only_bind_into ] ( arg ) ) .getName ( ) = paramName and
170
- call .getArgument ( pragma [ only_bind_into ] ( arg ) ) .getExpr ( ) = node .asExpr ( )
167
+ call .getArgument ( arg ) .getExpr ( ) = node .asExpr ( )
171
168
)
172
169
}
173
170
0 commit comments