Skip to content

Commit e63778a

Browse files
committed
PS: CFG and AST helpers.
1 parent efee104 commit e63778a

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

powershell/ql/lib/semmle/code/powershell/ArrayExpression.qll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,22 @@ class ArrayExpr extends @array_expression, Expr {
55

66
StmtBlock getStmtBlock() { array_expression(this, result) }
77

8+
/**
9+
* Gets the i'th element of this `ArrayExpr`, if this can be determined statically.
10+
*
11+
* See `getStmtBlock` when the array elements are not known statically.
12+
*/
13+
Expr getElement(int i) {
14+
result =
15+
unique( | | this.getStmtBlock().getAStmt()).(CmdExpr).getExpr().(ArrayLiteral).getElement(i)
16+
}
17+
18+
/**
19+
* Gets an element of this `ArrayExpr`, if this can be determined statically.
20+
*
21+
* See `getStmtBlock` when the array elements are not known statically.
22+
*/
23+
Expr getAnElement() { result = this.getElement(_) }
24+
825
override string toString() { result = "@(...)" }
926
}

powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,25 @@ class ProcessBlockCfgNode extends NamedBlockCfgNode {
201201
PipelineParameter getPipelineParameter() { result = block.getEnclosingFunction().getAParameter() }
202202
}
203203

204+
private class StmtBlockChildMapping extends NonExprChildMapping, StmtBlock {
205+
override predicate relevantChild(Ast n) { n = this.getAStmt() or n = this.getAnElement() }
206+
}
207+
208+
class StmtBlockCfgNode extends AstCfgNode {
209+
StmtBlockChildMapping block;
210+
211+
StmtBlockCfgNode() { this.getAstNode() = block }
212+
213+
StmtBlock getBlock() { result = block }
214+
215+
StmtCfgNode getStmt(int i) { block.hasCfgChild(block.getStmt(i), this, result) }
216+
217+
StmtCfgNode getAStmt() { block.hasCfgChild(block.getAStmt(), this, result) }
218+
219+
/** Gets an AST element that may be returned from this `StmtBlockCfgNode`. */
220+
AstCfgNode getAnElement() { block.hasCfgChild(block.getAnElement(), this, result) }
221+
}
222+
204223
/** Provides classes for control-flow nodes that wrap AST expressions. */
205224
module ExprNodes {
206225
private class VarAccessChildMapping extends ExprChildMapping, VarAccess {
@@ -418,6 +437,22 @@ module ExprNodes {
418437
class IndexCfgReadNode extends IndexCfgNode {
419438
IndexCfgReadNode() { this.getExpr() instanceof IndexExprRead }
420439
}
440+
441+
class ArrayExprChildMapping extends ExprChildMapping, ArrayExpr {
442+
override predicate relevantChild(Ast n) { n = this.getStmtBlock() or n = this.getAnElement() }
443+
}
444+
445+
class ArrayExprCfgNode extends ExprCfgNode {
446+
override string getAPrimaryQlClass() { result = "ArrayExprCfgNode" }
447+
448+
override ArrayExprChildMapping e;
449+
450+
ExprCfgNode getElement(int i) { e.hasCfgChild(e.getElement(i), this, result) }
451+
452+
ExprCfgNode getAnElement() { result = this.getElement(_) }
453+
454+
StmtBlockCfgNode getStmtBlock() { e.hasCfgChild(e.getStmtBlock(), this, result) }
455+
}
421456
}
422457

423458
module StmtNodes {

0 commit comments

Comments
 (0)