Skip to content

Commit cbf9496

Browse files
committed
PS: Helper predicates and classes.
1 parent 3c19578 commit cbf9496

File tree

5 files changed

+50
-7
lines changed

5 files changed

+50
-7
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,12 @@ class ScriptBlock extends @script_block, Ast {
5252

5353
final override Scope getEnclosingScope() { result = this }
5454
}
55+
56+
/** A `process` block. */
57+
class ProcessBlock extends NamedBlock {
58+
ScriptBlock scriptBlock;
59+
60+
ProcessBlock() { scriptBlock.getProcessBlock() = this }
61+
62+
ScriptBlock getScriptBlock() { result = scriptBlock }
63+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ private class AbstractVariable extends TVariable {
169169

170170
abstract string getName();
171171

172+
final predicate hasName(string s) { this.getName() = s }
173+
172174
abstract Scope getDeclaringScope();
173175

174176
VarAccess getAnAccess() {
@@ -266,3 +268,7 @@ class Parameter extends AbstractLocalScopeVariable, TParameter {
266268
this.getAnAttribute().getANamedArgument() instanceof ValueFromPipelineAttribute
267269
}
268270
}
271+
272+
class PipelineParameter extends Parameter {
273+
PipelineParameter() { this.isPipeline() }
274+
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,32 @@ class ObjectCreationCfgNode extends CallCfgNode {
175175
string getConstructedTypeName() { result = objectCreation.getConstructedTypeName() }
176176
}
177177

178+
private class NamedBlockChildMapping extends NonExprChildMapping, NamedBlock {
179+
override predicate relevantChild(Ast n) { n = this.getAStmt() } // TODO: Handle getATrap
180+
}
181+
182+
class NamedBlockCfgNode extends AstCfgNode {
183+
NamedBlockChildMapping block;
184+
185+
NamedBlockCfgNode() { this.getAstNode() = block }
186+
187+
NamedBlock getBlock() { result = block }
188+
189+
StmtCfgNode getStmt(int i) { block.hasCfgChild(block.getStmt(i), this, result) }
190+
191+
StmtCfgNode getAStmt() { block.hasCfgChild(block.getAStmt(), this, result) }
192+
}
193+
194+
private class ProcessBlockChildMapping extends NamedBlockChildMapping, ProcessBlock { }
195+
196+
class ProcessBlockCfgNode extends NamedBlockCfgNode {
197+
override ProcessBlockChildMapping block;
198+
199+
override ProcessBlock getBlock() { result = block }
200+
201+
PipelineParameter getPipelineParameter() { result = block.getEnclosingFunction().getAParameter() }
202+
}
203+
178204
/** Provides classes for control-flow nodes that wrap AST expressions. */
179205
module ExprNodes {
180206
private class VarAccessChildMapping extends ExprChildMapping, VarAccess {

powershell/ql/lib/semmle/code/powershell/dataflow/internal/SsaImpl.qll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ private import powershell
33
private import semmle.code.powershell.Cfg as Cfg
44
private import semmle.code.powershell.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl
55
private import semmle.code.powershell.dataflow.Ssa
6-
private import Cfg::CfgNodes::ExprNodes
6+
import Cfg::CfgNodes
7+
private import ExprNodes
8+
private import StmtNodes
79

810
module SsaInput implements SsaImplCommon::InputSig<Location> {
911
private import semmle.code.powershell.controlflow.ControlFlowGraph as Cfg

powershell/ql/lib/semmle/code/powershell/internal/Argument.qll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ module Private {
77
* The argument may be named or positional.
88
*/
99
abstract class AbstractArgument extends Expr {
10-
Ast call;
10+
Call call;
1111

1212
/** Gets the call that this is an argumnt of. */
13-
final Ast getCall() { result = call }
13+
final Call getCall() { result = call }
1414

1515
/** Gets the position if this is a positional argument. */
1616
abstract int getPosition();
@@ -23,7 +23,7 @@ module Private {
2323
}
2424

2525
class CmdArgument extends AbstractArgument {
26-
override Cmd call;
26+
override CmdCall call;
2727

2828
CmdArgument() { call.getAnArgument() = this }
2929

@@ -34,10 +34,10 @@ module Private {
3434
final override predicate isQualifier() { none() }
3535
}
3636

37-
class InvokeArgument extends AbstractArgument {
38-
override InvokeMemberExpr call;
37+
class MethodArgument extends AbstractArgument {
38+
override MethodCall call;
3939

40-
InvokeArgument() { call.getAnArgument() = this or call.getQualifier() = this }
40+
MethodArgument() { call.getAnArgument() = this or call.getQualifier() = this }
4141

4242
override int getPosition() { call.getArgument(result) = this }
4343

0 commit comments

Comments
 (0)