Skip to content

Commit f0429fa

Browse files
authored
Merge pull request #95 from microsoft/powershell-ssa-consistency
PS: Add SSA consistency queries and include parameter read/writes as SSA read/writes
2 parents 3459440 + cf59c60 commit f0429fa

File tree

5 files changed

+17
-12
lines changed

5 files changed

+17
-12
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import semmle.code.powershell.dataflow.internal.SsaImpl::Consistency

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,13 @@ private class AbstractVariable extends TVariable {
111111
}
112112
}
113113

114-
class LocalVariable extends AbstractVariable, TLocalVariable {
114+
final class Variable = AbstractVariable;
115+
116+
abstract class AbstractLocalScopeVariable extends AbstractVariable { }
117+
118+
final class LocalScopeVariable = AbstractLocalScopeVariable;
119+
120+
class LocalVariable extends AbstractLocalScopeVariable, TLocalVariable {
115121
string name;
116122
Scope scope;
117123

@@ -135,7 +141,7 @@ class LocalVariable extends AbstractVariable, TLocalVariable {
135141
final override Scope getDeclaringScope() { result = scope }
136142
}
137143

138-
class Parameter extends AbstractVariable, TParameter {
144+
class Parameter extends AbstractLocalScopeVariable, TParameter {
139145
ParameterImpl p;
140146

141147
Parameter() { this = TParameter(p) }
@@ -156,5 +162,3 @@ class Parameter extends AbstractVariable, TParameter {
156162

157163
int getIndex() { this.isFunctionParameter(_, result) }
158164
}
159-
160-
final class Variable = AbstractVariable;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ module ExprNodes {
151151

152152
private class VarWriteAccessChildMapping extends VarAccessChildMapping, VarWriteAccess { }
153153

154-
class VariableWriteAccessCfgNode extends VarAccessCfgNode {
154+
class VarWriteAccessCfgNode extends VarAccessCfgNode {
155155
override string getAPrimaryQlClass() { result = "VarWriteAccessCfgNode" }
156156

157157
override VarWriteAccessChildMapping e;

powershell/ql/lib/semmle/code/powershell/dataflow/Ssa.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ module Ssa {
7575
* An SSA definition that corresponds to a write.
7676
*/
7777
class WriteDefinition extends Definition, SsaImpl::WriteDefinition {
78-
private VariableWriteAccessCfgNode write;
78+
private VarWriteAccessCfgNode write;
7979

8080
WriteDefinition() {
8181
exists(BasicBlock bb, int i, Variable v |
@@ -85,7 +85,7 @@ module Ssa {
8585
}
8686

8787
/** Gets the underlying write access. */
88-
final VariableWriteAccessCfgNode getWriteAccess() { result = write }
88+
final VarWriteAccessCfgNode getWriteAccess() { result = write }
8989

9090
/**
9191
* Holds if this SSA definition assigns `value` to the underlying variable.

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ module SsaInput implements SsaImplCommon::InputSig<Location> {
1919

2020
class ExitBasicBlock extends BasicBlock, BasicBlocks::ExitBasicBlock { }
2121

22-
class SourceVariable = LocalVariable;
22+
class SourceVariable = LocalScopeVariable;
2323

2424
/**
2525
* Holds if the statement at index `i` of basic block `bb` contains a write to variable `v`.
@@ -34,7 +34,7 @@ module SsaInput implements SsaImplCommon::InputSig<Location> {
3434
certain = true
3535
}
3636

37-
predicate variableRead(BasicBlock bb, int i, LocalVariable v, boolean certain) {
37+
predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
3838
variableReadActual(bb, i, v) and
3939
certain = true
4040
}
@@ -59,7 +59,7 @@ predicate uninitializedWrite(Cfg::EntryBasicBlock bb, int i, LocalVariable v) {
5959
}
6060

6161
/** Holds if `v` is read at index `i` in basic block `bb`. */
62-
private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) {
62+
private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalScopeVariable v) {
6363
exists(VarReadAccess read |
6464
read.getVariable() = v and
6565
read = bb.getNode(i).getAstNode()
@@ -152,7 +152,7 @@ private module Cached {
152152
*/
153153
cached
154154
predicate variableWriteActual(
155-
Cfg::BasicBlock bb, int i, LocalVariable v, VariableWriteAccessCfgNode write
155+
Cfg::BasicBlock bb, int i, LocalScopeVariable v, VarWriteAccessCfgNode write
156156
) {
157157
exists(Cfg::CfgNode n |
158158
write.getVariable() = v and
@@ -164,7 +164,7 @@ private module Cached {
164164

165165
cached
166166
VarReadAccessCfgNode getARead(Definition def) {
167-
exists(LocalVariable v, Cfg::BasicBlock bb, int i |
167+
exists(SsaInput::SourceVariable v, Cfg::BasicBlock bb, int i |
168168
Impl::ssaDefReachesRead(v, def, bb, i) and
169169
variableReadActual(bb, i, v) and
170170
result = bb.getNode(i)

0 commit comments

Comments
 (0)