fixes for memory effects analysis.
authoryeom <yeom>
Wed, 31 Mar 2010 23:45:11 +0000 (23:45 +0000)
committeryeom <yeom>
Wed, 31 Mar 2010 23:45:11 +0000 (23:45 +0000)
Robust/src/Analysis/MLP/MLPAnalysis.java
Robust/src/Analysis/MLP/SESEEffectsSet.java
Robust/src/Analysis/OwnershipAnalysis/MethodEffects.java
Robust/src/Analysis/OwnershipAnalysis/MethodEffectsAnalysis.java
Robust/src/Analysis/OwnershipAnalysis/OwnershipAnalysis.java

index 2533d5a27da9706fe7b27fe703435aa65717a8a8..0f805a46e3af4b3133cde5f753059cdea0ca432c 100644 (file)
@@ -34,6 +34,7 @@ import IR.FieldDescriptor;
 import IR.MethodDescriptor;
 import IR.Operation;
 import IR.State;
+import IR.TypeDescriptor;
 import IR.TypeUtil;
 import IR.Flat.FKind;
 import IR.Flat.FlatCall;
@@ -41,7 +42,6 @@ import IR.Flat.FlatCondBranch;
 import IR.Flat.FlatEdge;
 import IR.Flat.FlatElementNode;
 import IR.Flat.FlatFieldNode;
-import IR.Flat.FlatLiteralNode;
 import IR.Flat.FlatMethod;
 import IR.Flat.FlatNew;
 import IR.Flat.FlatNode;
@@ -1131,6 +1131,7 @@ public class MLPAnalysis {
                                                                                                dstHRN, visitedHRN);
                                                                        }
                                                                } else {
+//                                                                     System.out.println("FLAGGED "+callerMC+":fc="+fc+":arg="+arg+" , paramIdx="+paramIdx);
                                                                        flagAllocationSite(callerMC, dstHRN
                                                                                        .getAllocationSite());
                                                                }
