@@ -114,8 +114,14 @@ private module Cached {
114114 TSsaNode ( SsaImpl:: DataFlowIntegration:: SsaNode node ) or
115115 TNormalParameterNode ( Parameter p ) or
116116 TExprPostUpdateNode ( CfgNodes:: ExprCfgNode n ) {
117- n instanceof CfgNodes:: ExprNodes:: ArgumentCfgNode or
117+ n instanceof CfgNodes:: ExprNodes:: ArgumentCfgNode
118+ or
118119 n instanceof CfgNodes:: ExprNodes:: QualifierCfgNode
120+ or
121+ exists ( CfgNodes:: ExprNodes:: MemberCfgNode member |
122+ n = member .getBase ( ) and
123+ not member .isStatic ( )
124+ )
119125 }
120126
121127 cached
@@ -150,10 +156,15 @@ private module Cached {
150156 newtype TContentSet = TSingletonContent ( Content c )
151157
152158 cached
153- newtype TContent = TFieldContent ( string name ) { none ( ) }
159+ newtype TContent =
160+ TFieldContent ( string name ) {
161+ name = any ( PropertyMember member ) .getName ( )
162+ or
163+ name = any ( MemberExpr me ) .getMemberName ( )
164+ }
154165
155166 cached
156- newtype TContentApprox = TNonElementContentApprox ( Content c ) // TODO
167+ newtype TContentApprox = TNonElementContentApprox ( Content c )
157168
158169 cached
159170 newtype TDataFlowType = TUnknownDataFlowType ( )
@@ -309,14 +320,26 @@ predicate jumpStep(Node pred, Node succ) {
309320 * content `c`.
310321 */
311322predicate storeStep ( Node node1 , ContentSet c , Node node2 ) {
312- none ( ) // TODO
323+ node2 .( PostUpdateNode ) .getPreUpdateNode ( ) .asExpr ( ) =
324+ any ( CfgNodes:: ExprNodes:: MemberCfgNode var |
325+ exists ( CfgNodes:: StmtNodes:: AssignStmtCfgNode assign |
326+ var = assign .getLeftHandSide ( ) and
327+ node1 .asStmt ( ) = assign .getRightHandSide ( )
328+ |
329+ c .isSingleton ( any ( Content:: FieldContent ct | ct .getName ( ) = var .getMemberName ( ) ) )
330+ )
331+ ) .getBase ( )
313332}
314333
315334/**
316335 * Holds if there is a read step of content `c` from `node1` to `node2`.
317336 */
318337predicate readStep ( Node node1 , ContentSet c , Node node2 ) {
319- none ( ) // TODO
338+ node2 .asExpr ( ) =
339+ any ( CfgNodes:: ExprNodes:: MemberCfgReadAccessNode var |
340+ node1 .asExpr ( ) = var .getBase ( ) and
341+ c .isSingleton ( any ( Content:: FieldContent ct | ct .getName ( ) = var .getMemberName ( ) ) )
342+ )
320343}
321344
322345/**
@@ -325,7 +348,7 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
325348 * in `x.f = newValue`.
326349 */
327350predicate clearsContent ( Node n , ContentSet c ) {
328- none ( ) // TODO
351+ n = any ( PostUpdateNode pun | storeStep ( _ , c , pun ) ) . getPreUpdateNode ( )
329352}
330353
331354/**
0 commit comments