use of org.checkerframework.common.value.util.Range in project checker-framework by typetools.
the class IndexUtil method getExactValue.
/**
* Either returns the exact value of the given tree according to the Constant Value Checker, or
* null if the exact value is not known. This method should only be used by clients who need
* exactly one value -- such as the LBC's binary operator rules -- and not by those that need to
* know whether a valueType belongs to a particular qualifier.
*/
public static Long getExactValue(Tree tree, ValueAnnotatedTypeFactory factory) {
AnnotatedTypeMirror valueType = factory.getAnnotatedType(tree);
Range possibleValues = getPossibleValues(valueType, factory);
if (possibleValues != null && possibleValues.from == possibleValues.to) {
return possibleValues.from;
} else {
return null;
}
}
use of org.checkerframework.common.value.util.Range in project checker-framework by typetools.
the class IndexUtil method getMaxValue.
/**
* Finds the maximum value in a Value Checker type. If there is no information (such as when the
* list of possible values is empty or null), returns null. Otherwise, returns the smallest
* value in the list of possible values.
*/
public static Long getMaxValue(Tree tree, ValueAnnotatedTypeFactory factory) {
AnnotatedTypeMirror valueType = factory.getAnnotatedType(tree);
Range possibleValues = getPossibleValues(valueType, factory);
if (possibleValues != null) {
return possibleValues.to;
} else {
return null;
}
}
use of org.checkerframework.common.value.util.Range in project checker-framework by typetools.
the class ValueTransfer method calculateRangeUnaryOp.
/**
* Calculate the result range after a unary operation of a numerical type node
*/
private Range calculateRangeUnaryOp(Node operand, NumericalUnaryOps op, TransferInput<CFValue, CFStore> p) {
if (TypesUtils.isIntegral(operand.getType())) {
Range range = getIntRange(operand, p);
Range resultRange;
switch(op) {
case PLUS:
resultRange = range.unaryPlus();
break;
case MINUS:
resultRange = range.unaryMinus();
break;
case BITWISE_COMPLEMENT:
resultRange = range.bitwiseComplement();
break;
default:
ErrorReporter.errorAbort("ValueTransfer: unsupported operation: " + op);
throw new RuntimeException("this can't happen");
}
// operations.
return operand.getType().getKind() == TypeKind.LONG ? resultRange : resultRange.intRange();
} else {
return Range.EVERYTHING;
}
}
use of org.checkerframework.common.value.util.Range in project checker-framework by typetools.
the class ValueTransfer method getIntRangeStringLengthRange.
/**
* Returns a range of possible lengths for an integer from a range, as casted to a String.
*/
private Range getIntRangeStringLengthRange(Node subNode, TransferInput<CFValue, CFStore> p) {
Range valueRange = getIntRange(subNode, p);
// Get lengths of the bounds
int fromLength = Long.toString(valueRange.from).length();
int toLength = Long.toString(valueRange.to).length();
int lowerLength = Math.min(fromLength, toLength);
// In case the range contains 0, the minimum length is 1 even if both bounds are longer
if (valueRange.contains(0)) {
lowerLength = 1;
}
int upperLength = Math.max(fromLength, toLength);
return new Range(lowerLength, upperLength);
}
use of org.checkerframework.common.value.util.Range in project checker-framework by typetools.
the class ValueTransfer method getStringLengthRange.
/**
* Returns a range of possible lengths for {@code subNode}, as casted to a String.
*/
private Range getStringLengthRange(Node subNode, TransferInput<CFValue, CFStore> p) {
CFValue value = p.getValueOfSubNode(subNode);
AnnotationMirror arrayLenRangeAnno = AnnotationUtils.getAnnotationByClass(value.getAnnotations(), ArrayLenRange.class);
if (arrayLenRangeAnno != null) {
return ValueAnnotatedTypeFactory.getRange(arrayLenRangeAnno);
}
// @BottomVal
if (AnnotationUtils.containsSameByClass(value.getAnnotations(), BottomVal.class)) {
return Range.NOTHING;
}
TypeKind subNodeTypeKind = subNode.getType().getKind();
// handle values converted to string (ints, longs, longs with @IntRange)
if (subNode instanceof StringConversionNode) {
return getStringLengthRange(((StringConversionNode) subNode).getOperand(), p);
} else if (isIntRange(subNode, p)) {
return getIntRangeStringLengthRange(subNode, p);
} else if (subNodeTypeKind == TypeKind.INT) {
// ints are between 1 and 11 characters long
return new Range(1, 11);
} else if (subNodeTypeKind == TypeKind.LONG) {
// longs are between 1 and 20 characters long
return new Range(1, 20);
}
return new Range(0, Integer.MAX_VALUE);
}
Aggregations