@@ -75,6 +75,25 @@ predicate succExit(CfgScope scope, Ast last, Completion c) { scope.exit(last, c)
75
75
76
76
/** Defines the CFG by dispatch on the various AST types. */
77
77
module Trees {
78
+ class NonDefaultParameterTree extends LeafTree instanceof Parameter {
79
+ NonDefaultParameterTree ( ) { not exists ( super .getDefaultValue ( ) ) }
80
+ }
81
+
82
+ class DefaultParameterTree extends StandardPostOrderTree instanceof Parameter {
83
+ DefaultParameterTree ( ) { exists ( super .getDefaultValue ( ) ) }
84
+
85
+ override AstNode getChildNode ( int i ) {
86
+ i = 0 and
87
+ result = super .getDefaultValue ( )
88
+ }
89
+
90
+ final override predicate propagatesAbnormal ( AstNode child ) { child = super .getDefaultValue ( ) }
91
+ }
92
+
93
+ class ParameterBlockTree extends StandardPostOrderTree instanceof ParamBlock {
94
+ override AstNode getChildNode ( int i ) { result = super .getParameter ( i ) }
95
+ }
96
+
78
97
abstract class ScriptBlockTree extends ControlFlowTree instanceof ScriptBlock {
79
98
abstract predicate succEntry ( AstNode n , Completion c ) ;
80
99
@@ -160,6 +179,44 @@ module Trees {
160
179
}
161
180
}
162
181
182
+ class FunctionScriptBlockTree extends PreOrderTree , ScriptBlockTree {
183
+ Function func ;
184
+
185
+ FunctionScriptBlockTree ( ) { func .getBody ( ) = this }
186
+
187
+ AstNode getParameter ( int i ) { result = func .getFunctionParameter ( i ) }
188
+
189
+ int getNumberOfParameters ( ) { result = func .getNumberOfFunctionParameters ( ) }
190
+
191
+ override predicate succ ( AstNode pred , AstNode succ , Completion c ) {
192
+ // Step to the first parameter
193
+ pred = this and
194
+ first ( this .getParameter ( 0 ) , succ ) and
195
+ completionIsSimple ( c )
196
+ or
197
+ // Step to the next parameter
198
+ exists ( int i |
199
+ last ( this .getParameter ( i ) , pred , c ) and
200
+ completionIsNormal ( c ) and
201
+ first ( this .getParameter ( i + 1 ) , succ )
202
+ )
203
+ or
204
+ // Body steps
205
+ super .succ ( pred , succ , c )
206
+ }
207
+
208
+ final override predicate succEntry ( AstNode n , Completion c ) {
209
+ // If there are no paramters we enter the body directly
210
+ not exists ( this .getParameter ( 0 ) ) and
211
+ n = this and
212
+ completionIsSimple ( c )
213
+ or
214
+ // Once we are done with the last parameter we enter the body
215
+ last ( this .getParameter ( this .getNumberOfParameters ( ) - 1 ) , n , c ) and
216
+ completionIsNormal ( c )
217
+ }
218
+ }
219
+
163
220
class TopLevelScriptBlockTree extends PreOrderTree , ScriptBlockTree {
164
221
TopLevelScriptBlockTree ( ) { this .( ScriptBlock ) .isTopLevel ( ) }
165
222
@@ -179,6 +236,34 @@ module Trees {
179
236
}
180
237
}
181
238
239
+ class StmtBlockTree extends PreOrderTree instanceof StmtBlock {
240
+ final override predicate propagatesAbnormal ( AstNode child ) { child = super .getAStmt ( ) }
241
+
242
+ final override predicate last ( AstNode last , Completion c ) {
243
+ last ( super .getStmt ( super .getNumberOfStmts ( ) - 1 ) , last , c )
244
+ or
245
+ not exists ( super .getAStmt ( ) ) and
246
+ last = this and
247
+ completionIsSimple ( c )
248
+ }
249
+
250
+ final override predicate succ ( AstNode pred , AstNode succ , Completion c ) {
251
+ this = pred and
252
+ first ( super .getStmt ( 0 ) , succ ) and
253
+ completionIsSimple ( c )
254
+ or
255
+ exists ( int i |
256
+ last ( super .getStmt ( i ) , pred , c ) and
257
+ completionIsNormal ( c ) and
258
+ first ( super .getStmt ( i + 1 ) , succ )
259
+ )
260
+ }
261
+ }
262
+
263
+ class GotoStmtTree extends LeafTree instanceof GotoStmt { }
264
+
265
+ class FunctionStmtTree extends LeafTree instanceof Function { }
266
+
182
267
class VarAccessTree extends LeafTree instanceof VarAccess { }
183
268
184
269
class BinaryExprTree extends StandardPostOrderTree instanceof BinaryExpr {
@@ -189,11 +274,23 @@ module Trees {
189
274
}
190
275
}
191
276
277
+ class UnaryExprTree extends StandardPostOrderTree instanceof UnaryExpr {
278
+ override AstNode getChildNode ( int i ) { i = 0 and result = super .getOperand ( ) }
279
+ }
280
+
281
+ class ArrayLiteralTree extends StandardPostOrderTree instanceof ArrayLiteral {
282
+ override AstNode getChildNode ( int i ) { result = super .getElement ( i ) }
283
+ }
284
+
192
285
class ConstExprTree extends LeafTree instanceof ConstExpr { }
193
286
194
287
class CmdExprTree extends StandardPreOrderTree instanceof CmdExpr {
195
288
override AstNode getChildNode ( int i ) { i = 0 and result = super .getExpr ( ) }
196
289
}
290
+
291
+ class PipelineTree extends StandardPreOrderTree instanceof Pipeline {
292
+ override AstNode getChildNode ( int i ) { result = super .getComponent ( i ) }
293
+ }
197
294
}
198
295
199
296
private import Scope
0 commit comments