From 523b8d286cff9310fff8158f3123b12f7a2ddddc Mon Sep 17 00:00:00 2001 From: jjenista Date: Fri, 13 May 2011 22:06:20 +0000 Subject: [PATCH] model the allocation of string literals in heap analysis --- .../Analysis/Disjoint/DisjointAnalysis.java | 46 ++++++++++++++++++- .../src/Analysis/Disjoint/HeapAnalysis.java | 6 +++ .../src/Analysis/Disjoint/PointerMethod.java | 1 + Robust/src/Analysis/Pointer/Pointer.java | 3 ++ .../src/IR/Flat/BCXPointsToCheckVRuntime.java | 1 + .../src/IR/Flat/BCXallocsiteObjectField.java | 11 +++++ Robust/src/IR/Flat/BuildCode.java | 5 ++ Robust/src/IR/Flat/BuildCodeExtension.java | 1 + Robust/src/IR/TypeUtil.java | 2 +- 9 files changed, 73 insertions(+), 3 deletions(-) diff --git a/Robust/src/Analysis/Disjoint/DisjointAnalysis.java b/Robust/src/Analysis/Disjoint/DisjointAnalysis.java index 583aa3d1..802a6ca0 100644 --- a/Robust/src/Analysis/Disjoint/DisjointAnalysis.java +++ b/Robust/src/Analysis/Disjoint/DisjointAnalysis.java @@ -359,6 +359,10 @@ public class DisjointAnalysis implements HeapAnalysis { public Alloc getCmdLineArgBytesAlloc() { return getAllocationSiteFromFlatNew( constructedCmdLineArgBytesNew ); } + public Alloc getNewStringLiteralAlloc() { + return newStringLiteralAlloc; + } + /////////////////////////////////////////// // // end public interface @@ -569,6 +573,11 @@ public class DisjointAnalysis implements HeapAnalysis { protected FlatNew constructedCmdLineArgNew; protected FlatNew constructedCmdLineArgBytesNew; + + // similar to above, the runtime allocates new strings + // for literal nodes, so make up an alloc to model that + protected TypeDescriptor strLiteralType; + protected AllocSite newStringLiteralAlloc; @@ -757,9 +766,9 @@ public class DisjointAnalysis implements HeapAnalysis { = state.DISJOINTDEBUGCALLSTOPAFTER; ReachGraph.debugCallSiteVisitCounter - = 0; // count visits from 1, is incremented before first visit + = 0; // count visits from 1, is incremented before first visit + - if( suppressOutput ) { @@ -768,6 +777,23 @@ public class DisjointAnalysis implements HeapAnalysis { allocateStructures(); + // model the implicit alloction site for new string literals + strLiteralType = new TypeDescriptor( typeUtil.getClass( typeUtil.StringClass ) ); + TempDescriptor throwAway = + new TempDescriptor("stringLiteralTemp_dummy", + strLiteralType + ); + FlatNew fnStringLiteral = + new FlatNew(strLiteralType, + throwAway, + false // is global + ); + newStringLiteralAlloc + = getAllocSiteFromFlatNewPRIVATE( fnStringLiteral ); + + + + double timeStartAnalysis = (double) System.nanoTime(); // start interprocedural fixed-point computation @@ -888,6 +914,7 @@ public class DisjointAnalysis implements HeapAnalysis { } + // now, depending on the interprocedural mode for visiting // methods, set up the needed data structures @@ -1481,6 +1508,21 @@ public class DisjointAnalysis implements HeapAnalysis { } break; + + case FKind.FlatLiteralNode: + // BIG NOTE: this transfer function is only here for + // points-to information for String literals. That's it. + // Effects and disjoint reachability and all of that don't + // care about references to literals. + FlatLiteralNode fln = (FlatLiteralNode) fn; + + if( fln.getType().equals( strLiteralType ) ) { + rg.assignTempEqualToNewAlloc( fln.getDst(), + newStringLiteralAlloc ); + } + break; + + case FKind.FlatSESEEnterNode: sese = (FlatSESEEnterNode) fn; diff --git a/Robust/src/Analysis/Disjoint/HeapAnalysis.java b/Robust/src/Analysis/Disjoint/HeapAnalysis.java index ce041e8f..04b96a9c 100644 --- a/Robust/src/Analysis/Disjoint/HeapAnalysis.java +++ b/Robust/src/Analysis/Disjoint/HeapAnalysis.java @@ -24,6 +24,12 @@ public interface HeapAnalysis { public Alloc getCmdLineArgAlloc(); // a String public Alloc getCmdLineArgBytesAlloc();// an array of char + + // similar to above, new string literals have a runtime alloc site (not in + // code explicitly) so make one in your model and return it here + public Alloc getNewStringLiteralAlloc(); // a String + + // Use these methods to find out what allocation sites // the given pointer might point to at or after the // given program point. In the case of a variable and diff --git a/Robust/src/Analysis/Disjoint/PointerMethod.java b/Robust/src/Analysis/Disjoint/PointerMethod.java index 501ecdfe..5246c9b8 100644 --- a/Robust/src/Analysis/Disjoint/PointerMethod.java +++ b/Robust/src/Analysis/Disjoint/PointerMethod.java @@ -92,6 +92,7 @@ public class PointerMethod { case FKind.FlatElementNode: case FKind.FlatSetElementNode: case FKind.FlatNew: + case FKind.FlatLiteralNode: case FKind.FlatCall: case FKind.FlatReturnNode: case FKind.FlatBackEdge: diff --git a/Robust/src/Analysis/Pointer/Pointer.java b/Robust/src/Analysis/Pointer/Pointer.java index efaf3fe8..2c76a76d 100644 --- a/Robust/src/Analysis/Pointer/Pointer.java +++ b/Robust/src/Analysis/Pointer/Pointer.java @@ -2105,6 +2105,9 @@ nextdelta: public Alloc getCmdLineArgBytesAlloc() { return null; } + public Alloc getNewStringLiteralAlloc() { + return null; + } public Set canPointToAt( TempDescriptor x, diff --git a/Robust/src/IR/Flat/BCXPointsToCheckVRuntime.java b/Robust/src/IR/Flat/BCXPointsToCheckVRuntime.java index 1aa948b1..3f658db5 100644 --- a/Robust/src/IR/Flat/BCXPointsToCheckVRuntime.java +++ b/Robust/src/IR/Flat/BCXPointsToCheckVRuntime.java @@ -388,4 +388,5 @@ public class BCXPointsToCheckVRuntime implements BuildCodeExtension { public void additionalIncludesStructsHeader(PrintWriter outstructs) {} public void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod) {} public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) {} + public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar) {} } diff --git a/Robust/src/IR/Flat/BCXallocsiteObjectField.java b/Robust/src/IR/Flat/BCXallocsiteObjectField.java index 096de3ec..ee8dc81c 100644 --- a/Robust/src/IR/Flat/BCXallocsiteObjectField.java +++ b/Robust/src/IR/Flat/BCXallocsiteObjectField.java @@ -34,6 +34,7 @@ public class BCXallocsiteObjectField implements BuildCodeExtension { outclassdefs.println(" int allocsite;"); } + public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar) { ClassDescriptor cdString = typeUtil.getClass( typeUtil.StringClass ); @@ -75,6 +76,7 @@ public class BCXallocsiteObjectField implements BuildCodeExtension { outmethod.println(""); } + public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) { outmethod.println(dstVar+"->allocsite = "+ heapAnalysis.getAllocationSiteFromFlatNew( flatNew ).getUniqueAllocSiteID()+ @@ -83,6 +85,15 @@ public class BCXallocsiteObjectField implements BuildCodeExtension { } + public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar) { + output.println(dstVar+"->allocsite = "+ + heapAnalysis.getNewStringLiteralAlloc().getUniqueAllocSiteID()+ + ";" + ); + } + + + public void printExtraArrayFields(PrintWriter outclassdefs) {} public void outputTransCode(PrintWriter output) {} public void buildCodeSetup() {} diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 6544c721..b87e6e63 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -3005,6 +3005,11 @@ fldloop: } else { output.println(generateTemp(fm, fln.getDst())+"=NewStringShort(str"+flncount+" ,"+((String)fln.getValue()).length()+");"); } + + for(BuildCodeExtension bcx: extensions) { + bcx.additionalCodeNewStringLiteral(output, generateTemp(fm, fln.getDst())); + } + output.println("}"); flncount++; } else if (fln.getType().isBoolean()) { diff --git a/Robust/src/IR/Flat/BuildCodeExtension.java b/Robust/src/IR/Flat/BuildCodeExtension.java index e7f01333..53484f64 100644 --- a/Robust/src/IR/Flat/BuildCodeExtension.java +++ b/Robust/src/IR/Flat/BuildCodeExtension.java @@ -34,4 +34,5 @@ public interface BuildCodeExtension { public void additionalCodePreNode(FlatMethod fm, FlatNode fn, PrintWriter output); public void additionalCodePostNode(FlatMethod fm, FlatNode fn, PrintWriter output); public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew); + public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar); } diff --git a/Robust/src/IR/TypeUtil.java b/Robust/src/IR/TypeUtil.java index 2921e1e5..cdb2a171 100644 --- a/Robust/src/IR/TypeUtil.java +++ b/Robust/src/IR/TypeUtil.java @@ -470,7 +470,7 @@ NextMethod: while(cd2!=null) { cd2=getSuper(cd2); if (cd2==possiblesuper) - return true; + return true; // check cd2's interface ancestors if(cd2 != null) { -- 2.34.1