Skip to content

Commit abc70f6

Browse files
committed
Unified: Instantiate and expose public SSA api.
1 parent ef6059a commit abc70f6

3 files changed

Lines changed: 55 additions & 0 deletions

File tree

‎unified/ql/lib/codeql/unified/internal/FacadeAst.qll‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module;
77
private import AstPlugin
88
private import codeql.files.FileSystem
99
private import codeql.unified.internal.NameBinding as NameBinding
10+
private import codeql.unified.internal.ControlFlowGraph::Public
1011

1112
module Unified {
1213
private import Ast::Unified as G
@@ -124,6 +125,12 @@ module Unified {
124125
or
125126
result = this.getParent().(Argument).getParent()
126127
}
128+
129+
/** Gets the `ControlFlowNode` corresponding to this expression. */
130+
ControlFlowNode getControlFlowNode() { result.injects(this) }
131+
132+
/** Gets the basic block containing this expression. */
133+
BasicBlock getBasicBlock() { result = this.getControlFlowNode().getBasicBlock() }
127134
}
128135

129136
class AccessorDeclaration extends G::AccessorDeclaration {

‎unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,53 @@ module LocalSsaOutput = Make<Location, Cfg, LocalSsaInput>;
3737

3838
private import LocalSsaOutput
3939

40+
private module SsaInput implements SsaInputSig {
41+
private import codeql.unified.internal.ExprPositions
42+
43+
class Expr = U::Expr;
44+
45+
class Parameter = U::Parameter;
46+
47+
class VariableWrite instanceof BuilderNode {
48+
private AstNode writeAccess;
49+
private LocalVariable v;
50+
51+
VariableWrite() { this.isLocalVariableWrite(writeAccess, v) }
52+
53+
Expr asExpr() { hasIncomingValue(writeAccess, result) }
54+
55+
Expr getValue() {
56+
exists(VariableDeclaration decl |
57+
writeAccess = decl.getPattern() and result = decl.getValue()
58+
)
59+
or
60+
exists(AssignExpr assignment |
61+
writeAccess = assignment.getTarget() and result = assignment.getValue()
62+
)
63+
or
64+
writeAccess = result.(CompoundAssignExpr).getTarget()
65+
// TODO: Add case for prefix unary crement operations
66+
}
67+
68+
predicate isParameterInit(Parameter p) { p.getPattern() = writeAccess }
69+
70+
string toString() { result = super.toString() }
71+
72+
Location getLocation() { result = super.getLocation() }
73+
}
74+
75+
predicate explicitWrite(VariableWrite w, BasicBlock bb, int i, LocalSsaInput::SourceVariable v) {
76+
exists(AstNode repr |
77+
w.(BuilderNode).isLocalVariableWrite(repr, v) and
78+
performsVariableAccess(repr, v, _, bb.getNode(i))
79+
)
80+
}
81+
}
82+
83+
module SsaPublic {
84+
module Ssa = MakeSsa<SsaInput>;
85+
}
86+
4087
module LocalSsaDataFlowInput implements DataFlowIntegrationInputSig {
4188
class Expr = LocalVariableRefNode;
4289

‎unified/ql/lib/unified.qll‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ import codeql.unified.internal.AstExtra::Public
99
import codeql.unified.internal.ControlFlowGraph::Public
1010
import codeql.unified.internal.NameBinding::Public
1111
import codeql.unified.internal.dataflow.DataFlowPublic
12+
import codeql.unified.internal.dataflow.LocalSsa::SsaPublic
1213
import codeql.unified.internal.mad.LegacyMaD::Public

0 commit comments

Comments
 (0)