Skip to content

Commit c87873b

Browse files
committed
PS: Add more cfg classes and helper predicats.
1 parent 88e32ba commit c87873b

File tree

6 files changed

+74
-7
lines changed

6 files changed

+74
-7
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,20 @@ class Cmd extends @command, CmdBase {
4040

4141
Redirection getARedirection() { result = this.getRedirection(_) }
4242
}
43+
44+
/**
45+
* An argument to a command.
46+
*
47+
* The argument may be named or positional.
48+
*/
49+
class Argument extends Expr {
50+
Cmd cmd;
51+
52+
Argument() { cmd.getArgument(_) = this or cmd.getNamedArgument(_) = this }
53+
54+
Cmd getCmd() { result = cmd }
55+
56+
int getIndex() { cmd.getArgument(result) = this }
57+
58+
string getName() { cmd.getNamedArgument(result) = this }
59+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import powershell
33
class InvokeMemberExpr extends @invoke_member_expression, MemberExprBase {
44
override SourceLocation getLocation() { invoke_member_expression_location(this, result) }
55

6-
Expr getBase() { invoke_member_expression(this, result, _) }
6+
Expr getQualifier() { invoke_member_expression(this, result, _) }
77

88
CmdElement getMember() { invoke_member_expression(this, _, result) }
99

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,37 @@ module ExprNodes {
166166

167167
predicate isImplicitWrite() { e.isImplicit() }
168168
}
169+
170+
/** A control-flow node that wraps an argument expression. */
171+
class ArgumentCfgNode extends ExprCfgNode {
172+
override string getAPrimaryQlClass() { result = "ArgumentCfgNode" }
173+
174+
override Argument e;
175+
176+
final override Argument getExpr() { result = super.getExpr() }
177+
}
178+
179+
private class InvokeMemberChildMapping extends ExprChildMapping, InvokeMemberExpr {
180+
override predicate relevantChild(Ast n) { n = this.getQualifier() or n = this.getAnArgument() }
181+
}
182+
183+
/** A control-flow node that wraps an `InvokeMemberExpr` expression. */
184+
class InvokeMemberCfgNode extends ExprCfgNode {
185+
override string getAPrimaryQlClass() { result = "InvokeMemberCfgNode" }
186+
187+
override InvokeMemberChildMapping e;
188+
189+
final override InvokeMemberExpr getExpr() { result = super.getExpr() }
190+
191+
final ExprCfgNode getQualifier() { e.hasCfgChild(e.getQualifier(), this, result) }
192+
}
193+
194+
/** A control-flow node that wraps a qualifier expression. */
195+
class QualifierCfgNode extends ExprCfgNode {
196+
QualifierCfgNode() { this = any(InvokeMemberCfgNode invoke).getQualifier() }
197+
198+
InvokeMemberCfgNode getInvokeMember() { this = result.getQualifier() }
199+
}
169200
}
170201

171202
module StmtNodes {

powershell/ql/lib/semmle/code/powershell/controlflow/internal/Scope.qll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,23 @@ Scope scopeOf(Ast n) {
1717
class Scope extends Ast, @script_block {
1818
/** Gets the outer scope, if any. */
1919
Scope getOuterScope() { result = scopeOf(this) }
20+
21+
/**
22+
* Gets the `i`'th paramter in this scope.
23+
*
24+
* This may be both function paramters and parameter block parameters.
25+
*/
26+
Parameter getParameter(int i) {
27+
exists(Function func |
28+
func.getBody() = this and
29+
result = func.getParameter(i)
30+
)
31+
}
32+
33+
/**
34+
* Gets a paramter in this scope.
35+
*
36+
* This may be both function paramters and parameter block parameters.
37+
*/
38+
Parameter getAParameter() { result = this.getParameter(_) }
2039
}

powershell/ql/test/library-tests/ast/Expressions/expressions.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ query predicate cmdExpr(CmdExpr cmd, Expr e) {
1010
}
1111

1212
query predicate invokeMemoryExpression(InvokeMemberExpr invoke, Expr e, int i, Expr arg) {
13-
e = invoke.getBase() and
13+
e = invoke.getQualifier() and
1414
arg = invoke.getArgument(i)
1515
}
1616

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
$a1 = Source()
2-
Sink($a1)
1+
$a1 = Source
2+
Sink $a1
33

4-
$b = GetBool()
4+
$b = GetBool
55
if($b) {
6-
$a2 = Source()
6+
$a2 = Source
77
}
8-
Sink($a2)
8+
Sink $a2

0 commit comments

Comments
 (0)