@@ -44,80 +44,76 @@ class StringLengthConflationConfiguration extends DataFlow::Configuration {
44
44
exists (
45
45
AbstractFunctionDecl funcDecl , CallExpr call , string funcName , string paramName , int arg
46
46
|
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...
49
90
(
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"
54
94
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"
59
98
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"
64
102
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"
69
106
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"
74
110
) and
75
- c .getName ( ) = className and
76
- c .getAMember ( ) = funcDecl and // TODO: will this even work if its defined in a parent class?
77
111
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`
115
113
) and
116
- call .getFunction ( ) .( ApplyExpr ) .getStaticTarget ( ) = funcDecl and
117
114
funcDecl .getName ( ) = funcName and
118
115
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 ( )
121
117
)
122
118
}
123
119
0 commit comments