framework.src.org.checkerframework.qualframework.base.dataflow.QualTransferAdapter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of checker Show documentation
Show all versions of checker Show documentation
The Checker Framework enhances Java’s type system to
make it more powerful and useful. This lets software developers
detect and prevent errors in their Java programs.
The Checker Framework includes compiler plug-ins ("checkers")
that find bugs or verify their absence. It also permits you to
write your own compiler plug-ins.
package org.checkerframework.qualframework.base.dataflow;
import org.checkerframework.dataflow.analysis.ConditionalTransferResult;
import org.checkerframework.dataflow.analysis.RegularTransferResult;
import org.checkerframework.dataflow.analysis.TransferInput;
import org.checkerframework.dataflow.analysis.TransferResult;
import org.checkerframework.dataflow.cfg.UnderlyingAST;
import org.checkerframework.dataflow.cfg.node.ArrayAccessNode;
import org.checkerframework.dataflow.cfg.node.ArrayCreationNode;
import org.checkerframework.dataflow.cfg.node.ArrayTypeNode;
import org.checkerframework.dataflow.cfg.node.AssertionErrorNode;
import org.checkerframework.dataflow.cfg.node.AssignmentNode;
import org.checkerframework.dataflow.cfg.node.BitwiseAndNode;
import org.checkerframework.dataflow.cfg.node.BitwiseComplementNode;
import org.checkerframework.dataflow.cfg.node.BitwiseOrNode;
import org.checkerframework.dataflow.cfg.node.BitwiseXorNode;
import org.checkerframework.dataflow.cfg.node.BooleanLiteralNode;
import org.checkerframework.dataflow.cfg.node.CaseNode;
import org.checkerframework.dataflow.cfg.node.CharacterLiteralNode;
import org.checkerframework.dataflow.cfg.node.ClassNameNode;
import org.checkerframework.dataflow.cfg.node.ConditionalAndNode;
import org.checkerframework.dataflow.cfg.node.ConditionalNotNode;
import org.checkerframework.dataflow.cfg.node.ConditionalOrNode;
import org.checkerframework.dataflow.cfg.node.DoubleLiteralNode;
import org.checkerframework.dataflow.cfg.node.EqualToNode;
import org.checkerframework.dataflow.cfg.node.ExplicitThisLiteralNode;
import org.checkerframework.dataflow.cfg.node.FieldAccessNode;
import org.checkerframework.dataflow.cfg.node.FloatLiteralNode;
import org.checkerframework.dataflow.cfg.node.FloatingDivisionNode;
import org.checkerframework.dataflow.cfg.node.FloatingRemainderNode;
import org.checkerframework.dataflow.cfg.node.FunctionalInterfaceNode;
import org.checkerframework.dataflow.cfg.node.GreaterThanNode;
import org.checkerframework.dataflow.cfg.node.GreaterThanOrEqualNode;
import org.checkerframework.dataflow.cfg.node.ImplicitThisLiteralNode;
import org.checkerframework.dataflow.cfg.node.InstanceOfNode;
import org.checkerframework.dataflow.cfg.node.IntegerDivisionNode;
import org.checkerframework.dataflow.cfg.node.IntegerLiteralNode;
import org.checkerframework.dataflow.cfg.node.IntegerRemainderNode;
import org.checkerframework.dataflow.cfg.node.LeftShiftNode;
import org.checkerframework.dataflow.cfg.node.LessThanNode;
import org.checkerframework.dataflow.cfg.node.LessThanOrEqualNode;
import org.checkerframework.dataflow.cfg.node.LocalVariableNode;
import org.checkerframework.dataflow.cfg.node.LongLiteralNode;
import org.checkerframework.dataflow.cfg.node.MarkerNode;
import org.checkerframework.dataflow.cfg.node.MethodAccessNode;
import org.checkerframework.dataflow.cfg.node.MethodInvocationNode;
import org.checkerframework.dataflow.cfg.node.NarrowingConversionNode;
import org.checkerframework.dataflow.cfg.node.NotEqualNode;
import org.checkerframework.dataflow.cfg.node.NullChkNode;
import org.checkerframework.dataflow.cfg.node.NullLiteralNode;
import org.checkerframework.dataflow.cfg.node.NumericalAdditionNode;
import org.checkerframework.dataflow.cfg.node.NumericalMinusNode;
import org.checkerframework.dataflow.cfg.node.NumericalMultiplicationNode;
import org.checkerframework.dataflow.cfg.node.NumericalPlusNode;
import org.checkerframework.dataflow.cfg.node.NumericalSubtractionNode;
import org.checkerframework.dataflow.cfg.node.ObjectCreationNode;
import org.checkerframework.dataflow.cfg.node.PackageNameNode;
import org.checkerframework.dataflow.cfg.node.ParameterizedTypeNode;
import org.checkerframework.dataflow.cfg.node.PrimitiveTypeNode;
import org.checkerframework.dataflow.cfg.node.ReturnNode;
import org.checkerframework.dataflow.cfg.node.ShortLiteralNode;
import org.checkerframework.dataflow.cfg.node.SignedRightShiftNode;
import org.checkerframework.dataflow.cfg.node.StringConcatenateAssignmentNode;
import org.checkerframework.dataflow.cfg.node.StringConcatenateNode;
import org.checkerframework.dataflow.cfg.node.StringConversionNode;
import org.checkerframework.dataflow.cfg.node.StringLiteralNode;
import org.checkerframework.dataflow.cfg.node.SuperNode;
import org.checkerframework.dataflow.cfg.node.SynchronizedNode;
import org.checkerframework.dataflow.cfg.node.TernaryExpressionNode;
import org.checkerframework.dataflow.cfg.node.ThrowNode;
import org.checkerframework.dataflow.cfg.node.TypeCastNode;
import org.checkerframework.dataflow.cfg.node.UnsignedRightShiftNode;
import org.checkerframework.dataflow.cfg.node.VariableDeclarationNode;
import org.checkerframework.dataflow.cfg.node.WideningConversionNode;
import org.checkerframework.framework.flow.CFAbstractAnalysis;
import org.checkerframework.framework.flow.CFStore;
import org.checkerframework.framework.flow.CFTransfer;
import org.checkerframework.framework.flow.CFValue;
import javax.lang.model.type.TypeMirror;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* QualTransferAdapter adapts the {@link CFTransfer} to a {@link QualTransfer}.
*
* It does this by converting TransferInputs and TransferResults backed
* by CFValue and CFStores to ones backed by QualValue and QualStores.
*
*/
public class QualTransferAdapter extends CFTransfer {
private final QualTransfer underlying;
private final QualAnalysis qualAnalysis;
public QualTransferAdapter(
QualTransfer underlying,
CFAbstractAnalysis analysis,
QualAnalysis qualAnalysis) {
super(analysis);
underlying.setAdapter(this);
this.underlying = underlying;
this.qualAnalysis = qualAnalysis;
}
/**
* Convert a TransferInput backed by CFValue and CFStores to one backed by QualValue and QualStores.
*/
public TransferInput, QualStore> convertCfToQualInput(TransferInput transferInput) {
if (transferInput.containsTwoStores()) {
return new TransferInput<>(transferInput.getNode(), qualAnalysis,
new QualStore(qualAnalysis, transferInput.getThenStore()),
new QualStore(qualAnalysis, transferInput.getElseStore()));
} else {
return new TransferInput<>(transferInput.getNode(), qualAnalysis,
new QualStore(qualAnalysis, transferInput.getThenStore()));
}
}
/**
* Convert a TransferInput backed by QualValue and QualStores to one backed by CFValue and CFStores.
*/
public TransferInput convertQualToCfInput(TransferInput, QualStore> transferInput) {
if (transferInput.containsTwoStores()) {
return new TransferInput<>(transferInput.getNode(), analysis,
transferInput.getThenStore().getUnderlyingStore(), transferInput.getElseStore().getUnderlyingStore());
} else {
return new TransferInput<>(transferInput.getNode(), analysis,
transferInput.getRegularStore().getUnderlyingStore());
}
}
/**
* Convert a TransferResult backed by QualValue and QualStores to one backed by CFValue and CFStores.
*/
public TransferResult convertQualToCfResult(TransferResult,
QualStore> transferResult) {
Map> exeStores = transferResult.getExceptionalStores();
Map convertedExeStores = new HashMap<>();
if (exeStores != null) {
for (Map.Entry> entry : exeStores.entrySet()) {
convertedExeStores.put(entry.getKey(), entry.getValue().getUnderlyingStore());
}
}
CFValue resultValue = null;
if (transferResult.getResultValue() != null) {
resultValue = analysis.createAbstractValue(
qualAnalysis.getConverter().getAnnotatedType(transferResult.getResultValue().getType()));
}
if (transferResult.containsTwoStores()) {
return new ConditionalTransferResult<>(resultValue,
transferResult.getThenStore().getUnderlyingStore(),
transferResult.getElseStore().getUnderlyingStore(),
convertedExeStores, transferResult.storeChanged());
} else {
return new RegularTransferResult<>(resultValue,
transferResult.getRegularStore().getUnderlyingStore(),
convertedExeStores, transferResult.storeChanged());
}
}
/**
* Convert a TransferResult backed by CFValue and CFStores to one backed by QualValue and QualStores.
*/
public TransferResult, QualStore> convertCfToQualResult(TransferResult transferResult) {
Map exeStores = transferResult.getExceptionalStores();
Map> convertedExeStores = new HashMap<>();
if (exeStores != null) {
for (Map.Entry entry : exeStores.entrySet()) {
convertedExeStores.put(entry.getKey(), new QualStore(qualAnalysis, entry.getValue()));
}
}
QualValue resultValue = null;
if (transferResult.getResultValue() != null) {
resultValue = qualAnalysis.createAbstractValue(
qualAnalysis.getConverter().getQualifiedType(transferResult.getResultValue().getType()));
}
if (transferResult.containsTwoStores()) {
return new ConditionalTransferResult<>(resultValue,
new QualStore(qualAnalysis, transferResult.getThenStore()),
new QualStore(qualAnalysis, transferResult.getElseStore()),
convertedExeStores, transferResult.storeChanged());
} else {
return new RegularTransferResult<>(resultValue,
new QualStore(qualAnalysis, transferResult.getRegularStore()),
convertedExeStores, transferResult.storeChanged());
}
}
public QualStore superInitialStore(UnderlyingAST underlyingAST, List parameters) {
CFStore initialStore = super.initialStore(underlyingAST, parameters);
return new QualStore<>(qualAnalysis, initialStore);
}
@Override
public TransferResult visitShortLiteral(ShortLiteralNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitShortLiteral(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitShortLiteral(ShortLiteralNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitShortLiteral(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitIntegerLiteral(IntegerLiteralNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitIntegerLiteral(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitIntegerLiteral(IntegerLiteralNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitIntegerLiteral(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitLongLiteral(LongLiteralNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitLongLiteral(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitLongLiteral(LongLiteralNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitLongLiteral(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitFloatLiteral(FloatLiteralNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitFloatLiteral(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitFloatLiteral(FloatLiteralNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitFloatLiteral(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitDoubleLiteral(DoubleLiteralNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitDoubleLiteral(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitDoubleLiteral(DoubleLiteralNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitDoubleLiteral(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitBooleanLiteral(BooleanLiteralNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitBooleanLiteral(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitBooleanLiteral(BooleanLiteralNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitBooleanLiteral(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitCharacterLiteral(CharacterLiteralNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitCharacterLiteral(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitCharacterLiteral(CharacterLiteralNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitCharacterLiteral(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitStringLiteral(StringLiteralNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitStringLiteral(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitStringLiteral(StringLiteralNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitStringLiteral(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitNullLiteral(NullLiteralNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitNullLiteral(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitNullLiteral(NullLiteralNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitNullLiteral(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
// Unary operations
@Override
public TransferResult visitNumericalMinus(NumericalMinusNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitNumericalMinus(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitNumericalMinus(NumericalMinusNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitNumericalMinus(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitNumericalPlus(NumericalPlusNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitNumericalPlus(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitNumericalPlus(NumericalPlusNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitNumericalPlus(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitBitwiseComplement(BitwiseComplementNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitBitwiseComplement(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitBitwiseComplement(BitwiseComplementNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitBitwiseComplement(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitNullChk(NullChkNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitNullChk(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitNullChk(NullChkNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitNullChk(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
// Binary operations
@Override
public TransferResult visitStringConcatenate(StringConcatenateNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitStringConcatenate(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitStringConcatenate(StringConcatenateNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitStringConcatenate(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitNumericalAddition(NumericalAdditionNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitNumericalAddition(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitNumericalAddition(NumericalAdditionNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitNumericalAddition(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitNumericalSubtraction(NumericalSubtractionNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitNumericalSubtraction(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitNumericalSubtraction(NumericalSubtractionNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitNumericalSubtraction(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitNumericalMultiplication(NumericalMultiplicationNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitNumericalMultiplication(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitNumericalMultiplication(NumericalMultiplicationNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitNumericalMultiplication(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitIntegerDivision(IntegerDivisionNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitIntegerDivision(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitIntegerDivision(IntegerDivisionNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitIntegerDivision(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitFloatingDivision(FloatingDivisionNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitFloatingDivision(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitFloatingDivision(FloatingDivisionNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitFloatingDivision(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitIntegerRemainder(IntegerRemainderNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitIntegerRemainder(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitIntegerRemainder(IntegerRemainderNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitIntegerRemainder(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitFloatingRemainder(FloatingRemainderNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitFloatingRemainder(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitFloatingRemainder(FloatingRemainderNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitFloatingRemainder(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitLeftShift(LeftShiftNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitLeftShift(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitLeftShift(LeftShiftNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitLeftShift(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitSignedRightShift(SignedRightShiftNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitSignedRightShift(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitSignedRightShift(SignedRightShiftNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitSignedRightShift(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitUnsignedRightShift(UnsignedRightShiftNode n, TransferInput p) {
TransferResult, QualStore> result = underlying.visitUnsignedRightShift(n, convertCfToQualInput(p));
return convertQualToCfResult(result);
}
public TransferResult, QualStore> superVisitUnsignedRightShift(UnsignedRightShiftNode n, TransferInput, QualStore> p) {
TransferResult result = super.visitUnsignedRightShift(n, convertQualToCfInput(p));
return convertCfToQualResult(result);
}
@Override
public TransferResult visitBitwiseAnd(BitwiseAndNode n, TransferInput