@@ -33,25 +33,21 @@ private class AnalyzedCapturedVariable extends @variable {
3333/**
3434 * Flow analysis for accesses to SSA variables.
3535 */
36- private class SsaVarAccessAnalysis extends DataFlow:: AnalyzedValueNode {
37- AnalyzedSsaDefinition def ;
38-
39- SsaVarAccessAnalysis ( ) { astNode = def .getVariable ( ) .getAUse ( ) }
40-
41- override AbstractValue getALocalValue ( ) { result = def .getAnRhsValue ( ) }
36+ private class AnalyzedSsaDefinitionNode extends AnalyzedNode , DataFlow:: SsaDefinitionNode {
37+ override AbstractValue getALocalValue ( ) { result = ssa .( AnalyzedSsaDefinition ) .getAnRhsValue ( ) }
4238}
4339
4440/**
4541 * Flow analysis for accesses to SSA variables.
4642 *
47- * Unlike `SsaVarAccessAnalysis `, this only contributes to `getAValue()`, not `getALocalValue()`.
43+ * Unlike `AnalyzedSsaDefinitionNode `, this only contributes to `getAValue()`, not `getALocalValue()`.
4844 */
49- private class SsaVarAccessWithNonLocalAnalysis extends SsaVarAccessAnalysis {
45+ private class AnalyzedSsaDefinitionNodeWithNonLocalAnalysis extends AnalyzedSsaDefinitionNode {
5046 DataFlow:: AnalyzedValueNode src ;
5147
52- SsaVarAccessWithNonLocalAnalysis ( ) {
48+ AnalyzedSsaDefinitionNodeWithNonLocalAnalysis ( ) {
5349 exists ( VarDef varDef |
54- varDef = def .( SsaExplicitDefinition ) .getDef ( ) and
50+ varDef = ssa .( SsaExplicitDefinition ) .getDef ( ) and
5551 varDef .getSource ( ) .flow ( ) = src and
5652 src instanceof CallWithNonLocalAnalyzedReturnFlow
5753 )
@@ -60,6 +56,23 @@ private class SsaVarAccessWithNonLocalAnalysis extends SsaVarAccessAnalysis {
6056 override AbstractValue getAValue ( ) { result = src .getAValue ( ) }
6157}
6258
59+ /**
60+ * Flow analysis for SSA variable uses.
61+ *
62+ * Ensures that `getAValue` propagates from the SSA definition to its use.
63+ */
64+ private class AnalyzedSsaVariableUse extends AnalyzedValueNode {
65+ AnalyzedSsaVariableUse ( ) {
66+ this = DataFlow:: valueNode ( any ( SsaVariable v ) .getAUse ( ) )
67+ }
68+
69+ override AbstractValue getAValue ( ) {
70+ result = AnalyzedValueNode .super .getAValue ( )
71+ or
72+ result = localFlowPred ( ) .getAValue ( )
73+ }
74+ }
75+
6376/**
6477 * Flow analysis for `VarDef`s.
6578 */
0 commit comments