}
// second, check return location annotation
- if (!md.getReturnType().isVoid()) {
+ if (!md.getReturnType().isVoid() && !ssjava.getMethodContainingSSJavaLoop().equals(md)) {
if (!hasReturnLocDeclaration) {
// if developer does not define method lattice
// search return location in the method default lattice
}
- if (!md.getReturnType().isVoid()) {
+ if (!md.getReturnType().isVoid() && !ssjava.getMethodContainingSSJavaLoop().equals(md)) {
MethodLattice<String> methodLattice = ssjava.getMethodLattice(md);
String thisLocId = methodLattice.getThisLoc();
if ((!md.isStatic()) && thisLocId == null) {
ExpressionNode returnExp = rn.getReturnExpression();
+ CompositeLocation declaredReturnLoc = md2ReturnLoc.get(md);
+
CompositeLocation returnValueLoc;
if (returnExp != null) {
returnValueLoc =
// generateErrorMessage(md.getClassDesc(), rn));
// }
+ if (constraint != null) {
+
+ // Set<CompositeLocation> inputGLB = new HashSet<CompositeLocation>();
+ // inputGLB.add(returnValueLoc);
+ // inputGLB.add(constraint);
+ // returnValueLoc =
+ // CompositeLattice.calculateGLB(inputGLB,
+ // generateErrorMessage(md.getClassDesc(), rn));
+
+ // if (!returnValueLoc.get(returnValueLoc.getSize() - 1).isTop()) {
+ // if (!CompositeLattice.isGreaterThan(constraint, returnValueLoc,
+ // generateErrorMessage(md.getClassDesc(), rn))) {
+ // System.out.println("returnValueLoc.get(returnValueLoc.getSize() - 1).isTop()="
+ // + returnValueLoc.get(returnValueLoc.getSize() - 1).isTop());
+ // throw new Error("The value flow from " + constraint + " to " +
+ // returnValueLoc
+ // + " does not respect location hierarchy on the assignment " +
+ // rn.printNode(0)
+ // + " at " + md.getClassDesc().getSourceFileName() + "::" +
+ // rn.getNumLine());
+ // }
+ // }
+
+ if (!CompositeLattice.isGreaterThan(constraint, declaredReturnLoc,
+ generateErrorMessage(md.getClassDesc(), rn))) {
+ throw new Error("The value flow from " + constraint + " to " + declaredReturnLoc
+ + " does not respect location hierarchy on the assignment " + rn.printNode(0)
+ + " at " + md.getClassDesc().getSourceFileName() + "::" + rn.getNumLine());
+ }
+
+ }
+
// check if return value is equal or higher than RETRUNLOC of method
// declaration annotation
- CompositeLocation declaredReturnLoc = md2ReturnLoc.get(md);
int compareResult =
CompositeLattice.compare(returnValueLoc, declaredReturnLoc, false,
constraint, false);
// addLocationType(isn.getCondition().getType(), condLoc);
-
constraint = generateNewConstraint(constraint, condLoc);
checkLocationFromBlockNode(md, nametable, isn.getTrueBlock(), constraint);
// location in the caller's perspective
CompositeLocation ceilingLoc =
computeCeilingLocationForCaller(md, nametable, min, baseLocation, constraint);
+
+ if (ceilingLoc == null) {
+ return new CompositeLocation(Location.createTopLocation(md));
+ }
return ceilingLoc;
}
}
List<CompositeLocation> argList = new ArrayList<CompositeLocation>();
// by default, method has a THIS parameter
- argList.add(baseLocation);
+ if (!min.getMethod().isStatic()) {
+ argList.add(baseLocation);
+ }
for (int i = 0; i < min.numArgs(); i++) {
ExpressionNode en = min.getArg(i);
argList.add(callerArg);
}
- // System.out.println("\n## computeReturnLocation=" + min.getMethod() +
- // " argList=" + argList);
+ // System.out.println("\n## computeReturnLocation=" + min.getMethod() + " argList=" + argList);
CompositeLocation ceilLoc = md2ReturnLocGen.get(min.getMethod()).computeReturnLocation(argList);
// System.out.println("## ReturnLocation=" + ceilLoc);
private void checkCalleeConstraints(MethodDescriptor md, SymbolTable nametable,
MethodInvokeNode min, CompositeLocation callerBaseLoc, CompositeLocation constraint) {
- // System.out.println("checkCalleeConstraints=" + min.printNode(0));
-
MethodDescriptor calleemd = min.getMethod();
MethodLattice<String> calleeLattice = ssjava.getMethodLattice(calleemd);
+
+ System.out.println("checkCalleeConstraints=" + calleemd + " calleeLattice.getThisLoc()="
+ + calleeLattice.getThisLoc());
+
CompositeLocation calleeThisLoc =
new CompositeLocation(new Location(calleemd, calleeLattice.getThisLoc()));
// setup caller args set
// first, add caller's base(this) location
- callerArgList.add(callerBaseLoc);
+ if (!calleemd.isStatic())
+ callerArgList.add(callerBaseLoc);
// second, add caller's arguments
for (int i = 0; i < min.numArgs(); i++) {
ExpressionNode en = min.getArg(i);
// setup callee params set
// first, add callee's this location
- calleeParamList.add(calleeThisLoc);
+ if (!calleemd.isStatic())
+ calleeParamList.add(calleeThisLoc);
// second, add callee's parameters
for (int i = 0; i < calleemd.numParameters(); i++) {
VarDescriptor calleevd = (VarDescriptor) calleemd.getParameter(i);
private CompositeLocation checkLocationFromArrayAccessNode(MethodDescriptor md,
SymbolTable nametable, ArrayAccessNode aan, CompositeLocation constraint, boolean isLHS) {
-
+ System.out.println("aan=" + aan.printNode(0) + " line#=" + aan.getNumLine());
ClassDescriptor cd = md.getClassDesc();
CompositeLocation arrayLoc =
}
}
+ Set<CompositeLocation> inputGLB = new HashSet<CompositeLocation>();
if (left instanceof ArrayAccessNode) {
ArrayAccessNode aan = (ArrayAccessNode) left;
- left = aan.getExpression();
+ CompositeLocation indexLoc =
+ checkLocationFromExpressionNode(md, nametable, aan.getIndex(), loc, constraint, false);
+ inputGLB.add(indexLoc);
}
loc = checkLocationFromExpressionNode(md, nametable, left, loc, constraint, false);
- // System.out.println("### checkLocationFromFieldAccessNode=" +
- // fan.printNode(0));
- // System.out.println("### left=" + left.printNode(0));
if (!left.getType().isPrimitive()) {
- if (fd.getSymbol().equals("length")) {
+ if (!fd.getSymbol().equals("length")) {
// array.length access, return the location of the array
- return loc;
+ Location fieldLoc = getFieldLocation(fd);
+ loc.addLocation(fieldLoc);
}
- Location fieldLoc = getFieldLocation(fd);
- loc.addLocation(fieldLoc);
}
+
+ inputGLB.add(loc);
+ loc = CompositeLattice.calculateGLB(inputGLB, generateErrorMessage(md.getClassDesc(), fan));
return loc;
}
private CompositeLocation checkLocationFromAssignmentNode(MethodDescriptor md,
SymbolTable nametable, AssignmentNode an, CompositeLocation loc, CompositeLocation constraint) {
-
ClassDescriptor cd = md.getClassDesc();
Set<CompositeLocation> inputGLBSet = new HashSet<CompositeLocation>();
}
if (constraint != null) {
- inputGLBSet.add(srcLocation);
- inputGLBSet.add(constraint);
- srcLocation = CompositeLattice.calculateGLB(inputGLBSet, generateErrorMessage(cd, an));
+
+ if (!CompositeLattice.isGreaterThan(constraint, destLocation, generateErrorMessage(cd, an))) {
+ throw new Error("The value flow from " + constraint + " to " + destLocation
+ + " does not respect location hierarchy on the assignment " + an.printNode(0)
+ + " at " + cd.getSourceFileName() + "::" + an.getNumLine());
+ }
+ // inputGLBSet.add(srcLocation);
+ // inputGLBSet.add(constraint);
+ // srcLocation = CompositeLattice.calculateGLB(inputGLBSet,
+ // generateErrorMessage(cd, an));
}
+ // System.out.println("src=" + srcLocation + " dest=" + destLocation + " const=" +
+ // constraint);
+
if (!CompositeLattice.isGreaterThan(srcLocation, destLocation, generateErrorMessage(cd, an))) {
String context = "";
constraint, false);
if (constraint != null) {
- inputGLBSet.add(rhsLocation);
- inputGLBSet.add(constraint);
- srcLocation = CompositeLattice.calculateGLB(inputGLBSet, generateErrorMessage(cd, an));
+
+ if (!CompositeLattice.isGreaterThan(constraint, destLocation, generateErrorMessage(cd, an))) {
+ throw new Error("The value flow from " + constraint + " to " + destLocation
+ + " does not respect location hierarchy on the assignment " + an.printNode(0)
+ + " at " + cd.getSourceFileName() + "::" + an.getNumLine());
+ }
+ // inputGLBSet.add(rhsLocation);
+ // inputGLBSet.add(constraint);
+ // srcLocation = CompositeLattice.calculateGLB(inputGLBSet,
+ // generateErrorMessage(cd, an));
+ srcLocation = rhsLocation;
} else {
srcLocation = rhsLocation;
}
SSJavaLattice<String> locOrder = getLatticeByDescriptor(priorityDescriptor);
String glbOfPriorityLoc = locOrder.getGLB(priorityLocIdentifierSet);
-
glbCompLoc.addLocation(new Location(priorityDescriptor, glbOfPriorityLoc));
Set<CompositeLocation> compSet = locId2CompLocSet.get(glbOfPriorityLoc);
// compute GLB of arguments subset that are same or higher than return
// location
if (inputGLB.isEmpty()) {
+ if (args.size() == 0) {
+ return null;
+ }
CompositeLocation rtr =
new CompositeLocation(Location.createTopLocation(args.get(0).get(0).getDescriptor()));
return rtr;