package org.checkerframework.checker.nullness; import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; import org.checkerframework.checker.initialization.InitializationChecker; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.common.basetype.BaseTypeChecker; import org.checkerframework.common.basetype.BaseTypeVisitor; import org.checkerframework.framework.source.SupportedLintOptions; /** * An implementation of the nullness type-system, parameterized by an initialization type-system for * safe initialization. It can use freedom-before-commitment or rawness as its initialization type * system. */ @SupportedLintOptions({ AbstractNullnessChecker.LINT_NOINITFORMONOTONICNONNULL, AbstractNullnessChecker.LINT_REDUNDANTNULLCOMPARISON, // Temporary option to forbid non-null array component types, // which is allowed by default. // Forbidding is sound and will eventually be the default. // Allowing is unsound, as described in Section 3.3.4, "Nullness and arrays": // https://checkerframework.org/manual/#nullness-arrays // It is the default temporarily, until we improve the analysis to reduce false positives or we // learn what advice to give programmers about avoid false positive warnings. // See issue #986: https://github.com/typetools/checker-framework/issues/986 "forbidnonnullarraycomponents" }) public abstract class AbstractNullnessChecker extends InitializationChecker { /** Should we be strict about initialization of {@link MonotonicNonNull} variables. */ public static final String LINT_NOINITFORMONOTONICNONNULL = "noInitForMonotonicNonNull"; /** Default for {@link #LINT_NOINITFORMONOTONICNONNULL}. */ public static final boolean LINT_DEFAULT_NOINITFORMONOTONICNONNULL = false; /** * Warn about redundant comparisons of expressions with {@code null}, if the expressions is * known to be non-null. */ public static final String LINT_REDUNDANTNULLCOMPARISON = "redundantNullComparison"; /** Default for {@link #LINT_REDUNDANTNULLCOMPARISON}. */ public static final boolean LINT_DEFAULT_REDUNDANTNULLCOMPARISON = false; public AbstractNullnessChecker(boolean useFbc) { super(useFbc); } /* @Override public void initChecker() { super.initChecker(); } */ @Override protected LinkedHashSet<Class<? extends BaseTypeChecker>> getImmediateSubcheckerClasses() { LinkedHashSet<Class<? extends BaseTypeChecker>> checkers = super.getImmediateSubcheckerClasses(); checkers.add(KeyForSubchecker.class); return checkers; } @Override public Collection<String> getSuppressWarningsKeys() { Collection<String> result = new HashSet<>(super.getSuppressWarningsKeys()); result.add("nullness"); return result; } @Override protected BaseTypeVisitor<?> createSourceVisitor() { return new NullnessVisitor(this, useFbc); } }