@@ -1203,24 +1204,9 @@ public class MLPAnalysis {
                        FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn;
                        assert fsen.equals(currentSESE);
                        
-//                     if(fsen.getParent()!=null && fsen.getParent().getSeseEffectsSet()!=null){
-//                             Hashtable<TempDescriptor, HashSet<SESEEffectsKey>> strongTable=
-//                                     fsen.getParent().getSeseEffectsSet().getStrongUpdateTable();
-//                             fsen.getSeseEffectsSet().getStrongUpdateTable().putAll(strongTable);
-//                     }
-
-
                        if (!fsen.getIsCallerSESEplaceholder()) {
                                // uniquely taint each live-in variable
                                Set<TempDescriptor> set = fsen.getInVarSet();
-                               //
-//                             Set<TempDescriptor> tempSet=fsen.getOutVarSet();
-//                             for (Iterator iterator = tempSet.iterator(); iterator.hasNext();) {
-//                                     TempDescriptor tempDescriptor = (TempDescriptor) iterator
-//                                                     .next();
-//                                     set.add(tempDescriptor);
-//                             }
-                               //
                                Iterator<TempDescriptor> iter = set.iterator();
                                int idx = 0;
                                while (iter.hasNext()) {
@@ -1229,6 +1215,7 @@ public class MLPAnalysis {
                                        if (ln != null) {
                                                int taint = (int) Math.pow(2, idx);
                                                taintLabelNode(ln, taint);
+                                               currentSESE.getSeseEffectsSet().setInVarIdx(idx, td);
 
                                                // collects related allocation sites
                                                Iterator<ReferenceEdge> referenceeIter = ln
@@ -1245,6 +1232,7 @@ public class MLPAnalysis {
                                                                                visitedHRN);
 
                                                        } else {
+//                                                             System.out.println("FLAGGED "+fsen+":"+td);
                                                                flagAllocationSite(mc, dstHRN
                                                                                .getAllocationSite());
                                                        }
@@ -1263,6 +1251,19 @@ public class MLPAnalysis {
                        FlatSESEExitNode fsexit = (FlatSESEExitNode) fn;
 
                        if (!fsexit.getFlatEnter().getIsCallerSESEplaceholder()) {
+                               
+                               // clear taint information of live-in variables 
+                               Set<Integer> keySet=og.id2hrn.keySet();
+                               for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
+                                       Integer hrnID = (Integer) iterator.next();
+                                       HeapRegionNode hrn=og.id2hrn.get(hrnID);
+                                       Iterator<ReferenceEdge> edgeIter=hrn.iteratorToReferencers();
+                                       while (edgeIter.hasNext()) {
+                                               ReferenceEdge refEdge = (ReferenceEdge) edgeIter
+                                                               .next();
+                                               refEdge.setSESETaintIdentifier(0);
+                                       }
+                               }
 
                                FlatSESEEnterNode enterNode = fsexit.getFlatEnter();
                                FlatSESEEnterNode parent = enterNode.getParent();
@@ -1368,97 +1369,26 @@ public class MLPAnalysis {
                        FieldDescriptor field = ffn.getField();
                        
                        LabelNode srcLN = og.td2ln.get(src);
-                       if (srcLN != null) {
-                               HashSet<TempDescriptor> affectedTDSet = getAccessedTaintNodeSet(srcLN);
-                               Iterator<TempDescriptor> affectedIter = affectedTDSet
-                                               .iterator();
-                               while (affectedIter.hasNext()) {
-                                       TempDescriptor affectedTD = affectedIter.next();
-
-                                       if (currentSESE.getInVarSet().contains(affectedTD) || ((!currentSESE.getInVarSet().contains(affectedTD)) && currentSESE.getOutVarSet().contains(affectedTD)) ) {
-
-                                               HashSet<HeapRegionNode> hrnSet = getReferenceHeapIDSet(
-                                                               og, affectedTD);
-                                               Iterator<HeapRegionNode> hrnIter = hrnSet.iterator();
-                                               while (hrnIter.hasNext()) {
-                                                       HeapRegionNode hrn = hrnIter.next();
-
-                                                       Iterator<ReferenceEdge> referencers = hrn
-                                                                       .iteratorToReferencers();
-                                                       while (referencers.hasNext()) {
-                                                               ReferenceEdge referenceEdge = (ReferenceEdge) referencers
-                                                                               .next();
-                                                               if (field.getSymbol().equals(
-                                                                               referenceEdge.getField())) {
-
-                                                                       HeapRegionNode refHRN = og.id2hrn
-                                                                                       .get(referenceEdge.getDst().getID());
-
-                                                                       currentSESE
-                                                                                       .readEffects(affectedTD, field
-                                                                                                       .getSymbol(),
-                                                                                                       src.getType(), refHRN);
-                                                               }
-                                                       }
-
-                                               }
-                                       }
-                               }
-
-                               // handle tainted case
-
-                               Iterator<ReferenceEdge> edgeIter = srcLN
-                                               .iteratorToReferencees();
+                       if(srcLN!=null){
+                               Iterator<ReferenceEdge> edgeIter=srcLN.iteratorToReferencees();
                                while (edgeIter.hasNext()) {
-                                       ReferenceEdge edge = edgeIter.next();
-                                       HeapRegionNode accessHRN = edge.getDst();
-                                       // / follow the chain of reference to identify possible
-                                       // accesses
-                                       Iterator<ReferenceEdge> referIter = accessHRN
-                                                       .iteratorToReferencers();
-                                       while (referIter.hasNext()) {
-                                               ReferenceEdge referEdge = (ReferenceEdge) referIter
+                                       ReferenceEdge referenceEdge = (ReferenceEdge) edgeIter
+                                                       .next();
+                                       HeapRegionNode refHRN=referenceEdge.getDst();
+                                       int edgeTaint=referenceEdge.getSESETaintIdentifier();
+                                       
+                                       // figure out which invar has related effects
+                                       int taint=referenceEdge.getSESETaintIdentifier();
+                                       Hashtable<TempDescriptor, Integer> map=currentSESE.getSeseEffectsSet().getMapTempDescToInVarIdx();
+                                       Set<TempDescriptor> keySet=map.keySet();
+                                       for (Iterator iterator = keySet.iterator(); iterator
+                                                       .hasNext();) {
+                                               TempDescriptor inVarTD = (TempDescriptor) iterator
                                                                .next();
-
-                                               // if (referEdge.getTaintIdentifier() >0 ||
-                                               // referEdge.getSESETaintIdentifier()>0 ) {
-                                               HashSet<TempDescriptor> referSet = new HashSet<TempDescriptor>();
-                                               followReference(accessHRN, referSet,
-                                                               new HashSet<HeapRegionNode>(), currentSESE);
-
-                                               Iterator<TempDescriptor> referSetIter = referSet
-                                                               .iterator();
-                                               while (referSetIter.hasNext()) {
-                                                       TempDescriptor tempDescriptor = (TempDescriptor) referSetIter
-                                                                       .next();
-                                                       currentSESE.readEffects(tempDescriptor, field
-                                                                       .getSymbol(), src.getType(), accessHRN);
-                                               }
-                                               // }
-                                       }
-                                       // /
-                                       if (edge.getTaintIdentifier() > 0
-                                                       || edge.getSESETaintIdentifier() > 0) {
-
-                                               affectedTDSet = getReferenceNodeSet(accessHRN);
-                                               affectedIter = affectedTDSet.iterator();
-                                               while (affectedIter.hasNext()) {
-                                                       TempDescriptor affectedTD = affectedIter.next();
-
-                                                       if (currentSESE.getInVarSet().contains(affectedTD)) {
-
-                                                               HashSet<HeapRegionNode> hrnSet = getReferenceHeapIDSet(
-                                                                               og, affectedTD);
-                                                               Iterator<HeapRegionNode> hrnIter = hrnSet
-                                                                               .iterator();
-                                                               while (hrnIter.hasNext()) {
-                                                                       HeapRegionNode hrn = hrnIter.next();
-                                                                       currentSESE.readEffects(affectedTD, field
-                                                                                       .getSymbol(), src.getType(), hrn);
-                                                               }
-
-                                                       }
-
+                                               int inVarMask=(int) Math.pow(2, map.get(inVarTD).intValue());
+                                               if((inVarMask&edgeTaint)>0){
+                                                       // found related invar, contribute effects
+                                                       currentSESE.readEffects(inVarTD, field.getSymbol(),src.getType(), refHRN);
                                                }
                                        }
                                }
@@ -1473,56 +1403,122 @@ public class MLPAnalysis {
                        TempDescriptor dest=fon.getDest();
                        TempDescriptor src=fon.getLeft();
                        
-//                     if(!currentSESE.getIsCallerSESEplaceholder()){
-                               if( fon.getOp().getOp() ==Operation.ASSIGN && ( currentSESE.getInVarSet().contains(src) || (currentSESE.getOutVarSet().contains(src)))){
-                                       invarMap.put(dest, src);
+                       if(currentSESE.getInVarSet().contains(src)){
+                               int idx=currentSESE.getSeseEffectsSet().getInVarIdx(src);
+                               if(idx==-1){
+                                       break;
+                               }
+                               
+                               //mark dest's edges for corresponding  sese live in-var.
+                               LabelNode srcLN = og.td2ln.get(dest);
+                               if (srcLN != null) {
+                                       Iterator<ReferenceEdge> refEdgeIter=srcLN.iteratorToReferencees();
+                                       while (refEdgeIter.hasNext()) {
+                                               ReferenceEdge edge = refEdgeIter.next();
+                                               int newTaint = (int) Math.pow(2, idx);
+                                               edge.unionSESETaintIdentifier(newTaint);
+                                       }
                                }
-//                     }
-
-               }break;
-               
-               case FKind.FlatNew:{
-                       FlatNew fnew=(FlatNew)fn;
-                       TempDescriptor dst=fnew.getDst();
-                       if(dst.getType().isArray()){
-                               currentSESE.getSeseEffectsSet().addStrongUpdateVar(dst,  new SESEEffectsKey("", dst.getType(), new Integer(0), ""));
                        }
-                       
                }break;
                
                case FKind.FlatElementNode:{
                        
                        FlatElementNode fsen=(FlatElementNode)fn;                       
                        TempDescriptor src = fsen.getSrc();
+                       TempDescriptor dst = fsen.getDst();
+                       String field="___element_";
+                       
+                       LabelNode srcLN = og.td2ln.get(src);
+                       int taintIdentifier=0;
+                       if(srcLN!=null){
+                               Iterator<ReferenceEdge> edgeIter=srcLN.iteratorToReferencees();
+                               while (edgeIter.hasNext()) {
+                                       ReferenceEdge referenceEdge = (ReferenceEdge) edgeIter
+                                                       .next();
+                                       HeapRegionNode dstHRN=referenceEdge.getDst();
+                                       taintIdentifier=referenceEdge.getSESETaintIdentifier();                                 
+                                       
+                                       // figure out which invar has related effects
+                                       int taint=referenceEdge.getSESETaintIdentifier();
+                                       Hashtable<TempDescriptor, Integer> map=currentSESE.getSeseEffectsSet().getMapTempDescToInVarIdx();
+                                       Set<TempDescriptor> keySet=map.keySet();
+                                       for (Iterator iterator = keySet.iterator(); iterator
+                                                       .hasNext();) {
+                                               TempDescriptor inVarTD = (TempDescriptor) iterator
+                                                               .next();
+                                               int inVarMask=(int) Math.pow(2, map.get(inVarTD).intValue());
+                                               if((inVarMask&taintIdentifier)>0){
+                                                       // found related invar, contribute effects
+                                                       currentSESE.readEffects(inVarTD, field,src.getType(), dstHRN);
+                                               }
+                                       }
+                                       
+                               }
+                       }
                        
-                       if(invarMap.containsKey(src)){
-                               TempDescriptor invarTD=invarMap.get(src);
-                               currentSESE.getSeseEffectsSet().addReadingVar(invarTD, new SESEEffectsKey("", src.getType(), new Integer(0), ""));
+                       // taint
+                       LabelNode dstLN = og.td2ln.get(dst);
+                       if(dstLN!=null){
+                               Iterator<ReferenceEdge> edgeIter=dstLN.iteratorToReferencees();
+                               while (edgeIter.hasNext()) {
+                                       ReferenceEdge referenceEdge = (ReferenceEdge) edgeIter
+                                                       .next();
+                                       referenceEdge.unionSESETaintIdentifier(taintIdentifier);
+                               }
                        }
                        
                }break;
                        
-               case FKind.FlatSetElementNode:{
-                       
-                       FlatSetElementNode fsen=(FlatSetElementNode)fn;                 
+               case FKind.FlatSetElementNode: {
+
+                       FlatSetElementNode fsen = (FlatSetElementNode) fn;
                        TempDescriptor dst = fsen.getDst();
+                       TypeDescriptor  tdElement = dst.getType().dereference();
+                       
+                       String field = "___element_";
                        
-                       if(invarMap.containsKey(dst)){
-                               TempDescriptor invarTD=invarMap.get(dst);
+                       LabelNode dstLN=og.td2ln.get(dst);
+                       if(dst!=null){
                                
-                               SESEEffectsSet effectSet=currentSESE.getSeseEffectsSet();
-                               ///// if write effects occurs through variable which was strongly updated, ignore it?
-                               if(effectSet.getStrongUpdateSet(invarTD)!=null && effectSet.getStrongUpdateSet(invarTD).size()>0){
-                                       SESEEffectsKey key=new SESEEffectsKey("", dst.getType(), new Integer(0), "");
-                                       key.setStrong(true);
-                                       currentSESE.getSeseEffectsSet().addWritingVar(invarTD, key);
-                               }else{
-                                       currentSESE.getSeseEffectsSet().addWritingVar(invarTD, new SESEEffectsKey("", dst.getType(), new Integer(0), ""));
+                               Iterator<ReferenceEdge> edgeIter=dstLN.iteratorToReferencees();
+                               while (edgeIter.hasNext()) {
+                                       ReferenceEdge referenceEdge = (ReferenceEdge) edgeIter
+                                                       .next();
+                                       HeapRegionNode dstHRN=referenceEdge.getDst();
+                                       int edgeTaint=referenceEdge.getSESETaintIdentifier();
+                                       
+                                       // we can do a strong update here if one of two cases
+                                       // holds
+                                       boolean strongUpdate=false;
+                                       if (field != null && !dst.getType().isImmutable()
+                                                       && ((dstHRN.getNumReferencers() == 1) || // case 1
+                                                       (dstHRN.isSingleObject() && dstLN
+                                                                       .getNumReferencees() == 1) // case 2
+                                                       )) {
+                                               strongUpdate = true;
+                                       }
+                                       
+                                       
+                                       // figure out which invar has related effects
+                                       Hashtable<TempDescriptor, Integer> map=currentSESE.getSeseEffectsSet().getMapTempDescToInVarIdx();
+                                       Set<TempDescriptor> keySet=map.keySet();
+                                       for (Iterator iterator = keySet.iterator(); iterator
+                                                       .hasNext();) {
+                                               TempDescriptor inVarTD = (TempDescriptor) iterator
+                                                               .next();
+                                               int inVarMask=(int) Math.pow(2, map.get(inVarTD).intValue());
+                                               if((inVarMask&edgeTaint)>0){
+                                                       // found related invar, contribute effects
+                                                       currentSESE.writeEffects(inVarTD, field, dst.getType(),dstHRN, strongUpdate);                                           
+                                       }
                                }
-                               /////
+                               
                                
                        }
                        
+                       }
+
                }break;
                        
                case FKind.FlatSetFieldNode: {
@@ -1532,132 +1528,50 @@ public class MLPAnalysis {
                        FieldDescriptor field = fsen.getField();
                        
                        LabelNode dstLN = og.td2ln.get(dst);
-
-                       if (dstLN != null) {
-
-                               // check possible strong updates
-                               boolean strongUpdate = false;
-
-                               if (!field.getType().isImmutable() || field.getType().isArray()) {
-                                       Iterator<ReferenceEdge> itrXhrn = dstLN
-                                                       .iteratorToReferencees();
-                                       while (itrXhrn.hasNext()) {
-                                               ReferenceEdge edgeX = itrXhrn.next();
-                                               HeapRegionNode hrnX = edgeX.getDst();
-
-                                               // we can do a strong update here if one of two cases
-                                               // holds
-                                               if (field != null
-                                                               && field != OwnershipAnalysis
-                                                                               .getArrayField(field.getType())
-                                                               && ((hrnX.getNumReferencers() == 1) || // case 1
-                                                               (hrnX.isSingleObject() && dstLN
-                                                                               .getNumReferencees() == 1) // case 2
-                                                               )) {
-                                                       strongUpdate = true;
-                                               }
-                                       }
-                               }
-                               HashSet<TempDescriptor> affectedTDSet = getAccessedTaintNodeSet(dstLN);
-                               Iterator<TempDescriptor> affectedIter = affectedTDSet
-                                               .iterator();
-
-                               while (affectedIter.hasNext()) {
-                                       TempDescriptor affectedTD = affectedIter.next();
-                                       if (currentSESE.getInVarSet().contains(affectedTD) || ((!currentSESE.getInVarSet().contains(affectedTD)) && currentSESE.getOutVarSet().contains(affectedTD)) ) {
-
-                                               HashSet<HeapRegionNode> hrnSet = getReferenceHeapIDSet(
-                                                               og, affectedTD);
-                                               Iterator<HeapRegionNode> hrnIter = hrnSet.iterator();
-                                               while (hrnIter.hasNext()) {
-                                                       HeapRegionNode hrn = hrnIter.next();
-                                                       Iterator<ReferenceEdge> referencers = hrn
-                                                                       .iteratorToReferencers();
-                                                       while (referencers.hasNext()) {
-                                                               ReferenceEdge referenceEdge = (ReferenceEdge) referencers
-                                                                               .next();
-                                                               if (field.getSymbol().equals(
-                                                                               referenceEdge.getField())) {
-
-                                                                       HeapRegionNode refHRN = og.id2hrn
-                                                                                       .get(referenceEdge.getDst().getID());
-                                                                       currentSESE.writeEffects(affectedTD, field
-                                                                                       .getSymbol(), dst.getType(),
-                                                                                       refHRN, strongUpdate);
-                                                               }
-                                                       }
-
-                                               }
-                                       }
-                               }
-
-                               // handle tainted case
-                               Iterator<ReferenceEdge> edgeIter = dstLN
-                                               .iteratorToReferencees();
+                       if(dstLN!=null){
+                               
+                               Iterator<ReferenceEdge> edgeIter=dstLN.iteratorToReferencees();
                                while (edgeIter.hasNext()) {
-                                       ReferenceEdge edge = edgeIter.next();
-
-                                       HeapRegionNode accessHRN = edge.getDst();
-                                       // / follow the chain of reference to identify possible
-                                       // accesses
-                                       Iterator<ReferenceEdge> referIter = accessHRN
-                                                       .iteratorToReferencers();
-                                       while (referIter.hasNext()) {
-                                               ReferenceEdge referEdge = (ReferenceEdge) referIter
-                                                               .next();
-
-                                               // if (referEdge.getTaintIdentifier() > 0 ||
-                                               // referEdge.getSESETaintIdentifier() > 0 ) {
-                                               HashSet<TempDescriptor> referSet = new HashSet<TempDescriptor>();
-                                               followReference(accessHRN, referSet,
-                                                               new HashSet<HeapRegionNode>(), currentSESE);
-                                               Iterator<TempDescriptor> referSetIter = referSet
-                                                               .iterator();
-                                               while (referSetIter.hasNext()) {
-                                                       TempDescriptor tempDescriptor = (TempDescriptor) referSetIter
-                                                                       .next();
-                                                       SESEEffectsSet effectSet=currentSESE.getSeseEffectsSet();
-                                                       ///// if write effects occurs through variable which was strongly updated, ignore it?
-                                                       if(effectSet.getStrongUpdateSet(tempDescriptor)!=null && effectSet.getStrongUpdateSet(tempDescriptor).size()>0){
-//                                                             System.out.println("not write effect?");
-                                                       }else{
-                                                               currentSESE.writeEffects(tempDescriptor, field
-                                                                               .getSymbol(), dst.getType(), accessHRN,
-                                                                               strongUpdate);
-                                                       }
-                                                       /////
-                                               }
-                                               // }
+                                       ReferenceEdge referenceEdge = (ReferenceEdge) edgeIter
+                                                       .next();
+                                       HeapRegionNode dstHRN=referenceEdge.getDst();
+                                       int edgeTaint=referenceEdge.getSESETaintIdentifier();
+                                       
+                                       // we can do a strong update here if one of two cases
+                                       // holds
+                                       boolean strongUpdate=false;
+                                       if (field != null && !field.getType().isImmutable()
+                                                       && field != OwnershipAnalysis
+                                                                       .getArrayField(field.getType())
+                                                       && ((dstHRN.getNumReferencers() == 1) || // case 1
+                                                       (dstHRN.isSingleObject() && dstLN
+                                                                       .getNumReferencees() == 1) // case 2
+                                                       )) {
+                                               strongUpdate = true;
                                        }
-                                       // /
-                                       if (edge.getTaintIdentifier() > 0
-                                                       || edge.getSESETaintIdentifier() > 0) {
-                                               affectedTDSet = getReferenceNodeSet(accessHRN);
-                                               affectedIter = affectedTDSet.iterator();
-                                               while (affectedIter.hasNext()) {
-                                                       TempDescriptor affectedTD = affectedIter.next();
-                                                       if (currentSESE.getInVarSet().contains(affectedTD)) {
-
-                                                               HashSet<HeapRegionNode> hrnSet = getReferenceHeapIDSet(
-                                                                               og, affectedTD);
-                                                               Iterator<HeapRegionNode> hrnIter = hrnSet
-                                                                               .iterator();
-                                                               while (hrnIter.hasNext()) {
-                                                                       HeapRegionNode hrn = hrnIter.next();
-                                                                       currentSESE.writeEffects(affectedTD, field
-                                                                                       .getSymbol(), dst.getType(), hrn,
-                                                                                       strongUpdate);
-
-                                                               }
-
-                                                       }
-
+                                       
+                                       
+                                       // figure out which invar has related effects
+                                       Hashtable<TempDescriptor, Integer> map = currentSESE
+                                                       .getSeseEffectsSet().getMapTempDescToInVarIdx();
+                                       Set<TempDescriptor> keySet = map.keySet();
+                                       for (Iterator iterator = keySet.iterator(); iterator
+                                                       .hasNext();) {
+                                               TempDescriptor inVarTD = (TempDescriptor) iterator
+                                                               .next();
+                                               int inVarMask = (int) Math.pow(2, map.get(inVarTD)
+                                                               .intValue());
+                                               if ((inVarMask & edgeTaint) > 0) {
+                                                       // found related invar, contribute effects
+                                                       currentSESE.writeEffects(inVarTD,
+                                                                       field.getSymbol(), dst.getType(), dstHRN,
+                                                                       strongUpdate);
                                                }
                                        }
-                               }
-
+                               
+                               
+                       }
                        }
-
                }
                        break;
 
@@ -1668,7 +1582,6 @@ public class MLPAnalysis {
 
                        MethodEffects me = ownAnalysis.getMethodEffectsAnalysis()
                                        .getMethodEffectsByMethodContext(calleeMC);
-                       
 
                        OwnershipGraph calleeOG = ownAnalysis
                                        .getOwnvershipGraphByMethodContext(calleeMC);
@@ -1719,107 +1632,114 @@ public class MLPAnalysis {
                                }
 
                                LabelNode argLN = og.td2ln.get(arg);
-                               if (argLN != null) {
-                                       HashSet<TempDescriptor> affectedTDSet = getAccessedTaintNodeSet(argLN);
-                                       Iterator<TempDescriptor> affectedIter = affectedTDSet
-                                                       .iterator();
-
-                                       while (affectedIter.hasNext()) {
-
-                                               TempDescriptor affectedTD = affectedIter.next();
-                                               if(isThis){
-                                                       if (currentSESE.getInVarSet().contains(affectedTD)) {
-//                                                             Integer hrnPrimaryID = calleeOG.paramIndex2idPrimary.get(paramIdx);
-//                                                             Integer hrnSecondaryID = calleeOG.paramIndex2idSecondary.get(paramIdx);
-//                                                             System.out.println("primID="+hrnPrimaryID);
-//                                                             System.out.println("seconID="+hrnSecondaryID);
-                                                       }
-                                               }
-                                               if (currentSESE.getInVarSet().contains(affectedTD)) {
-
-                                                       if (readSet != null) {
-                                                               Iterator<EffectsKey> readIter = readSet
-                                                                               .iterator();
-                                                               while (readIter.hasNext()) {
-                                                                       EffectsKey key = readIter.next();
-                                                                       Set<Integer> hrnSet = getCallerHRNId(
-                                                                                       new Integer(paramIdx), calleeOG,
-                                                                                       key.getHRNId(), decomp);
-                                                                       Iterator<Integer> hrnIter = hrnSet
+                               if(     argLN!=null){
+                                       Iterator<ReferenceEdge> edgeIter=argLN.iteratorToReferencees();
+                                       while (edgeIter.hasNext()) {
+                                               ReferenceEdge referenceEdge = (ReferenceEdge) edgeIter
+                                                               .next();
+                                               HeapRegionNode dstHRN=referenceEdge.getDst();
+                                               int edgeTaint=referenceEdge.getSESETaintIdentifier();
+                                               
+                                               // figure out which invar has related effects
+                                               Hashtable<TempDescriptor, Integer> map = currentSESE
+                                                               .getSeseEffectsSet().getMapTempDescToInVarIdx();
+                                               Set<TempDescriptor> keySet = map.keySet();
+                                               for (Iterator iterator = keySet.iterator(); iterator
+                                                               .hasNext();) {
+                                                       TempDescriptor inVarTD = (TempDescriptor) iterator
+                                                                       .next();
+                                                       int inVarMask = (int) Math.pow(2, map.get(inVarTD)
+                                                                       .intValue());
+                                                       
+                                                       if ((inVarMask & edgeTaint) > 0) {
+                                                               // found related invar, contribute effects
+                                                               
+                                                               if (readSet != null) {
+                                                                       Iterator<EffectsKey> readIter = readSet
                                                                                        .iterator();
-                                                                       while (hrnIter.hasNext()) {
-                                                                               Integer hrnID = (Integer) hrnIter
-                                                                                               .next();
-
-                                                                               HeapRegionNode refHRN = og.id2hrn
-                                                                                               .get(hrnID);
-
-                                                                               currentSESE.readEffects(affectedTD, key
-                                                                                               .getFieldDescriptor(), key
-                                                                                               .getTypeDescriptor(), refHRN);
-
+                                                                       while (readIter.hasNext()) {
+                                                                               EffectsKey key = readIter.next();
+                                                                               Set<Integer> hrnSet = getCallerHRNId(
+                                                                                               new Integer(paramIdx), calleeOG,
+                                                                                               key.getHRNId(), decomp);
+                                                                               Iterator<Integer> hrnIter = hrnSet
+                                                                                               .iterator();
+                                                                               while (hrnIter.hasNext()) {
+                                                                                       Integer hrnID = (Integer) hrnIter
+                                                                                                       .next();
+
+                                                                                       HeapRegionNode refHRN = og.id2hrn
+                                                                                                       .get(hrnID);
+
+                                                                                       currentSESE.readEffects(inVarTD, key
+                                                                                                       .getFieldDescriptor(), key
+                                                                                                       .getTypeDescriptor(), refHRN);
+
+                                                                               }
                                                                        }
                                                                }
-                                                       }
-
-                                                       if (writeSet != null) {
-                                                               Iterator<EffectsKey> writeIter = writeSet
-                                                                               .iterator();
-                                                               while (writeIter.hasNext()) {
-                                                                       EffectsKey key = writeIter.next();
-
-                                                                       Set<Integer> hrnSet = getCallerHRNId(
-                                                                                       new Integer(paramIdx), calleeOG,
-                                                                                       key.getHRNId(), decomp);
-                                                                       Iterator<Integer> hrnIter = hrnSet
+                                                               
+                                                               if (writeSet != null) {
+                                                                       Iterator<EffectsKey> writeIter = writeSet
                                                                                        .iterator();
-                                                                       while (hrnIter.hasNext()) {
-                                                                               Integer hrnID = (Integer) hrnIter
-                                                                                               .next();
+                                                                       while (writeIter.hasNext()) {
+                                                                               EffectsKey key = writeIter.next();
+
+                                                                               Set<Integer> hrnSet = getCallerHRNId(
+                                                                                               new Integer(paramIdx), calleeOG,
+                                                                                               key.getHRNId(), decomp);
+                                                                               Iterator<Integer> hrnIter = hrnSet
+                                                                                               .iterator();
+                                                                               while (hrnIter.hasNext()) {
+                                                                                       Integer hrnID = (Integer) hrnIter
+                                                                                                       .next();
+
+                                                                                       HeapRegionNode refHRN = og.id2hrn
+                                                                                                       .get(hrnID);
+                                                                                       
+                                                                                       currentSESE.writeEffects(inVarTD,
+                                                                                                       key.getFieldDescriptor(), key
+                                                                                                                       .getTypeDescriptor(),
+                                                                                                       refHRN, false);
+                                                                               }
 
-                                                                               HeapRegionNode refHRN = og.id2hrn
-                                                                                               .get(hrnID);
-                                                                               currentSESE.writeEffects(affectedTD,
-                                                                                               key.getFieldDescriptor(), key
-                                                                                                               .getTypeDescriptor(),
-                                                                                               refHRN, false);
                                                                        }
-
                                                                }
-                                                       }
 
-                                                       if (strongUpdateSet != null) {
-                                                               Iterator<EffectsKey> strongUpdateIter = strongUpdateSet
-                                                                               .iterator();
-                                                               while (strongUpdateIter.hasNext()) {
-                                                                       EffectsKey key = strongUpdateIter.next();
-
-                                                                       Set<Integer> hrnSet = getCallerHRNId(
-                                                                                       new Integer(paramIdx), calleeOG,
-                                                                                       key.getHRNId(), decomp);
-                                                                       Iterator<Integer> hrnIter = hrnSet
+                                                               if (strongUpdateSet != null) {
+                                                                       Iterator<EffectsKey> strongUpdateIter = strongUpdateSet
                                                                                        .iterator();
-                                                                       while (hrnIter.hasNext()) {
-                                                                               Integer hrnID = (Integer) hrnIter
+                                                                       while (strongUpdateIter.hasNext()) {
+                                                                               EffectsKey key = strongUpdateIter
                                                                                                .next();
 
-                                                                               HeapRegionNode refHRN = og.id2hrn
-                                                                                               .get(hrnID);
-                                                                               currentSESE.writeEffects(affectedTD,
-                                                                                               key.getFieldDescriptor(), key
-                                                                                                               .getTypeDescriptor(),
-                                                                                               refHRN, true);
+                                                                               Set<Integer> hrnSet = getCallerHRNId(
+                                                                                               new Integer(paramIdx),
+                                                                                               calleeOG, key.getHRNId(),
+                                                                                               decomp);
+                                                                               Iterator<Integer> hrnIter = hrnSet
+                                                                                               .iterator();
+                                                                               while (hrnIter.hasNext()) {
+                                                                                       Integer hrnID = (Integer) hrnIter
+                                                                                                       .next();
+
+                                                                                       HeapRegionNode refHRN = og.id2hrn
+                                                                                                       .get(hrnID);
+
+                                                                                       currentSESE.writeEffects(inVarTD,
+                                                                                                       key.getFieldDescriptor(),
+                                                                                                       key.getTypeDescriptor(),
+                                                                                                       refHRN, true);
+                                                                               }
                                                                        }
-
-                                                               }
-                                                       }
-
+                                                               } // end of     if (strongUpdateSet != null)
+                                                               
+                                                       } // end of if ((inVarMask & edgeTaint) > 0) 
                                                }
-
+                                               
                                        }
-
                                }
-
+                               
                        }
 
                }
@@ -1829,7 +1749,6 @@ public class MLPAnalysis {
        }
        
        private void flagAllocationSite(MethodContext mc, AllocationSite ac){
-               
                HashSet<AllocationSite> set=mapMethodContextToLiveInAllocationSiteSet.get(mc);
                if(set==null){
                        set=new HashSet<AllocationSite>();                      
@@ -1884,42 +1803,11 @@ public class MLPAnalysis {
                Iterator<ReferenceEdge> edgeIter = ln.iteratorToReferencees();
                while (edgeIter.hasNext()) {
                        ReferenceEdge edge = edgeIter.next();
-                       HeapRegionNode hrn = edge.getDst();
-
-                       Iterator<ReferenceEdge> edgeReferencerIter = hrn
-                                       .iteratorToReferencers();
-                       while (edgeReferencerIter.hasNext()) {
-                               ReferenceEdge referencerEdge = edgeReferencerIter.next();
-                               OwnershipNode node = referencerEdge.getSrc();
-                               if (node instanceof LabelNode) {
-                                       referencerEdge.unionSESETaintIdentifier(identifier);
-                               }else if(node instanceof HeapRegionNode){
-                                       referencerEdge.unionSESETaintIdentifier(identifier);
-                               }
-                       }
-
+                       edge.setSESETaintIdentifier(identifier);
                }
 
        }
        
-       private HashSet<TempDescriptor> getReferenceNodeSet(HeapRegionNode hrn){
-               
-               HashSet<TempDescriptor> returnSet=new HashSet<TempDescriptor>();
-               
-               Iterator<ReferenceEdge> edgeIter=hrn.iteratorToReferencers();
-               while(edgeIter.hasNext()){
-                       ReferenceEdge edge=edgeIter.next();
-                       if(edge.getSrc() instanceof LabelNode){
-                               LabelNode ln=(LabelNode)edge.getSrc();
-                               returnSet.add(ln.getTempDescriptor());
-                       }
-               }
-               
-               return returnSet;
-               
-       }
-       
-       
        private HashSet<HeapRegionNode> getReferenceHeapIDSet(OwnershipGraph og, TempDescriptor td){
                
                HashSet<HeapRegionNode> returnSet=new HashSet<HeapRegionNode>();
@@ -1937,38 +1825,6 @@ public class MLPAnalysis {
        }
        
        
-       private HashSet<TempDescriptor> getAccessedTaintNodeSet(LabelNode ln) {
-
-               HashSet<TempDescriptor> returnSet = new HashSet<TempDescriptor>();
-
-               Iterator<ReferenceEdge> edgeIter = ln.iteratorToReferencees();
-               while (edgeIter.hasNext()) {
-                       ReferenceEdge edge = edgeIter.next();
-                       HeapRegionNode hrn = edge.getDst();
-
-                       Iterator<ReferenceEdge> edgeReferencerIter = hrn
-                                       .iteratorToReferencers();
-                       while (edgeReferencerIter.hasNext()) {
-                               ReferenceEdge referencerEdge = edgeReferencerIter.next();
-
-                               if (referencerEdge.getSrc() instanceof LabelNode) {
-                                       if (!((LabelNode) referencerEdge.getSrc()).equals(ln)) {
-
-                                               if (referencerEdge.getSESETaintIdentifier() > 0) {
-                                                       TempDescriptor td = ((LabelNode) referencerEdge
-                                                                       .getSrc()).getTempDescriptor();
-                                                       returnSet.add(td);
-                                               }
-                                       }
-                               }
-                       }
-
-               }
-
-               return returnSet;
-
-       }
-       
        private HashSet<ReferenceEdge> getRefEdgeSetReferenceToSameHRN(
                        OwnershipGraph og, TempDescriptor td) {
 
@@ -2049,7 +1905,7 @@ public class MLPAnalysis {
        }
        
        private void calculateCovering(ConflictGraph conflictGraph){
-               
+               uniqueLockSetId=0; // reset lock counter for every new conflict graph
                HashSet<ConflictEdge> fineToCover = new HashSet<ConflictEdge>();
                HashSet<ConflictEdge> coarseToCover = new HashSet<ConflictEdge>();
                HashSet<SESELock> lockSet=new HashSet<SESELock>();
@@ -2813,6 +2669,7 @@ public class MLPAnalysis {
                                                        setupRelatedAllocSiteAnalysis(og, mc, hrn,
                                                                        visitedHRN);
                                                } else {
+//                                                     System.out.println("FLAGGED "+mc+":"+ffn);
                                                        flagAllocationSite(mc, hrn.getAllocationSite());
                                                }
                                        }
@@ -2863,7 +2720,6 @@ public class MLPAnalysis {
                                currentConflictsMap.addAccessibleVar(src);
                                
                                if (!currentConflictsMap.isAccessible(dst)) {
-                                       
                                        if(invarMap.containsKey(dst)){
                                                currentConflictsMap.addStallSite(dst, new       HashSet<HeapRegionNode>(),
                                                                new StallTag(fn),invarMap.get(dst));
@@ -2884,14 +2740,6 @@ public class MLPAnalysis {
                                preEffectAnalysis(og, dst, null, PreEffectsKey.WRITE_EFFECT);
                        }
                        
-                       
-//                     if(invarMap.containsKey(dst)){
-//                             System.out.println("THIS IS FLAT SET FIELD:"+dst+ "with sese="+currentSESE);                            
-//                             TempDescriptor invarTD=invarMap.get(dst);
-//                             currentSESE.getSeseEffectsSet().addWritingVar(invarTD, new SESEEffectsKey("", dst.getType(), new Integer(0), ""));
-//                     }
-                       
-                       
                } break;
                        
                case FKind.FlatSetFieldNode: {
index c03edfc736c79e45dff0cbab3d8b78350ba97680..e8f0da960f9ecdaca470a539c75393eecde96758 100644 (file)
@@ -12,13 +12,32 @@ public class SESEEffectsSet {
        private Hashtable<TempDescriptor, HashSet<SESEEffectsKey>> readTable;
        private Hashtable<TempDescriptor, HashSet<SESEEffectsKey>> writeTable;
        private Hashtable<TempDescriptor, HashSet<SESEEffectsKey>> strongUpdateTable;
+       private Hashtable<TempDescriptor, Integer> mapTempDescToInVarIdx;
 
        public SESEEffectsSet() {
                readTable = new Hashtable<TempDescriptor, HashSet<SESEEffectsKey>>();
                writeTable = new Hashtable<TempDescriptor, HashSet<SESEEffectsKey>>();
                strongUpdateTable =  new Hashtable<TempDescriptor, HashSet<SESEEffectsKey>>();
+               mapTempDescToInVarIdx = new Hashtable<TempDescriptor, Integer>();
        }
 
+       public void setInVarIdx(int idx, TempDescriptor td){
+               mapTempDescToInVarIdx.put(td,new Integer(idx));
+       }
+       
+       public int getInVarIdx(TempDescriptor td){
+               Integer idx=mapTempDescToInVarIdx.get(td);
+               if(idx==null){
+                       // if invar is from SESE placeholder, it is going to be ignored.
+                       return -1;
+               }
+               return idx.intValue();
+       }
+       
+       public Hashtable<TempDescriptor, Integer> getMapTempDescToInVarIdx(){
+               return mapTempDescToInVarIdx;
+       }
+       
        public void addReadingVar(TempDescriptor td, SESEEffectsKey access) {
                HashSet<SESEEffectsKey> aSet = readTable.get(td);
                if (aSet == null) {
index ece3a5bfa691de0fa4994c0a3415d54baf617a6f..048892b0cebcd0d108d000322b66e740545c5b8b 100644 (file)
@@ -41,8 +41,6 @@ public class MethodEffects {
                                                        Integer paramID = paramIter.next();
                                                        effectsSet.addReadingVar(paramID, new EffectsKey(
                                                        fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
-//                                                     effectsSet.addReadingVar(paramID, new EffectsKey(
-//                                                                     fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID()));
 
                                                }
                                        }
@@ -58,8 +56,6 @@ public class MethodEffects {
                                                        Integer paramID = paramIter.next();
                                                        effectsSet.addReadingVar(paramID, new EffectsKey(
                                                                        fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),1));
-//                                                     effectsSet.addReadingVar(paramID, new EffectsKey(
-//                                                                     fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID()));
 
                                                }
                                        }
@@ -69,6 +65,132 @@ public class MethodEffects {
                }
 
        }
+       
+       public void analyzeFlatElementNode(OwnershipGraph og,
+                       TempDescriptor srcDesc, FieldDescriptor fieldDesc){
+
+               LabelNode ln = getLabelNodeFromTemp(og, srcDesc);
+               if (ln != null) {
+                       Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
+
+                       while (heapRegionsItr.hasNext()) {
+                               ReferenceEdge edge = heapRegionsItr.next();
+                               HeapRegionNode hrn = edge.getDst();
+
+                               if (hrn.isParameter()) {
+                                       Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
+                                                       .getID());
+
+                                       if (paramSet != null) {
+                                               Iterator<Integer> paramIter = paramSet.iterator();
+                                               while (paramIter.hasNext()) {
+                                                       Integer paramID = paramIter.next();
+                                                       effectsSet.addReadingVar(paramID, new EffectsKey(
+                                                       fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
+                                               }
+                                       }
+
+                                       // check weather this heap region is parameter
+                                       // reachable...
+
+                                       paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
+                                       if (paramSet != null) {
+                                               Iterator<Integer> paramIter = paramSet.iterator();
+
+                                               while (paramIter.hasNext()) {
+                                                       Integer paramID = paramIter.next();
+                                                       effectsSet.addReadingVar(paramID, new EffectsKey(
+                                                                       fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),1));
+                                               }
+                                       }
+
+                               }
+                       }
+               }
+
+       
+               
+               
+       }
+       
+       public void analyzeFlatSetElementNode(OwnershipGraph og,
+                       TempDescriptor dstDesc, FieldDescriptor fieldDesc) {
+
+               LabelNode ln = getLabelNodeFromTemp(og, dstDesc);
+               if (ln != null) {
+
+                       // / check possible strong updates
+                       boolean strongUpdate = false;
+                       if (!fieldDesc.getType().isImmutable()
+                                       || fieldDesc.getType().isArray()) {
+                               Iterator<ReferenceEdge> itrXhrn = ln.iteratorToReferencees();
+                               while (itrXhrn.hasNext()) {
+                                       ReferenceEdge edgeX = itrXhrn.next();
+                                       HeapRegionNode hrnX = edgeX.getDst();
+
+                                       if (fieldDesc != null
+                                                       && fieldDesc != OwnershipAnalysis
+                                                                       .getArrayField(fieldDesc.getType())
+                                                       && ((hrnX.getNumReferencers() == 1) || // case 1
+                                                       (hrnX.isSingleObject() && ln.getNumReferencees() == 1) // case
+                                                                                                                                                                       // 2
+                                                       )) {
+                                               strongUpdate = true;
+                                       }
+                               }
+                       }
+                       // //
+
+                       Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
+                       while (heapRegionsItr.hasNext()) {
+                               ReferenceEdge edge = heapRegionsItr.next();
+                               HeapRegionNode hrn = edge.getDst();
+
+                               if (hrn.isParameter()) {
+                                       Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
+                                                       .getID());
+
+                                       if (paramSet != null) {
+                                               Iterator<Integer> paramIter = paramSet.iterator();
+                                               while (paramIter.hasNext()) {
+                                                       Integer paramID = paramIter.next();
+                                                       effectsSet.addWritingVar(paramID, new EffectsKey(
+                                                                       fieldDesc.getSymbol(), dstDesc.getType(),
+                                                                       hrn.getID(), hrn
+                                                                                       .getGloballyUniqueIdentifier(), 0));
+                                                       if(strongUpdate){
+                                                               effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
+                                                                               fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
+                                                       }
+                                               }
+                                       }
+
+                                       // check weather this heap region is parameter
+                                       // reachable...
+
+                                       paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
+                                       if (paramSet != null) {
+                                               Iterator<Integer> paramIter = paramSet.iterator();
+
+                                               while (paramIter.hasNext()) {
+                                                       Integer paramID = paramIter.next();
+                                                       effectsSet.addWritingVar(paramID, new EffectsKey(
+                                                                       fieldDesc.getSymbol(), dstDesc.getType(),
+                                                                       hrn.getID(), hrn
+                                                                                       .getGloballyUniqueIdentifier(), 1));
+                                                       if(strongUpdate){
+                                                               effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
+                                                                               fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
+                                                       }
+                                               }
+                                       }
+
+                               }
+
+                       }
+               }
+
+       }
 
        public void analyzeFlatSetFieldNode(OwnershipGraph og,
                        TempDescriptor dstDesc, FieldDescriptor fieldDesc) {
@@ -112,13 +234,9 @@ public class MethodEffects {
                                                        Integer paramID = paramIter.next();
                                                        effectsSet.addWritingVar(paramID, new EffectsKey(
                                                                        fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
-//                                                     effectsSet.addWritingVar(paramID, new EffectsKey(
-//                                                                     fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
                                                        if(strongUpdate){
                                                                effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
                                                                                fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),0));
-//                                                             effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
-//                                                                             fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
                                                        }
 
                                                }
@@ -135,13 +253,9 @@ public class MethodEffects {
                                                        Integer paramID = paramIter.next();
                                                        effectsSet.addWritingVar(paramID, new EffectsKey(
                                                                        fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),1));
-//                                                     effectsSet.addWritingVar(paramID, new EffectsKey(
-//                                                                     fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
                                                        if(strongUpdate){
                                                                effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
                                                                                fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID(),hrn.getGloballyUniqueIdentifier(),1));
-//                                                             effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
-//                                                                             fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
                                                        }
 
                                                }
index 51c77aa35ce856b76afe4c872fd1ddd60fe0d495..1dc3f20accfacf1ee111380a3769e98cf4ba402c 100644 (file)
@@ -9,7 +9,9 @@ import java.util.Set;
 
 import IR.FieldDescriptor;
 import IR.MethodDescriptor;
+import IR.TypeDescriptor;
 import IR.Flat.FlatCall;
+import IR.Flat.FlatSetElementNode;
 import IR.Flat.TempDescriptor;
 
 public class MethodEffectsAnalysis {
@@ -59,12 +61,29 @@ public class MethodEffectsAnalysis {
                me.analyzeFlatSetFieldNode(og, dstDesc, fieldDesc);
                mapMethodContextToMethodEffects.put(mc, me);
        }
+       
+       public void analyzeFlatSetElementNode(MethodContext mc, OwnershipGraph og,
+                       TempDescriptor dstDesc, FieldDescriptor fieldDesc) {
+               if(!methodeffects) return;
+               MethodEffects me = mapMethodContextToMethodEffects.get(mc);
+               me.analyzeFlatSetElementNode(og, dstDesc, fieldDesc);
+               mapMethodContextToMethodEffects.put(mc, me);
+       }
+       
+       public void analyzeFlatElementNode(MethodContext mc, OwnershipGraph og,
+                       TempDescriptor dstDesc, FieldDescriptor fieldDesc) {
+               if(!methodeffects) return;
+               MethodEffects me = mapMethodContextToMethodEffects.get(mc);
+               me.analyzeFlatElementNode(og, dstDesc, fieldDesc);
+               mapMethodContextToMethodEffects.put(mc, me);
+       }
+       
 
        public void writeMethodEffectsResult() throws IOException {
 
                try {
                        BufferedWriter bw = new BufferedWriter(new FileWriter(
-                                       "MethodEffects_resport.txt"));
+                                       "MethodEffects_report.txt"));
 
                        Set<MethodContext> mcSet = mapMethodContextToMethodEffects.keySet();
                        Iterator<MethodContext> mcIter = mcSet.iterator();
index f36063252b311e4142d09a417e8283b0e520e753..56a78ad9c774c537f0a4af902c3d7a326f8ae346 100644 (file)
@@ -939,6 +939,7 @@ public class OwnershipAnalysis {
 
     case FKind.FlatElementNode:
       FlatElementNode fen = (FlatElementNode) fn;
+
       lhs = fen.getDst();
       rhs = fen.getSrc();
       if( !lhs.getType().isImmutable() || lhs.getType().isArray() ) {
@@ -948,13 +949,22 @@ public class OwnershipAnalysis {
        
        TypeDescriptor  tdElement = rhs.getType().dereference();
        FieldDescriptor fdElement = getArrayField( tdElement );
-  
        og.assignTempXEqualToTempYFieldF(lhs, rhs, fdElement);
+       meAnalysis.analyzeFlatElementNode(mc, og, lhs, fdElement);
+       
       }
       break;
 
     case FKind.FlatSetElementNode:
       FlatSetElementNode fsen = (FlatSetElementNode) fn;
+      
+      lhs = fsen.getDst();
+      rhs = fsen.getSrc();
+      if( !lhs.getType().isImmutable() || lhs.getType().isArray() ) {
+         TypeDescriptor  tdElement = lhs.getType().dereference();
+         FieldDescriptor fdElement = getArrayField( tdElement );
+         meAnalysis.analyzeFlatSetElementNode(mc, og, lhs, fdElement);
+      }        
 
       if( arrayReferencees.doesNotCreateNewReaching( fsen ) ) {
        // skip this node if it cannot create new reachability paths
@@ -972,6 +982,8 @@ public class OwnershipAnalysis {
        FieldDescriptor fdElement = getArrayField( tdElement );
 
        og.assignTempXFieldFEqualToTempY(lhs, fdElement, rhs);
+       meAnalysis.analyzeFlatSetElementNode(mc, og, lhs, fdElement);
+       
       }
       break;