@@ -89,31 +89,34 @@ cached class FlowVar extends TFlowVar {
8989 */
9090private module PartialDefinitions {
9191 private newtype TPartialDefinition =
92- TExplicitFieldStoreQualifier ( Expr qualifier , FieldAccess fa ) {
93- isInstanceFieldWrite ( fa ) and qualifier = fa .getQualifier ( )
92+ TExplicitFieldStoreQualifier ( Expr qualifier , ControlFlowNode node ) {
93+ exists ( FieldAccess fa |
94+ isInstanceFieldWrite ( fa , node ) and qualifier = fa .getQualifier ( )
95+ )
9496 } or
9597 TExplicitCallQualifier ( Expr qualifier , Call call ) { qualifier = call .getQualifier ( ) } or
9698 TReferenceArgument ( Expr arg , VariableAccess va ) { definitionByReference ( va , arg ) }
9799
98- private predicate isInstanceFieldWrite ( FieldAccess fa ) {
100+ private predicate isInstanceFieldWrite ( FieldAccess fa , ControlFlowNode node ) {
99101 not fa .getTarget ( ) .isStatic ( ) and
100- assignmentLikeOperation ( _ , fa .getTarget ( ) , fa , _)
102+ assignmentLikeOperation ( node , fa .getTarget ( ) , fa , _)
101103 }
102104
103105 class PartialDefinition extends TPartialDefinition {
104106 Expr definedExpr ;
107+ ControlFlowNode node ;
105108
106109 PartialDefinition ( ) {
107- this = TExplicitFieldStoreQualifier ( definedExpr , _ ) or
108- this = TExplicitCallQualifier ( definedExpr , _) or
109- this = TReferenceArgument ( definedExpr , _ )
110+ this = TExplicitFieldStoreQualifier ( definedExpr , node ) or
111+ this = TExplicitCallQualifier ( definedExpr , _) and node = definedExpr or
112+ this = TReferenceArgument ( definedExpr , node )
110113 }
111114
112115 predicate partiallyDefines ( Variable v ) { definedExpr = v .getAnAccess ( ) }
113116
114117 predicate partiallyDefinesThis ( ThisExpr e ) { definedExpr = e }
115118
116- ControlFlowNode getSubBasicBlockStart ( ) { result = definedExpr }
119+ ControlFlowNode getSubBasicBlockStart ( ) { result = node }
117120
118121 Expr getDefinedExpr ( ) { result = definedExpr }
119122
@@ -141,8 +144,6 @@ private module PartialDefinitions {
141144 VariableAccess getVariableAccess ( ) { result = va }
142145
143146 override predicate partiallyDefines ( Variable v ) { va = v .getAnAccess ( ) }
144-
145- override ControlFlowNode getSubBasicBlockStart ( ) { result = va }
146147 }
147148}
148149import PartialDefinitions
0 commit comments