@@ -17,8 +17,8 @@ private import codeql.ruby.dataflow.internal.DataFlowDispatch
17
17
*/
18
18
module Hash {
19
19
// cannot use API graphs due to negative recursion
20
- private predicate isHashLiteralPair ( Pair pair , ConstantValue cv ) {
21
- cv = DataFlow:: Content:: getKnownElementIndex ( pair .getKey ( ) ) and
20
+ private predicate isHashLiteralPair ( Pair pair , ConstantValue key ) {
21
+ key = DataFlow:: Content:: getKnownElementIndex ( pair .getKey ( ) ) and
22
22
pair = any ( MethodCall mc | mc .getMethodName ( ) = "[]" ) .getAnArgument ( )
23
23
}
24
24
@@ -44,23 +44,23 @@ module Hash {
44
44
}
45
45
46
46
private class HashLiteralNonSymbolSummary extends SummarizedCallable {
47
- private ConstantValue cv ;
47
+ private ConstantValue key ;
48
48
49
49
HashLiteralNonSymbolSummary ( ) {
50
50
this = "Hash.[]" and
51
- isHashLiteralPair ( _, cv ) and
52
- not cv .isSymbol ( _)
51
+ isHashLiteralPair ( _, key ) and
52
+ not key .isSymbol ( _)
53
53
}
54
54
55
55
final override MethodCall getACall ( ) {
56
56
result = API:: getTopLevelMember ( "Hash" ) .getAMethodCall ( "[]" ) .getExprNode ( ) .getExpr ( ) and
57
- isHashLiteralPair ( result .getAnArgument ( ) , cv )
57
+ isHashLiteralPair ( result .getAnArgument ( ) , key )
58
58
}
59
59
60
60
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
61
61
// { 'nonsymbol' => x }
62
- input = "Argument[0..].PairValue[" + cv .serialize ( ) + "]" and
63
- output = "ReturnValue.Element[" + cv .serialize ( ) + "]" and
62
+ input = "Argument[0..].PairValue[" + key .serialize ( ) + "]" and
63
+ output = "ReturnValue.Element[" + key .serialize ( ) + "]" and
64
64
preservesValue = true
65
65
}
66
66
}
@@ -110,27 +110,27 @@ module Hash {
110
110
*/
111
111
private class HashNewSuccessivePairsSummary extends SummarizedCallable {
112
112
private int i ;
113
- private ConstantValue cv ;
113
+ private ConstantValue key ;
114
114
115
115
HashNewSuccessivePairsSummary ( ) {
116
- this = "Hash[" + i + ", " + cv .serialize ( ) + "]" and
116
+ this = "Hash[" + i + ", " + key .serialize ( ) + "]" and
117
117
i % 2 = 1 and
118
118
exists ( ElementReference er |
119
- cv = er .getArgument ( i - 1 ) .getConstantValue ( ) and
119
+ key = er .getArgument ( i - 1 ) .getConstantValue ( ) and
120
120
exists ( er .getArgument ( i ) )
121
121
)
122
122
}
123
123
124
124
final override ElementReference getACall ( ) {
125
125
result .getReceiver ( ) = API:: getTopLevelMember ( "Hash" ) .getAUse ( ) .asExpr ( ) .getExpr ( ) and
126
- cv = result .getArgument ( i - 1 ) .getConstantValue ( ) and
126
+ key = result .getArgument ( i - 1 ) .getConstantValue ( ) and
127
127
exists ( result .getArgument ( i ) )
128
128
}
129
129
130
130
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
131
131
// Hash[:symbol, x]
132
132
input = "Argument[" + i + "]" and
133
- output = "ReturnValue.Element[" + cv .serialize ( ) + "]" and
133
+ output = "ReturnValue.Element[" + key .serialize ( ) + "]" and
134
134
preservesValue = true
135
135
}
136
136
}
@@ -165,21 +165,21 @@ module Hash {
165
165
}
166
166
167
167
private class StoreKnownSummary extends StoreSummary {
168
- private ConstantValue cv ;
168
+ private ConstantValue key ;
169
169
170
170
StoreKnownSummary ( ) {
171
- cv = DataFlow:: Content:: getKnownElementIndex ( mc .getArgument ( 0 ) ) and
172
- this = "store(" + cv .serialize ( ) + ")"
171
+ key = DataFlow:: Content:: getKnownElementIndex ( mc .getArgument ( 0 ) ) and
172
+ this = "store(" + key .serialize ( ) + ")"
173
173
}
174
174
175
175
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
176
176
super .propagatesFlowExt ( input , output , preservesValue )
177
177
or
178
178
input = "Argument[1]" and
179
- output = "Argument[self].Element[" + cv .serialize ( ) + "]" and
179
+ output = "Argument[self].Element[" + key .serialize ( ) + "]" and
180
180
preservesValue = true
181
181
or
182
- input = "Argument[self].WithoutElement[" + cv .serialize ( ) + "]" and
182
+ input = "Argument[self].WithoutElement[" + key .serialize ( ) + "]" and
183
183
output = "Argument[self]" and
184
184
preservesValue = true
185
185
}
@@ -210,17 +210,17 @@ module Hash {
210
210
}
211
211
212
212
private class AssocKnownSummary extends AssocSummary {
213
- private ConstantValue cv ;
213
+ private ConstantValue key ;
214
214
215
215
AssocKnownSummary ( ) {
216
- this = "assoc(" + cv .serialize ( ) + "]" and
217
- not cv .isInt ( _) and // exclude arrays
216
+ this = "assoc(" + key .serialize ( ) + "]" and
217
+ not key .isInt ( _) and // exclude arrays
218
218
mc .getNumberOfArguments ( ) = 1 and
219
- cv = DataFlow:: Content:: getKnownElementIndex ( mc .getArgument ( 0 ) )
219
+ key = DataFlow:: Content:: getKnownElementIndex ( mc .getArgument ( 0 ) )
220
220
}
221
221
222
222
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
223
- input = "Argument[self].Element[" + cv .serialize ( ) + ",?]" and
223
+ input = "Argument[self].Element[" + key .serialize ( ) + ",?]" and
224
224
output = "ReturnValue.Element[1]" and
225
225
preservesValue = true
226
226
}
@@ -325,18 +325,18 @@ abstract private class FetchValuesSummary extends SummarizedCallable {
325
325
}
326
326
327
327
private class FetchValuesKnownSummary extends FetchValuesSummary {
328
- ConstantValue cv ;
328
+ ConstantValue key ;
329
329
330
330
FetchValuesKnownSummary ( ) {
331
331
forex ( Expr arg | arg = mc .getAnArgument ( ) | exists ( arg .getConstantValue ( ) ) ) and
332
- cv = mc .getAnArgument ( ) .getConstantValue ( ) and
333
- this = "fetch_values(" + cv .serialize ( ) + ")"
332
+ key = mc .getAnArgument ( ) .getConstantValue ( ) and
333
+ this = "fetch_values(" + key .serialize ( ) + ")"
334
334
}
335
335
336
336
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
337
337
super .propagatesFlowExt ( input , output , preservesValue )
338
338
or
339
- input = "Argument[self].Element[" + cv .serialize ( ) + "]" and
339
+ input = "Argument[self].Element[" + key .serialize ( ) + "]" and
340
340
output = "ReturnValue.Element[?]" and
341
341
preservesValue = true
342
342
}
@@ -407,16 +407,16 @@ abstract private class SliceSummary extends SummarizedCallable {
407
407
}
408
408
409
409
private class SliceKnownSummary extends SliceSummary {
410
- ConstantValue cv ;
410
+ ConstantValue key ;
411
411
412
412
SliceKnownSummary ( ) {
413
- cv = mc .getAnArgument ( ) .getConstantValue ( ) and
414
- this = "slice(" + cv .serialize ( ) + ")" and
415
- not cv .isInt ( _) // covered in `Array.qll`
413
+ key = mc .getAnArgument ( ) .getConstantValue ( ) and
414
+ this = "slice(" + key .serialize ( ) + ")" and
415
+ not key .isInt ( _) // covered in `Array.qll`
416
416
}
417
417
418
418
override predicate propagatesFlowExt ( string input , string output , boolean preservesValue ) {
419
- input = "Argument[self].WithElement[?," + cv .serialize ( ) + "]" and
419
+ input = "Argument[self].WithElement[?," + key .serialize ( ) + "]" and
420
420
output = "ReturnValue" and
421
421
preservesValue = true
422
422
}
0 commit comments