Search in sources :

Example 16 with Range

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;
    }
}
Also used : Range(org.checkerframework.common.value.util.Range) IntRange(org.checkerframework.common.value.qual.IntRange) AnnotatedTypeMirror(org.checkerframework.framework.type.AnnotatedTypeMirror)

Example 17 with Range

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;
    }
}
Also used : Range(org.checkerframework.common.value.util.Range) IntRange(org.checkerframework.common.value.qual.IntRange) AnnotatedTypeMirror(org.checkerframework.framework.type.AnnotatedTypeMirror)

Example 18 with Range

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;
    }
}
Also used : ArrayLenRange(org.checkerframework.common.value.qual.ArrayLenRange) Range(org.checkerframework.common.value.util.Range)

Example 19 with Range

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);
}
Also used : ArrayLenRange(org.checkerframework.common.value.qual.ArrayLenRange) Range(org.checkerframework.common.value.util.Range)

Example 20 with Range

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);
}
Also used : CFValue(org.checkerframework.framework.flow.CFValue) AnnotationMirror(javax.lang.model.element.AnnotationMirror) TypeKind(javax.lang.model.type.TypeKind) StringConversionNode(org.checkerframework.dataflow.cfg.node.StringConversionNode) ArrayLenRange(org.checkerframework.common.value.qual.ArrayLenRange) Range(org.checkerframework.common.value.util.Range)

Aggregations

Range (org.checkerframework.common.value.util.Range)22 ArrayLenRange (org.checkerframework.common.value.qual.ArrayLenRange)15 IntRange (org.checkerframework.common.value.qual.IntRange)7 ArrayList (java.util.ArrayList)6 AnnotationMirror (javax.lang.model.element.AnnotationMirror)6 CFValue (org.checkerframework.framework.flow.CFValue)4 AnnotatedTypeMirror (org.checkerframework.framework.type.AnnotatedTypeMirror)4 List (java.util.List)3 StringConversionNode (org.checkerframework.dataflow.cfg.node.StringConversionNode)3 TypeKind (javax.lang.model.type.TypeKind)2 IntVal (org.checkerframework.common.value.qual.IntVal)2 Test (org.junit.Test)2 ArrayLen (org.checkerframework.common.value.qual.ArrayLen)1 BottomVal (org.checkerframework.common.value.qual.BottomVal)1 DoubleVal (org.checkerframework.common.value.qual.DoubleVal)1 StringVal (org.checkerframework.common.value.qual.StringVal)1 UnknownVal (org.checkerframework.common.value.qual.UnknownVal)1