File tree Expand file tree Collapse file tree 2 files changed +27
-3
lines changed
rust/ql/lib/codeql/rust/dataflow/internal Expand file tree Collapse file tree 2 files changed +27
-3
lines changed Original file line number Diff line number Diff line change @@ -95,6 +95,26 @@ module Node {
95
95
96
96
final class ArgumentNode = NaNode ;
97
97
98
+ /** An SSA node. */
99
+ abstract class SsaNode extends Node , TSsaNode {
100
+ SsaImpl:: DataFlowIntegration:: SsaNode node ;
101
+ SsaImpl:: DefinitionExt def ;
102
+
103
+ SsaNode ( ) {
104
+ this = TSsaNode ( node ) and
105
+ def = node .getDefinitionExt ( )
106
+ }
107
+
108
+ SsaImpl:: DefinitionExt getDefinitionExt ( ) { result = def }
109
+
110
+ /** Holds if this node should be hidden from path explanations. */
111
+ abstract predicate isHidden ( ) ;
112
+
113
+ override Location getLocation ( ) { result = node .getLocation ( ) }
114
+
115
+ override string toString ( ) { result = node .toString ( ) }
116
+ }
117
+
98
118
final class ReturnNode extends NaNode {
99
119
RustDataFlow:: ReturnKind getKind ( ) { none ( ) }
100
120
}
@@ -154,7 +174,7 @@ module SsaFlow {
154
174
* For instance, the predicate holds for if expressions as `if b { e1 } else {
155
175
* e2 }` evalates to the value of one of the subexpressions `e1` or `e2`.
156
176
*/
157
- predicate propagatesValue ( Expr e ) {
177
+ private predicate propagatesValue ( Expr e ) {
158
178
e instanceof IfExpr or
159
179
e instanceof LoopExpr or
160
180
e instanceof ReturnExpr or
Original file line number Diff line number Diff line change @@ -461,14 +461,18 @@ class PhiReadNode extends DefinitionExt, Impl::PhiReadNode {
461
461
}
462
462
463
463
private module DataFlowIntegrationInput implements Impl:: DataFlowIntegrationInputSig {
464
- class Expr extends CfgNodes:: ExprCfgNode {
464
+ class Expr extends CfgNodes:: AstCfgNode {
465
465
predicate hasCfgNode ( SsaInput:: BasicBlock bb , int i ) { this = bb .getNode ( i ) }
466
466
}
467
467
468
468
Expr getARead ( Definition def ) { result = Cached:: getARead ( def ) }
469
469
470
470
/** Holds if SSA definition `def` assigns `value` to the underlying variable. */
471
- predicate ssaDefAssigns ( WriteDefinition def , Expr value ) { none ( ) }
471
+ predicate ssaDefAssigns ( WriteDefinition def , Expr value ) {
472
+ exists ( CfgNode node , BasicBlock bb , int i |
473
+ def .definesAt ( _, bb , i ) and value .getAstNode ( ) = node .getAstNode ( ) .( AssignmentExpr ) .getLhs ( )
474
+ )
475
+ }
472
476
473
477
class Parameter = Param ;
474
478
You can’t perform that action at this time.
0 commit comments