Class FakedTrackingVariable
java.lang.Object
org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode
org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement
org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration
org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration
org.aspectj.org.eclipse.jdt.internal.compiler.ast.FakedTrackingVariable
- All Implemented Interfaces:
InvocationSite
,TypeConstants
,TypeIds
A faked local variable declaration used for keeping track of data flows of a
special variable. Certain events will be recorded by changing the null info
for this variable.
See bug 349326 - [1.7] new warning for missing try-with-resources
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic class
Iterator for a set of FakedTrackingVariable, which dispenses the elements according to the priorities defined by enumFakedTrackingVariable.IteratorForReporting.Stage
.Nested classes/interfaces inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite
InvocationSite.EmptyWithAstNode
Nested classes/interfaces inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants
TypeConstants.BoundCheckStatus, TypeConstants.CloseMethodRecord, TypeConstants.DangerousMethod
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final int
static final int
static final int
static final int
int
static boolean
Fields inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration
binding
Fields inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration
annotations, declarationEnd, declarationSourceEnd, declarationSourceStart, ENUM_CONSTANT, FIELD, hiddenVariableDepth, initialization, INITIALIZER, LOCAL_VARIABLE, modifiers, modifiersSourceStart, name, PARAMETER, RECORD_COMPONENT, type, TYPE_PARAMETER
Fields inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement
COMPLAINED_FAKE_REACHABLE, COMPLAINED_UNREACHABLE, NOT_COMPLAINED
Fields inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode
Bit1, 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, inModule, InsideExpressionStatement, InsideJavadoc, INVOCATION_ARGUMENT_OK, INVOCATION_ARGUMENT_UNCHECKED, INVOCATION_ARGUMENT_WILDCARD, IsAdditionalDeclarator, IsAnnotationDefaultValue, IsAnonymousType, IsAnySubRoutineEscaping, IsArgument, IsCanonicalConstructor, IsCapturedOuterLocal, IsCompoundAssigned, IsDefaultConstructor, IsDiamond, IsElseIfStatement, IsElseStatementUnreachable, IsForeachElementVariable, IsImplicit, IsImplicitThis, IsImplicitUnit, IsLocalDeclarationReachable, IsLocalType, IsMemberType, IsNonNull, IsReachable, IsRecovered, IsReturnedValue, IsSecondaryType, IsSecretYieldValueUsage, IsStrictlyAssigned, IsSubRoutineEscaping, IsSuperType, IsSynchronized, IsSynthetic, IsThenStatementUnreachable, IsTryBlockExiting, IsTypeElided, IsUnionType, IsUsedInPatternGuard, IsUsefulEmptyStatement, IsVarArgs, LabelUsed, NeededScope, NeedFreeReturn, NeedReceiverGenericCast, NO_ARGUMENTS, NO_RECORD_COMPONENTS, NO_TYPE_PATTERNS, NO_VARIABLES, OnDemand, OperatorMASK, OperatorSHIFT, OverridingMethodWithSupercall, ParenthesizedMASK, ParenthesizedSHIFT, ResolveJavadoc, RestrictiveFlagMASK, ReturnTypeIDMASK, ShadowsOuterLocal, sourceEnd, sourceStart, SuperAccess, ThenExit, Unchecked, UndocumentedEmptyBlock, UnnecessaryCast, UnsafeCast, Used
Fields inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants
ANNOTATION, ANNOTATION_PREFIX, ANNOTATION_SUFFIX, ANONYM_PREFIX, ANONYM_SUFFIX, ANONYMOUS_METHOD, APACHE, APACHE_DBUTILS, APACHE_IOUTILS, API, ASSERT_CLASS, ASSERT_FALSE, ASSERT_NOTNULL, ASSERT_NULL, ASSERT_TRUE, ASSERTIONS_CLASS, AUTOMATIC_MODULE_NAME, AUTOWIRED, BEANS, BOOLEAN, BYTE, CAPTURE18, CHANNELS, 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, CharArray_JAVA_LANG_RECORD, CharArray_JAVA_LANG_RECORD_SLASH, 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, CONTAINS, CONTAINS_ALL, CONTAINS_KEY, CONTAINS_VALUE, 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, ESSENTIAL_API, FACTORY, FILTER, FLOAT, FLUENT_RESOURCE_CLASSES, FOR_REMOVAL, FRAMEWORK, GET, GETCLASS, GOOGLE, GUAVA_CLOSEABLES, HASHCODE, IMPLEMENTS, INDEX_OF, INIT, INJECT_PACKAGE, INJECT_TYPE, INT, INTERNAL, INVOKE, IO, IS_INSTANCE, IS_NOTNULL, IS_NULL, IS_TRUE, ITYPEBINDING, JAKARTA, JAKARTA_ANNOTATION_INJECT_INJECT, JAVA, JAVA_BASE, 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_CONSTANT_CLASSDESC, JAVA_LANG_DEPRECATED, JAVA_LANG_DOUBLE, JAVA_LANG_ENUM, JAVA_LANG_ENUM_ENUMDESC, JAVA_LANG_ERROR, JAVA_LANG_EXCEPTION, JAVA_LANG_FLOAT, JAVA_LANG_FUNCTIONAL_INTERFACE, JAVA_LANG_ILLEGALARGUMENTEXCEPTION, JAVA_LANG_INCOMPATIBLECLASSCHANGEERROR, JAVA_LANG_INTEGER, JAVA_LANG_INVOKE_CONSTANTBOOTSTRAP, JAVA_LANG_INVOKE_LAMBDAMETAFACTORY, JAVA_LANG_INVOKE_METHODHANDLE, JAVA_LANG_INVOKE_METHODHANDLE_$_POLYMORPHICSIGNATURE, JAVA_LANG_INVOKE_METHODHANDLE_POLYMORPHICSIGNATURE, JAVA_LANG_INVOKE_METHODHANDLES, JAVA_LANG_INVOKE_SERIALIZEDLAMBDA, JAVA_LANG_INVOKE_STRING_CONCAT_FACTORY, JAVA_LANG_INVOKE_VARHANDLE, JAVA_LANG_ITERABLE, JAVA_LANG_LONG, JAVA_LANG_NOCLASSDEFERROR, JAVA_LANG_NOSUCHFIELDERROR, JAVA_LANG_OBJECT, JAVA_LANG_OVERRIDE, JAVA_LANG_RECORD, JAVA_LANG_REFLECT_CONSTRUCTOR, JAVA_LANG_REFLECT_FIELD, JAVA_LANG_REFLECT_METHOD, JAVA_LANG_RUNTIME_OBJECTMETHODS, JAVA_LANG_RUNTIME_SWITCHBOOTSTRAPS, JAVA_LANG_RUNTIME_TEMPLATERUNTIME, JAVA_LANG_RUNTIMEEXCEPTION, JAVA_LANG_SAFEVARARGS, JAVA_LANG_SHORT, JAVA_LANG_STRING, JAVA_LANG_STRING_TEMPLATE_STR, JAVA_LANG_STRINGBUFFER, JAVA_LANG_STRINGBUILDER, JAVA_LANG_STRINGTEMPLATE, JAVA_LANG_STRINGTEMPLATE_PROCESSOR, JAVA_LANG_SUPPRESSWARNINGS, JAVA_LANG_SYSTEM, JAVA_LANG_THROWABLE, JAVA_LANG_VOID, JAVA_NIO_FILE_FILES, JAVA_UTIL_ARRAYS, JAVA_UTIL_COLLECTION, JAVA_UTIL_ITERATOR, JAVA_UTIL_LIST, JAVA_UTIL_MAP, JAVA_UTIL_OBJECTS, JAVA_UTIL_STREAM, JAVA_UTIL_STREAM__STREAM, JAVA_UTIL_ZIP_WRAPPER_CLOSEABLES, JAVAC, JAVAX, JAVAX_ANNOTATION_INJECT_INJECT, JAVAX_RMI_CORBA_STUB, JDK, JDK_INTERNAL_JAVAC_PREVIEW_FEATURE, JDK_INTERNAL_PREVIEW_FEATURE, JDK_INTERNAL_VALUEBASED, JDT, JUNIT, JUNIT_FRAMEWORK_ASSERT, JUPITER, KEYWORD_EXTENDS, LAMBDA_TYPE, LANG, LANG3, LAST_INDEX_OF, LENGTH, LONG, LOOKUP, MAIN, META_INF_MANIFEST_MF, METHOD_SOURCE, MODULE_INFO_CLASS_NAME, MODULE_INFO_CLASS_NAME_STRING, MODULE_INFO_FILE_NAME, MODULE_INFO_FILE_NAME_STRING, MODULE_INFO_NAME, MODULE_INFO_NAME_STRING, NEXT, NIO, NON_NULL, NOT_NULL, NULL, OBJECT, ONE_UTIL_STREAMEX, 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_JUNIT_JUPITER_API_ASSERTIONS, ORG_JUNIT_METHOD_SOURCE, ORG_SPRING_AUTOWIRED, OTHER_WRAPPER_CLOSEABLES, PACKAGE_INFO_NAME, PARAMS, PERMITS, PROVIDER, READOBJECT, READRESOLVE, RECORD_CLASS, RECORD_RESTRICTED_IDENTIFIER, REFLECT, REMOVE, REMOVE_ALL, REQUIRE_NON_NULL, REQUIRED, RESOURCE_FREE_CLOSEABLE_J_U_STREAMS, RESOURCE_FREE_CLOSEABLE_STREAMEX, RETAIN_ALL, RUNTIME, SEALED, SERIALPERSISTENTFIELDS, SERIALVERSIONUID, SHORT, SINCE, SPRING, STRING_CONCAT_MARKER_1, 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, TOSTRING, TYPE, TYPE_PARAMETER_TARGET, TYPE_USE_TARGET, TYPEBINDING, UPPER_ANNOTATION_TYPE, UPPER_CLASS, UPPER_CONSTRUCTOR, UPPER_FIELD, UPPER_LOCAL_VARIABLE, UPPER_METHOD, UPPER_MODULE, UPPER_PACKAGE, UPPER_PARAMETER, UPPER_RECORD_COMPONENT, UPPER_RUNTIME, UPPER_SOURCE, UTIL, VALIDATE_CLASS, VALUE, VALUEOF, VALUES, VAR, 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, YIELD, ZIP
Fields inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds
BitAnyNullAnnotation, BitAutoCloseable, BitCloseable, BitCollection, BitList, BitMap, BitNonNullAnnotation, BitNonNullByDefaultAnnotation, BitNotOwningAnnotation, BitNullableAnnotation, BitOwningAnnotation, 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_JavaLangRecord, 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_JavaUtilList, T_JavaUtilMap, T_JavaUtilObjects, T_JavaxInjectInject, T_JdkInternalPreviewFeature, T_JunitFrameworkAssert, T_LastWellKnownTypeId, T_long, T_null, T_OrgApacheCommonsLang3Validate, T_OrgApacheCommonsLangValidate, T_OrgEclipseCoreRuntimeAssert, T_OrgJunitAssert, T_OrgJunitJupiterApiAssertions, T_OrgJunitJupiterParamsProviderMethodSource, T_OrgSpringframeworkBeansFactoryAnnotationAutowired, T_short, T_undefined, T_void, UNBOXING
-
Constructor Summary
ConstructorsConstructorDescriptionFakedTrackingVariable
(FieldBinding original, BlockScope scope, ASTNode location, FlowInfo flowInfo, FlowContext flowContext, int nullStatus, boolean useAnnotations) FakedTrackingVariable
(LocalVariableBinding original, ASTNode location, FlowInfo flowInfo, FlowContext flowContext, int nullStatus, boolean useAnnotations) FakedTrackingVariable
(LocalVariableBinding original, BlockScope scope, ASTNode location, FlowInfo flowInfo, FlowContext flowContext, int nullStatus, boolean useAnnotations) -
Method Summary
Modifier and TypeMethodDescriptionstatic FlowInfo
analyseCloseableAcquisition
(BlockScope scope, FlowInfo flowInfo, FlowContext flowContext, MessageSend acquisition) Check if a message send acquires a closeable from its receiver, see: Bug 463320 - [compiler][resource] potential "resource leak" problem disappears when local variable inlinedstatic void
analyseCloseableAllocation
(BlockScope scope, FlowInfo flowInfo, FlowContext flowContext, 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) static void
cleanUpUnassigned
(BlockScope scope, ASTNode location, FlowInfo flowInfo, boolean returnMissingOwning) Unassigned closeables are not visible beyond their enclosing statement, immediately report and remove after each statement.boolean
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 handlingstatic FakedTrackingVariable
getCloseTrackingVariable
(Expression expression, FlowInfo flowInfo, FlowContext flowContext, boolean useAnnotations) If expression resolves to a value of type AutoCloseable answer the variable that tracks closing of that local.protected static int
getNullStatusFromMessageSend
(Expression expression) 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.static void
handleResourceFieldAssignment
(BlockScope scope, FlowInfo flowInfo, FlowContext flowContext, ASTNode location, Expression rhs) When assigning an rhs of an (Auto)Closeable type (or null) to a field, inspect annotations to find out if the assignment assigns ownership to the instance (rather than current method).boolean
hasDefinitelyNoResource
(FlowInfo flowInfo) Answer true if we know for sure that no resource is bound to this variable at the point of 'flowInfo'.boolean
static boolean
isAnyCloseable
(TypeBinding typeBinding) Answer wither the given type binding is a subtype of java.lang.AutoCloseable.static boolean
isCloseableNotWhiteListed
(TypeBinding typeBinding) Answer wither the given type binding is a subtype of java.lang.AutoCloseable.boolean
boolean
boolean
protected boolean
boolean
isResourceBeingReturned
(FakedTrackingVariable returnedResource, boolean useOwningAnnotation) If current is the same as 'returnedResource' or a wrapper thereof, mark as reported and return true, otherwise false.boolean
isShared()
void
markAllConnected
(Consumer<FakedTrackingVariable> operation) void
void
markClose
(FlowInfo flowInfo, FlowContext flowContext) Mark that this resource is closed locally.void
Mark that this resource is closed from a try-with-resource with the tracking variable being effectively final).void
Mark that this resource is closed from a nested method (inside a local class).static void
void
markNullStatus
(FlowInfo flowInfo, FlowContext flowContext, int status) void
markOwnedByOutside
(FlowInfo flowInfo, FlowContext flowContext) 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) nameForReporting
(ASTNode location, ReferenceContext referenceContext) static FakedTrackingVariable
preConnectTrackerAcrossAssignment
(ASTNode location, LocalVariableBinding local, Expression rhs, FlowInfo flowInfo, boolean useAnnotations) 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) int
riskyNullStatusAt
(FlowInfo info) void
withdraw()
Methods inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration
analyseCode, checkModifiers, getAllAnnotationContexts, getAllAnnotationContexts, getKind, isArgument, isReceiver, isRecoveredFromLoneIdentifier, isTypeNameVar, patchType, resolve, traverse
Methods inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration
freshInferenceContext, genericTypeArguments, isSuperAccess, isTypeAccess, isUnnamed, printAsExpression, printStatement, setActualReceiverType, setDepth, setFieldIndex
Methods inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement
analyseArguments, bindingsWhenComplete, bindingsWhenFalse, bindingsWhenTrue, branchChainTo, breaksOut, canCompleteNormally, checkAgainstNullTypeAnnotation, complainIfUnreachable, completesByContinue, containsPatternVariable, continueCompletes, continuesAtOuterLabel, doesNotCompleteNormally, doNotReportUnreachable, expectedType, findConstructorBinding, generateArguments, getExpressionContext, invocationTargetType, isBoxingCompatible, isEmptyBlock, isKnowDeadCodePattern, isValidJavaStatement, print, resolveExpressionType, resolveWithBindings
Methods inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode
acceptPotentiallyCompatibleMethods, checkingPotentialCompatibility, checkInvocationArguments, concreteStatement, copyRecordComponentAnnotations, copySE8AnnotationsToType, getRelevantAnnotations, handleNonNullByDefault, isFieldUseDeprecated, isImplicitThis, isMethodUseDeprecated, isQualifiedSuper, isSuper, isThis, isType, isTypeUseDeprecated, isUnqualifiedSuper, printAnnotations, printIndent, printModifiers, receiverIsImplicitThis, resolveAnnotations, resolveAnnotations, resolveAnnotations, resolveDeprecatedAnnotations, resolvePolyExpressionArguments, resolveStatements, sourceEnd, sourceStart, toString
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite
acceptPotentiallyCompatibleMethods, checkingPotentialCompatibility, getExpressionContext, invocationTargetType, isQualifiedSuper, nameSourceEnd, nameSourceStart, receiverIsImplicitThis, sourceEnd, sourceStart
-
Field Details
-
acquisition
-
TEST_372319
public static boolean TEST_372319 -
NOT_OWNED
public static final int NOT_OWNED- See Also:
-
NOT_OWNED_PER_DEFAULT
public static final int NOT_OWNED_PER_DEFAULT- See Also:
-
OWNED_PER_DEFAULT
public static final int OWNED_PER_DEFAULT- See Also:
-
OWNED
public static final int OWNED- See Also:
-
owningState
public int owningStateOne ofNOT_OWNED
,NOT_OWNED_PER_DEFAULT
,OWNED_PER_DEFAULT
,OWNED
. A value of0
signals unknown state. -
originalBinding
-
originalFieldBinding
-
innerTracker
-
outerTracker
-
-
Constructor Details
-
FakedTrackingVariable
public FakedTrackingVariable(LocalVariableBinding original, ASTNode location, FlowInfo flowInfo, FlowContext flowContext, int nullStatus, boolean useAnnotations) -
FakedTrackingVariable
public FakedTrackingVariable(LocalVariableBinding original, BlockScope scope, ASTNode location, FlowInfo flowInfo, FlowContext flowContext, int nullStatus, boolean useAnnotations) -
FakedTrackingVariable
public FakedTrackingVariable(FieldBinding original, BlockScope scope, ASTNode location, FlowInfo flowInfo, FlowContext flowContext, int nullStatus, boolean useAnnotations)
-
-
Method Details
-
generateCode
Description copied from class:LocalDeclaration
Code generation for a local declaration: i.e. normal assignment to a local variable + unused variable handling- Overrides:
generateCode
in classLocalDeclaration
-
resolve
- Overrides:
resolve
in classLocalDeclaration
-
getCloseTrackingVariable
public static FakedTrackingVariable getCloseTrackingVariable(Expression expression, FlowInfo flowInfo, FlowContext flowContext, boolean useAnnotations) If expression resolves to a value of type AutoCloseable answer the variable that tracks closing of that local. Covers two cases:- value is a local variable reference, create tracking variable it if needed.
- value is an allocation expression, return a preliminary tracking variable if set.
- Returns:
- a new
FakedTrackingVariable
or null.
-
preConnectTrackerAcrossAssignment
public static FakedTrackingVariable preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, Expression rhs, FlowInfo flowInfo, boolean useAnnotations) Before analyzing an assignment of this shape: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.- Parameters:
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.
-
analyseCloseableAllocation
public static void analyseCloseableAllocation(BlockScope scope, FlowInfo flowInfo, FlowContext flowContext, AllocationExpression allocation) Compute/assign a tracking variable for a freshly allocated closeable value, using information from our white lists. See Bug 358903 - Filter practically unimportant resource leak warnings -
analyseCloseableAcquisition
public static FlowInfo analyseCloseableAcquisition(BlockScope scope, FlowInfo flowInfo, FlowContext flowContext, MessageSend acquisition) Check if a message send acquires a closeable from its receiver, see: Bug 463320 - [compiler][resource] potential "resource leak" problem disappears when local variable inlined -
handleResourceAssignment
public 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.- Parameters:
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 downstreamlocation
- 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 assigned
-
riskyNullStatusAt
-
handleResourceFieldAssignment
public static void handleResourceFieldAssignment(BlockScope scope, FlowInfo flowInfo, FlowContext flowContext, ASTNode location, Expression rhs) When assigning an rhs of an (Auto)Closeable type (or null) to a field, inspect annotations to find out if the assignment assigns ownership to the instance (rather than current method).- Parameters:
scope
- scope containing the assignmentflowInfo
- info with analysis of the rhs, use this for recording resource status because this will be passed downstreamlocation
- 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.
-
getNullStatusFromMessageSend
-
cleanUpAfterAssignment
public static void cleanUpAfterAssignment(BlockScope currentScope, int lhsBits, Expression expression) -
cleanUpUnassigned
public static void cleanUpUnassigned(BlockScope scope, ASTNode location, FlowInfo flowInfo, boolean returnMissingOwning) Unassigned closeables are not visible beyond their enclosing statement, immediately report and remove after each statement.- Parameters:
returnMissingOwning
- at a return statement this signalstrue
when the enclosing method lacks an@Owning
annotation.
-
isAnyCloseable
Answer wither the given type binding is a subtype of java.lang.AutoCloseable. -
isCloseableNotWhiteListed
Answer wither the given type binding is a subtype of java.lang.AutoCloseable. -
findMostSpecificStatus
public int findMostSpecificStatus(FlowInfo flowInfo, BlockScope currentScope, BlockScope locationScope) -
mergeCloseStatus
public int mergeCloseStatus(BlockScope currentScope, int status, LocalVariableBinding local, BlockScope outerScope) -
markClose
Mark that this resource is closed locally. -
markNullStatus
-
markOwnedByOutside
-
markAllConnected
-
markClosedInNestedMethod
public void markClosedInNestedMethod()Mark that this resource is closed from a nested method (inside a local class). -
isClosedInNestedMethod
public boolean isClosedInNestedMethod() -
markClosedEffectivelyFinal
public void markClosedEffectivelyFinal()Mark that this resource is closed from a try-with-resource with the tracking variable being effectively final). -
markPassedToOutside
public 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.- Parameters:
owned
- should the resource be considered owned by some outside?
-
markForeachElementVar
-
hasDefinitelyNoResource
Answer true if we know for sure that no resource is bound to this variable at the point of 'flowInfo'. -
isClosedInFinallyOfEnclosing
-
isClosedInFinally
public boolean isClosedInFinally() -
isResourceBeingReturned
public boolean isResourceBeingReturned(FakedTrackingVariable returnedResource, boolean useOwningAnnotation) If current is the same as 'returnedResource' or a wrapper thereof, mark as reported and return true, otherwise false. When using@Owning
annotation, do not mark as reported, to proceed to precise analysis -
withdraw
public void withdraw() -
recordErrorLocation
-
reportRecordedErrors
-
hasRecordedLocations
public boolean hasRecordedLocations() -
reportError
-
reportExplicitClosing
-
nameForReporting
-
isNotOwned
protected boolean isNotOwned() -
closeSeen
public boolean closeSeen()
-