Skip to content

Commit 656f98d

Browse files
committed
PS: AST and CFG improvements to hash tables.
1 parent 37c1263 commit 656f98d

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ class HashTableExpr extends @hash_table, Expr {
55

66
final override string toString() { result = "${...}" }
77

8-
Stmt getExprWithKey(Expr key) { hash_table_key_value_pairs(this, _, key, result) } // TODO: Change @ast to @expr in db scheme
8+
Stmt getElement(Expr key) { hash_table_key_value_pairs(this, _, key, result) } // TODO: Change @ast to @expr in db scheme
99

10-
predicate hasKey(Expr key) { exists(this.getExprWithKey(key)) }
10+
predicate hasKey(Expr key) { exists(this.getElement(key)) }
1111

12-
Stmt getAnExpr() { result = this.getExprWithKey(_) }
12+
Stmt getAnElement() { result = this.getElement(_) }
1313

1414
predicate hasEntry(int index, Expr key, Stmt value) {
1515
hash_table_key_value_pairs(this, index, key, value)

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,38 @@ module ExprNodes {
453453

454454
StmtBlockCfgNode getStmtBlock() { e.hasCfgChild(e.getStmtBlock(), this, result) }
455455
}
456+
457+
class HashTableChildMapping extends ExprChildMapping, HashTableExpr {
458+
override predicate relevantChild(Ast n) { this.hasEntry(_, _, n) or this.hasEntry(_, n, _) }
459+
}
460+
461+
class HashTableCfgNode extends ExprCfgNode {
462+
override string getAPrimaryQlClass() { result = "HashMapCfgNode" }
463+
464+
override HashTableChildMapping e;
465+
466+
override HashTableExpr getExpr() { result = super.getExpr() }
467+
468+
StmtCfgNode getElement(ExprCfgNode key) {
469+
exists(Expr eKey |
470+
eKey = key.getAstNode() and
471+
e.hasCfgChild(eKey, this, key) and
472+
e.hasCfgChild(e.getElement(eKey), this, result)
473+
)
474+
}
475+
476+
predicate hasKey(ExprCfgNode key) { exists(this.getElement(key)) }
477+
478+
StmtCfgNode getAnElement() { result = this.getElement(_) }
479+
480+
predicate hasEntry(int index, ExprCfgNode key, StmtCfgNode value) {
481+
exists(Expr eKey, Stmt sValue |
482+
e.hasCfgChild(eKey, this, key) and
483+
e.hasCfgChild(sValue, this, value) and
484+
e.hasEntry(index, eKey, sValue)
485+
)
486+
}
487+
}
456488
}
457489

458490
module StmtNodes {

0 commit comments

Comments
 (0)