public class FakedTrackingVariable extends LocalDeclaration
| Modifier and Type | Class and Description |
|---|---|
static class |
FakedTrackingVariable.IteratorForReporting
Iterator for a set of FakedTrackingVariable, which dispenses the elements
according to the priorities defined by enum
Stage. |
InvocationSite.EmptyWithAstNodeTypeConstants.BoundCheckStatus, TypeConstants.CloseMethodRecord| Modifier and Type | Field and Description |
|---|---|
FakedTrackingVariable |
innerTracker |
LocalVariableBinding |
originalBinding |
FakedTrackingVariable |
outerTracker |
static boolean |
TEST_372319 |
bindingannotations, declarationEnd, declarationSourceEnd, declarationSourceStart, ENUM_CONSTANT, FIELD, hiddenVariableDepth, initialization, INITIALIZER, LOCAL_VARIABLE, modifiers, modifiersSourceStart, name, PARAMETER, type, TYPE_PARAMETERCOMPLAINED_FAKE_REACHABLE, COMPLAINED_UNREACHABLE, NOT_COMPLAINEDBit1, Bit10, Bit11, Bit12, Bit13, Bit14, Bit15, Bit16, Bit17, Bit18, Bit19, Bit2, Bit20, Bit21, Bit22, Bit23, Bit24, Bit25, Bit26, Bit27, Bit28, Bit29, Bit3, Bit30, Bit31, Bit32, Bit32L, Bit33L, Bit34L, Bit35L, Bit36L, Bit37L, Bit38L, Bit39L, Bit4, Bit40L, Bit41L, Bit42L, Bit43L, Bit44L, Bit45L, Bit46L, Bit47L, Bit48L, Bit49L, Bit5, Bit50L, Bit51L, Bit52L, Bit53L, Bit54L, Bit55L, Bit56L, Bit57L, Bit58L, Bit59L, Bit6, Bit60L, Bit61L, Bit62L, Bit63L, Bit64L, Bit7, Bit8, Bit9, bits, BlockExit, CanBeStatic, ContainsAssertion, DepthMASK, DepthSHIFT, DidResolve, DisableUnnecessaryCastCheck, DiscardEnclosingInstance, DocumentedCasesOmitted, DocumentedFallthrough, Empty, ErrorInSignature, FirstAssignmentToLocal, GenerateCheckcast, HasAbstractMethods, HasAllMethodBodies, HasBeenGenerated, HasBeenResolved, HasFunctionalInterfaceTypes, HasLocalType, HasSyntaxErrors, HasTypeAnnotations, IgnoreNoEffectAssignCheck, IgnoreRawTypeCheck, InsideExpressionStatement, InsideJavadoc, INVOCATION_ARGUMENT_OK, INVOCATION_ARGUMENT_UNCHECKED, INVOCATION_ARGUMENT_WILDCARD, IsAnnotationDefaultValue, IsAnonymousType, IsAnySubRoutineEscaping, IsArgument, IsCapturedOuterLocal, IsCompoundAssigned, IsDefaultConstructor, IsDiamond, IsElseIfStatement, IsElseStatementUnreachable, IsForeachElementVariable, IsImplicitThis, IsImplicitUnit, IsLocalDeclarationReachable, IsLocalType, IsMemberType, IsNonNull, IsReachable, IsRecovered, IsReturnedValue, IsSecondaryType, IsStrictlyAssigned, IsSubRoutineEscaping, IsSuperType, IsSynchronized, IsSynthetic, IsThenStatementUnreachable, IsTryBlockExiting, IsTypeElided, IsUnionType, IsUsefulEmptyStatement, IsVarArgs, LabelUsed, NeededScope, NeedFreeReturn, NeedReceiverGenericCast, NO_ARGUMENTS, OnDemand, OperatorMASK, OperatorSHIFT, OverridingMethodWithSupercall, ParenthesizedMASK, ParenthesizedSHIFT, ResolveJavadoc, RestrictiveFlagMASK, ReturnTypeIDMASK, ShadowsOuterLocal, sourceEnd, sourceStart, SuperAccess, ThenExit, Unchecked, UndocumentedEmptyBlock, UnnecessaryCast, UnsafeCast, UsedANNOTATION, ANNOTATION_PREFIX, ANNOTATION_SUFFIX, ANONYM_PREFIX, ANONYM_SUFFIX, ANONYMOUS_METHOD, APACHE, APACHE_DBUTILS, APACHE_IOUTILS, ASSERT_CLASS, ASSERT_FALSE, ASSERT_NOTNULL, ASSERT_NULL, ASSERT_TRUE, AUTOWIRED, BEANS, BOOLEAN, BYTE, CAPTURE18, CHAR, CharArray_JAVA_IO_OBJECTINPUTSTREAM, CharArray_JAVA_IO_OBJECTOUTPUTSTREAM, CharArray_JAVA_IO_OBJECTSTREAMFIELD, CharArray_JAVA_LANG_ANNOTATION_ANNOTATION, CharArray_JAVA_LANG_ENUM, CharArray_JAVA_LANG_OBJECT, CHECK_ARGUMENT, CHECK_NOT_NULL, CHECK_STATE, CLINIT, CLONE, CLOSE, CLOSE_QUIETLY, closeMethods, COM, COM_GOOGLE_COMMON_BASE_PRECONDITIONS, COM_GOOGLE_INJECT_INJECT, COMMONS, COMPILER, CONSTRAINT_EQUAL, CONSTRAINT_EXTENDS, CONSTRAINT_SUPER, CORE, DEFAULT_LOCATION__ARRAY_CONTENTS, DEFAULT_LOCATION__FIELD, DEFAULT_LOCATION__PARAMETER, DEFAULT_LOCATION__RETURN_TYPE, DEFAULT_LOCATION__TYPE_ARGUMENT, DEFAULT_LOCATION__TYPE_BOUND, DEFAULT_LOCATION__TYPE_PARAMETER, DESERIALIZE_LAMBDA, DOM, DOUBLE, ECLIPSE, EQUALS, FACTORY, FLOAT, FRAMEWORK, GETCLASS, GOOGLE, GUAVA_CLOSEABLES, HASHCODE, INIT, INJECT_PACKAGE, INJECT_TYPE, INT, INTERNAL, INVOKE, IO, IS_NOTNULL, IS_TRUE, ITYPEBINDING, JAVA, JAVA_IO, JAVA_IO_CLOSEABLE, JAVA_IO_EXTERNALIZABLE, JAVA_IO_IOEXCEPTION, JAVA_IO_OBJECTINPUTSTREAM, JAVA_IO_OBJECTOUTPUTSTREAM, JAVA_IO_OBJECTSTREAMEXCEPTION, JAVA_IO_PRINTSTREAM, JAVA_IO_RESOURCE_FREE_CLOSEABLES, JAVA_IO_SERIALIZABLE, JAVA_IO_WRAPPER_CLOSEABLES, JAVA_LANG, JAVA_LANG_ANNOTATION, JAVA_LANG_ANNOTATION_ANNOTATION, JAVA_LANG_ANNOTATION_DOCUMENTED, JAVA_LANG_ANNOTATION_ELEMENTTYPE, JAVA_LANG_ANNOTATION_INHERITED, JAVA_LANG_ANNOTATION_REPEATABLE, JAVA_LANG_ANNOTATION_RETENTION, JAVA_LANG_ANNOTATION_RETENTIONPOLICY, JAVA_LANG_ANNOTATION_TARGET, JAVA_LANG_ASSERTIONERROR, JAVA_LANG_AUTOCLOSEABLE, JAVA_LANG_BOOLEAN, JAVA_LANG_BYTE, JAVA_LANG_CHARACTER, JAVA_LANG_CLASS, JAVA_LANG_CLASSNOTFOUNDEXCEPTION, JAVA_LANG_CLONEABLE, JAVA_LANG_DEPRECATED, JAVA_LANG_DOUBLE, JAVA_LANG_ENUM, JAVA_LANG_ERROR, JAVA_LANG_EXCEPTION, JAVA_LANG_FLOAT, JAVA_LANG_FUNCTIONAL_INTERFACE, JAVA_LANG_ILLEGALARGUMENTEXCEPTION, JAVA_LANG_INTEGER, JAVA_LANG_INVOKE_LAMBDAMETAFACTORY, JAVA_LANG_INVOKE_METHODHANDLE_$_POLYMORPHICSIGNATURE, JAVA_LANG_INVOKE_METHODHANDLE_POLYMORPHICSIGNATURE, JAVA_LANG_INVOKE_METHODHANDLES, JAVA_LANG_INVOKE_SERIALIZEDLAMBDA, JAVA_LANG_ITERABLE, JAVA_LANG_LONG, JAVA_LANG_NOCLASSDEFERROR, JAVA_LANG_OBJECT, JAVA_LANG_OVERRIDE, JAVA_LANG_REFLECT_CONSTRUCTOR, JAVA_LANG_REFLECT_FIELD, JAVA_LANG_REFLECT_METHOD, JAVA_LANG_RUNTIMEEXCEPTION, JAVA_LANG_SAFEVARARGS, JAVA_LANG_SHORT, JAVA_LANG_STRING, JAVA_LANG_STRINGBUFFER, JAVA_LANG_STRINGBUILDER, JAVA_LANG_SUPPRESSWARNINGS, JAVA_LANG_SYSTEM, JAVA_LANG_THROWABLE, JAVA_LANG_VOID, JAVA_NIO_FILE_FILES, JAVA_UTIL_COLLECTION, JAVA_UTIL_ITERATOR, JAVA_UTIL_OBJECTS, JAVA_UTIL_ZIP_WRAPPER_CLOSEABLES, JAVAX, JAVAX_ANNOTATION_INJECT_INJECT, JAVAX_RMI_CORBA_STUB, JDT, JUNIT, JUNIT_FRAMEWORK_ASSERT, LAMBDA_TYPE, LANG, LANG3, LENGTH, LONG, LOOKUP, MAIN, NOT_NULL, NULL, OBJECT, OPTIONAL, ORG, ORG_APACHE_COMMONS_LANG_VALIDATE, ORG_APACHE_COMMONS_LANG3_VALIDATE, ORG_ECLIPSE_CORE_RUNTIME_ASSERT, ORG_ECLIPSE_JDT_CORE_DOM_ITYPEBINDING, ORG_ECLIPSE_JDT_INTERNAL_COMPILER_LOOKUP_TYPEBINDING, ORG_JUNIT_ASSERT, ORG_SPRING_AUTOWIRED, OTHER_WRAPPER_CLOSEABLES, PACKAGE_INFO_NAME, READOBJECT, READRESOLVE, REFLECT, REQUIRE_NON_NULL, REQUIRED, RESOURCE_FREE_CLOSEABLE_STREAM, RUNTIME, SERIALPERSISTENTFIELDS, SERIALVERSIONUID, SHORT, SPRING, SYNTHETIC_ACCESS_METHOD_PREFIX, SYNTHETIC_ASSERT_DISABLED, SYNTHETIC_CLASS, SYNTHETIC_ENCLOSING_INSTANCE_PREFIX, SYNTHETIC_ENUM_CONSTANT_INITIALIZATION_METHOD_PREFIX, SYNTHETIC_ENUM_VALUES, SYNTHETIC_OUTER_LOCAL_PREFIX, SYNTHETIC_STATIC_FACTORY, SYNTHETIC_SWITCH_ENUM_TABLE, TYPE, TYPE_PARAMETER_TARGET, TYPE_USE_TARGET, TYPEBINDING, UPPER_ANNOTATION_TYPE, UPPER_CLASS, UPPER_CONSTRUCTOR, UPPER_FIELD, UPPER_LOCAL_VARIABLE, UPPER_METHOD, UPPER_PACKAGE, UPPER_PARAMETER, UPPER_RUNTIME, UPPER_SOURCE, UTIL, VALIDATE_CLASS, VALUE, VALUEOF, VALUES, VOID, WILDCARD_CAPTURE, WILDCARD_CAPTURE_NAME_PREFIX, WILDCARD_CAPTURE_NAME_SUFFIX, WILDCARD_CAPTURE_SIGNABLE_NAME_SUFFIX, WILDCARD_EXTENDS, WILDCARD_MINUS, WILDCARD_NAME, WILDCARD_PLUS, WILDCARD_STAR, WILDCARD_SUPER, WRITEOBJECT, WRITEREPLACE, ZIPBitAnyNullAnnotation, BitAutoCloseable, BitCloseable, BitNonNullAnnotation, BitNonNullByDefaultAnnotation, BitNullableAnnotation, BitResourceFreeCloseable, BitUninitialized, BitUninternedType, BitWrapperCloseable, Boolean2Boolean, Boolean2Int, Boolean2String, BOXING, Byte2Byte, Byte2Char, Byte2Double, Byte2Float, Byte2Int, Byte2Long, Byte2Short, Byte2String, Char2Byte, Char2Char, Char2Double, Char2Float, Char2Int, Char2Long, Char2Short, Char2String, COMPILE_TYPE_MASK, Double2Byte, Double2Char, Double2Double, Double2Float, Double2Int, Double2Long, Double2Short, Double2String, Float2Byte, Float2Char, Float2Double, Float2Float, Float2Int, Float2Long, Float2Short, Float2String, IMPLICIT_CONVERSION_MASK, InheritableBits, Int2Byte, Int2Char, Int2Double, Int2Float, Int2Int, Int2Long, Int2Short, Int2String, Long2Byte, Long2Char, Long2Double, Long2Float, Long2Int, Long2Long, Long2Short, Long2String, NoId, Null2Null, Null2String, Object2boolean, Object2byte, Object2char, Object2double, Object2float, Object2int, Object2long, Object2Object, Object2short, Object2String, Short2Byte, Short2Char, Short2Double, Short2Float, Short2Int, Short2Long, Short2Short, Short2String, String2String, T_boolean, T_byte, T_char, T_ComGoogleCommonBasePreconditions, T_ComGoogleInjectInject, T_double, T_float, T_int, T_JavaIoException, T_JavaIoExternalizable, T_JavaIoObjectStreamException, T_JavaIoPrintStream, T_JavaIoSerializable, T_JavaLangAnnotationAnnotation, T_JavaLangAnnotationDocumented, T_JavaLangAnnotationElementType, T_JavaLangAnnotationInherited, T_JavaLangAnnotationRepeatable, T_JavaLangAnnotationRetention, T_JavaLangAnnotationRetentionPolicy, T_JavaLangAnnotationTarget, T_JavaLangAssertionError, T_JavaLangAutoCloseable, T_JavaLangBoolean, T_JavaLangByte, T_JavaLangCharacter, T_JavaLangClass, T_JavaLangClassNotFoundException, T_JavaLangCloneable, T_JavaLangDeprecated, T_JavaLangDouble, T_JavaLangEnum, T_JavaLangError, T_JavaLangException, T_JavaLangFloat, T_JavaLangFunctionalInterface, T_JavaLangIllegalArgumentException, T_JavaLangInteger, T_JavaLangInvokeMethodHandlePolymorphicSignature, T_JavaLangIterable, T_JavaLangLong, T_JavaLangNoClassDefError, T_JavaLangObject, T_JavaLangOverride, T_JavaLangReflectConstructor, T_JavaLangReflectField, T_JavaLangReflectMethod, T_JavaLangRuntimeException, T_JavaLangSafeVarargs, T_JavaLangShort, T_JavaLangString, T_JavaLangStringBuffer, T_JavaLangStringBuilder, T_JavaLangSuppressWarnings, T_JavaLangSystem, T_JavaLangThrowable, T_JavaLangVoid, T_JavaUtilCollection, T_JavaUtilIterator, T_JavaUtilObjects, T_JavaxInjectInject, T_JunitFrameworkAssert, T_LastWellKnownTypeId, T_long, T_null, T_OrgApacheCommonsLang3Validate, T_OrgApacheCommonsLangValidate, T_OrgEclipseCoreRuntimeAssert, T_OrgJunitAssert, T_OrgSpringframeworkBeansFactoryAnnotationAutowired, T_short, T_undefined, T_void, UNBOXING| Constructor and Description |
|---|
FakedTrackingVariable(LocalVariableBinding original,
ASTNode location,
FlowInfo flowInfo,
FlowContext flowContext,
int nullStatus) |
| Modifier and Type | Method and Description |
|---|---|
static void |
analyseCloseableAllocation(BlockScope scope,
FlowInfo flowInfo,
AllocationExpression allocation)
Compute/assign a tracking variable for a freshly allocated closeable value, using information from our white lists.
|
static void |
cleanUpAfterAssignment(BlockScope currentScope,
int lhsBits,
Expression expression) |
int |
findMostSpecificStatus(FlowInfo flowInfo,
BlockScope currentScope,
BlockScope locationScope) |
void |
generateCode(BlockScope currentScope,
CodeStream codeStream)
Code generation for a local declaration:
i.e. normal assignment to a local variable + unused variable handling
|
static FakedTrackingVariable |
getCloseTrackingVariable(Expression expression,
FlowInfo flowInfo,
FlowContext flowContext)
If expression resolves to a value of type AutoCloseable answer the variable that tracks closing of that local.
|
static void |
handleResourceAssignment(BlockScope scope,
FlowInfo upstreamInfo,
FlowInfo flowInfo,
FlowContext flowContext,
ASTNode location,
Expression rhs,
LocalVariableBinding local)
Given the rhs of an assignment or local declaration has a (Auto)Closeable type (or null), setup for leak analysis now:
Create or re-use a tracking variable, and wire and initialize everything.
|
boolean |
hasDefinitelyNoResource(FlowInfo flowInfo)
Answer true if we know for sure that no resource is bound to this variable
at the point of 'flowInfo'.
|
static boolean |
isAnyCloseable(TypeBinding typeBinding)
Answer wither the given type binding is a subtype of java.lang.AutoCloseable.
|
boolean |
isClosedInFinallyOfEnclosing(BlockScope scope) |
boolean |
isResourceBeingReturned(FakedTrackingVariable returnedResource)
If current is the same as 'returnedResource' or a wrapper thereof,
mark as reported and return true, otherwise false.
|
void |
markClose(FlowInfo flowInfo,
FlowContext flowContext)
Mark that this resource is closed locally.
|
void |
markClosedInNestedMethod()
Mark that this resource is closed from a nested method (inside a local class).
|
static FlowInfo |
markPassedToOutside(BlockScope scope,
Expression expression,
FlowInfo flowInfo,
FlowContext flowContext,
boolean owned)
Mark that this resource is passed to some outside code
(as argument to a method/ctor call or as a return value from the current method),
and thus should be considered as potentially closed.
|
int |
mergeCloseStatus(BlockScope currentScope,
int status,
LocalVariableBinding local,
BlockScope outerScope) |
java.lang.String |
nameForReporting(ASTNode location,
ReferenceContext referenceContext) |
static void |
preConnectTrackerAcrossAssignment(ASTNode location,
LocalVariableBinding local,
Expression rhs,
FlowInfo flowInfo)
Before analyzing an assignment of this shape:
singleName = new Allocation()
connect any tracking variable of the LHS with the allocation on the RHS. |
void |
recordErrorLocation(ASTNode location,
int nullStatus) |
int |
reportError(ProblemReporter problemReporter,
ASTNode location,
int nullStatus) |
void |
reportExplicitClosing(ProblemReporter problemReporter) |
boolean |
reportRecordedErrors(Scope scope,
int mergedStatus,
boolean atDeadEnd) |
void |
resolve(BlockScope scope) |
void |
withdraw() |
analyseCode, checkModifiers, getAllAnnotationContexts, getAllAnnotationContexts, getKind, isArgument, isReceiver, isRecoveredFromLoneIdentifier, traversefreshInferenceContext, genericTypeArguments, isSuperAccess, isTypeAccess, printAsExpression, printStatement, setActualReceiverType, setDepth, setFieldIndexanalyseArguments, branchChainTo, breaksOut, checkAgainstNullTypeAnnotation, complainIfUnreachable, completesByContinue, continuesAtOuterLabel, doesNotCompleteNormally, expectedType, findConstructorBinding, generateArguments, getExpressionContext, invocationTargetType, isBoxingCompatible, isEmptyBlock, isKnowDeadCodePattern, isValidJavaStatement, print, resolveCaseacceptPotentiallyCompatibleMethods, checkingPotentialCompatibility, checkInvocationArguments, concreteStatement, copySE8AnnotationsToType, isFieldUseDeprecated, isImplicitThis, isMethodUseDeprecated, isQualifiedSuper, isSuper, isThis, isTypeUseDeprecated, isUnqualifiedSuper, printAnnotations, printIndent, printModifiers, receiverIsImplicitThis, resolveAnnotations, resolveAnnotations, resolveAnnotations, resolveDeprecatedAnnotations, resolvePolyExpressionArguments, sourceEnd, sourceStart, toStringclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitacceptPotentiallyCompatibleMethods, checkingPotentialCompatibility, getExpressionContext, invocationTargetType, isQualifiedSuper, receiverIsImplicitThis, sourceEnd, sourceStartpublic static boolean TEST_372319
public LocalVariableBinding originalBinding
public FakedTrackingVariable innerTracker
public FakedTrackingVariable outerTracker
public FakedTrackingVariable(LocalVariableBinding original, ASTNode location, FlowInfo flowInfo, FlowContext flowContext, int nullStatus)
public void generateCode(BlockScope currentScope, CodeStream codeStream)
LocalDeclarationgenerateCode in class LocalDeclarationpublic void resolve(BlockScope scope)
resolve in class LocalDeclarationpublic static FakedTrackingVariable getCloseTrackingVariable(Expression expression, FlowInfo flowInfo, FlowContext flowContext)
expression - FakedTrackingVariable or null.public static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, Expression rhs, FlowInfo flowInfo)
singleName = new Allocation()
connect any tracking variable of the LHS with the allocation on the RHS.
Also the assignment is temporarily stored in the tracking variable in case we need to
report errors because the assignment leaves the old LHS value unclosed.
In this case the assignment should be used as the error location.location - the assignment/local declaration being analyzedlocal - the local variable being assigned torhs - the rhs of the assignment resp. the initialization of the local variable declaration.
Precondition: client has already checked that the resolved type of this expression is either a closeable type or NULL.public static void analyseCloseableAllocation(BlockScope scope, FlowInfo flowInfo, AllocationExpression allocation)
public static void handleResourceAssignment(BlockScope scope, FlowInfo upstreamInfo, FlowInfo flowInfo, FlowContext flowContext, ASTNode location, Expression rhs, LocalVariableBinding local)
scope - scope containing the assignmentupstreamInfo - info without analysis of the rhs, use this to determine the status of a resource being disconnectedflowInfo - info with analysis of the rhs, use this for recording resource status because this will be passed downstreamflowContext - location - where to report warnigs/errors againstrhs - the right hand side of the assignment, this expression is to be analyzed.
The caller has already checked that the rhs is either of a closeable type or null.local - the local variable into which the rhs is being assignedpublic static void cleanUpAfterAssignment(BlockScope currentScope, int lhsBits, Expression expression)
public static boolean isAnyCloseable(TypeBinding typeBinding)
public int findMostSpecificStatus(FlowInfo flowInfo, BlockScope currentScope, BlockScope locationScope)
public int mergeCloseStatus(BlockScope currentScope, int status, LocalVariableBinding local, BlockScope outerScope)
public void markClose(FlowInfo flowInfo, FlowContext flowContext)
public void markClosedInNestedMethod()
public static FlowInfo markPassedToOutside(BlockScope scope, Expression expression, FlowInfo flowInfo, FlowContext flowContext, boolean owned)
owned - should the resource be considered owned by some outside?public boolean hasDefinitelyNoResource(FlowInfo flowInfo)
public boolean isClosedInFinallyOfEnclosing(BlockScope scope)
public boolean isResourceBeingReturned(FakedTrackingVariable returnedResource)
public void withdraw()
public void recordErrorLocation(ASTNode location, int nullStatus)
public boolean reportRecordedErrors(Scope scope, int mergedStatus, boolean atDeadEnd)
public int reportError(ProblemReporter problemReporter, ASTNode location, int nullStatus)
public void reportExplicitClosing(ProblemReporter problemReporter)
public java.lang.String nameForReporting(ASTNode location, ReferenceContext referenceContext)