@@ -5,6 +5,7 @@ private import semmle.javascript.dataflow.internal.FlowSteps as FlowSteps
55private import semmle.javascript.dataflow.internal.AdditionalFlowInternal
66private import semmle.javascript.dataflow.internal.Contents:: Private
77private import semmle.javascript.dataflow.internal.VariableCapture
8+ private import semmle.javascript.dataflow.internal.VariableOrThis
89private import semmle.javascript.dataflow.internal.sharedlib.DataFlowImplCommon as DataFlowImplCommon
910private import semmle.javascript.dataflow.internal.sharedlib.Ssa as Ssa2
1011private import semmle.javascript.internal.flow_summaries.AllFlowSummaries
@@ -20,18 +21,18 @@ private class Node = DataFlow::Node;
2021class PostUpdateNode = DataFlow:: PostUpdateNode ;
2122
2223class SsaUseNode extends DataFlow:: Node , TSsaUseNode {
23- private VarAccess access ;
24+ private Expr expr ;
2425
25- SsaUseNode ( ) { this = TSsaUseNode ( access ) }
26+ SsaUseNode ( ) { this = TSsaUseNode ( expr ) }
2627
2728 cached
28- override string toString ( ) { result = "[ssa-use] " + access .toString ( ) }
29+ override string toString ( ) { result = "[ssa-use] " + expr .toString ( ) }
2930
3031 cached
31- override StmtContainer getContainer ( ) { result = access .getContainer ( ) }
32+ override StmtContainer getContainer ( ) { result = expr .getContainer ( ) }
3233
3334 cached
34- override Location getLocation ( ) { result = access .getLocation ( ) }
35+ override Location getLocation ( ) { result = expr .getLocation ( ) }
3536}
3637
3738class SsaPhiReadNode extends DataFlow:: Node , TSsaPhiReadNode {
@@ -1056,9 +1057,9 @@ predicate knownSourceModel(Node sink, string model) { none() }
10561057predicate knownSinkModel ( Node sink , string model ) { none ( ) }
10571058
10581059private predicate samePhi ( SsaPhiNode legacyPhi , Ssa2:: PhiNode newPhi ) {
1059- exists ( BasicBlock bb , PurelyLocalVariable v |
1060+ exists ( BasicBlock bb , LocalVariableOrThis v |
10601061 newPhi .definesAt ( v , bb , _) and
1061- legacyPhi .definesAt ( bb , _, v )
1062+ legacyPhi .definesAt ( bb , _, v . asLocalVariable ( ) )
10621063 )
10631064}
10641065
@@ -1082,10 +1083,11 @@ private predicate useUseFlow(Node node1, Node node2) {
10821083 exists ( Ssa2:: DefinitionExt def , Ssa2:: Node ssa1 , Ssa2:: Node ssa2 , boolean isUseStep |
10831084 Ssa2:: localFlowStep ( def , ssa1 , ssa2 , isUseStep ) and
10841085 node1 = getNodeFromSsa2 ( ssa1 ) and
1085- node2 = getNodeFromSsa2 ( ssa2 )
1086+ node2 = getNodeFromSsa2 ( ssa2 ) and
1087+ not node1 .getTopLevel ( ) .isExterns ( )
10861088 )
10871089 or
1088- exists ( VarUse use |
1090+ exists ( Expr use |
10891091 node1 = TSsaUseNode ( use ) and
10901092 node2 = TValueNode ( use )
10911093 )
0 commit comments