public void killAllLoadsExceptFor(@CheckForNull ValueNumber v) { if (!REDUNDANT_LOAD_ELIMINATION) { return; } AvailableLoad myLoad = getLoad(v); HashSet<AvailableLoad> killMe = new HashSet<>(); for (AvailableLoad availableLoad : getAvailableLoadMap().keySet()) { if (!availableLoad.getField().isFinal() && !availableLoad.equals(myLoad)) { if (RLE_DEBUG) { System.out.println("KILLING load of " + availableLoad + " in " + this); } killMe.add(availableLoad); } } killAvailableLoads(killMe); }
@Override public void visit(Field obj) { XField xField = getXField(); if(!xField.isStatic() && (xField.isPrivate() || xField.isFinal()) && xField.isReferenceType()) { allowedFields.add(xField.getFieldDescriptor()); } }
/** * Kill all loads. This conservatively handles method calls where we don't * really know what fields might be assigned. */ public void killAllLoadsOf(@CheckForNull ValueNumber v) { if (!REDUNDANT_LOAD_ELIMINATION) { return; } FieldSummary fieldSummary = AnalysisContext.currentAnalysisContext().getFieldSummary(); HashSet<AvailableLoad> killMe = new HashSet<>(); for (AvailableLoad availableLoad : getAvailableLoadMap().keySet()) { if (availableLoad.getReference() != v) { continue; } XField field = availableLoad.getField(); if (!field.isFinal() && (!USE_WRITTEN_OUTSIDE_OF_CONSTRUCTOR || fieldSummary.isWrittenOutsideOfConstructor(field))) { if (RLE_DEBUG) { System.out.println("Killing load of " + availableLoad + " in " + this); } killMe.add(availableLoad); } } killAvailableLoads(killMe); }
public boolean checkForInitialization(XField f) { if (!f.isReferenceType() || f.isFinal()) { return false; } NullnessAnnotation annotation = AnalysisContext.currentAnalysisContext().getNullnessAnnotationDatabase() .getResolvedAnnotation(f, false); boolean isNonnull = annotation == NullnessAnnotation.NONNULL; return isNonnull; }
public void killAllLoads(boolean primitiveOnly) { if (!REDUNDANT_LOAD_ELIMINATION) { return; } FieldSummary fieldSummary = AnalysisContext.currentAnalysisContext().getFieldSummary(); HashSet<AvailableLoad> killMe = new HashSet<>(); for (AvailableLoad availableLoad : getAvailableLoadMap().keySet()) { XField field = availableLoad.getField(); if ((!primitiveOnly || !field.isReferenceType()) && (field.isVolatile() || !field.isFinal() && (!USE_WRITTEN_OUTSIDE_OF_CONSTRUCTOR || fieldSummary.isWrittenOutsideOfConstructor(field)))) { if (RLE_DEBUG) { System.out.println("KILLING load of " + availableLoad + " in " + this); } killMe.add(availableLoad); } } killAvailableLoads(killMe); }
public boolean isWrittenOutsideOfConstructor(XField field) { if (field.isFinal()) { return false; } if (writtenOutsideOfConstructor.contains(field)) { return true; } if (!AnalysisContext.currentAnalysisContext().unreadFieldsAvailable()) { return true; } UnreadFieldsData unreadFields = AnalysisContext.currentAnalysisContext().getUnreadFieldsData(); if (unreadFields.isReflexive(field)) { return true; } return false; }
boolean isFinal = f.isFinal(); String className = f.getClassName(); String fieldSig = f.getSignature();
for (XField f : xClass.getXFields()) { if (!f.isStatic()) { if (!f.isFinal() && !f.isSynthetic()) { hasMutableField = true; if (unreadFields.isWrittenOutsideOfInitialization(f)) {
private boolean interesting(XField f) { if (!f.isPublic() && !f.isProtected()) { return false; } if (!f.isStatic() || f.isSynthetic() || f.isVolatile()) { return false; } if (!f.isFinal()) { return true; } boolean isArray = f.getSignature().charAt(0) == '['; if (!(isArray || isCollection(f.getSignature()))) { return false; } return true; }
@Override public void visit(Code obj) { sawInitializeSuper = false; super.visit(obj); fieldSummary.setFieldsWritten(getXMethod(), touched); if (Const.CONSTRUCTOR_NAME.equals(getMethodName()) && sawInitializeSuper) { XClass thisClass = getXClass(); for (XField f : thisClass.getXFields()) { if (!f.isStatic() && !f.isFinal() && !touched.contains(f)) { OpcodeStack.Item item; char firstChar = f.getSignature().charAt(0); if (firstChar == 'L' || firstChar == '[') { item = OpcodeStack.Item.nullItem(f.getSignature()); } else if (firstChar == 'I') { item = new OpcodeStack.Item("I", (Integer) 0); } else if (firstChar == 'J') { item = new OpcodeStack.Item("J", 0L); } else { item = new OpcodeStack.Item(f.getSignature()); } fieldSummary.mergeSummary(f, item); } } } touched.clear(); }
if (xField.isFinal() && mutableCollectionJustCreated) { mutableCollection.add(xField);
bugPattern = "RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN"; priority = Priorities.NORMAL_PRIORITY; } else if (xf != null && xf.isStatic() && xf.isFinal()) { bugPattern = "RC_REF_COMPARISON_BAD_PRACTICE"; if (xf.isPublic() || !methodGen.isPublic()) {
@Override public void visitGETSTATIC(GETSTATIC obj) { Type type = obj.getType(getCPG()); XField xf = XFactory.createXField(obj, cpg); if (xf.isFinal()) { FieldSummary fieldSummary = AnalysisContext.currentAnalysisContext().getFieldSummary(); Item summary = fieldSummary.getSummary(xf); if (summary.isNull()) { pushValue(TypeFrame.getNullType()); return; } String slashedClassName = ClassName.fromFieldSignature(type.getSignature()); if (slashedClassName != null) { String dottedClassName = ClassName.toDottedClassName(slashedClassName); if (DEFAULT_SUSPICIOUS_SET.contains(dottedClassName)) { type = new FinalConstant(dottedClassName, xf); consumeStack(obj); pushValue(type); return; } } } if (STRING_SIGNATURE.equals(type.getSignature())) { handleLoad(obj); } else { super.visitGETSTATIC(obj); } }
if (field.isFinal()) { Item summary = AnalysisContext.currentAnalysisContext().getFieldSummary().getSummary(field); if (summary.isNull()) {
@Override public void visitGETFIELD(GETFIELD obj) { Type type = obj.getType(getCPG()); if (STRING_SIGNATURE.equals(type.getSignature())) { handleLoad(obj); } else { XField xf = XFactory.createXField(obj, cpg); if (xf.isFinal()) { FieldSummary fieldSummary = AnalysisContext.currentAnalysisContext().getFieldSummary(); Item summary = fieldSummary.getSummary(xf); if (summary.isNull()) { consumeStack(obj); pushValue(TypeFrame.getNullType()); return; } String slashedClassName = ClassName.fromFieldSignature(type.getSignature()); if (slashedClassName != null) { String dottedClassName = ClassName.toDottedClassName(slashedClassName); if (DEFAULT_SUSPICIOUS_SET.contains(dottedClassName)) { type = new FinalConstant(dottedClassName, xf); consumeStack(obj); pushValue(type); return; } } } super.visitGETFIELD(obj); } }
if (f.isFinal()) { priority = HIGH_PRIORITY; } else if (unreadFields.isWrittenDuringInitialization(f) || unreadFields.isWrittenOutsideOfInitialization(f)) {
@Override public void visitClassContext(ClassContext classContext) { if(!classContext.getJavaClass().isEnum() || !classContext.getJavaClass().isPublic()) { return; } boolean hasInterestingField = false; for(XField field : classContext.getXClass().getXFields()) { if(!field.isStatic() && !field.isFinal() && !field.isSynthetic()) { if(field.isPublic()) { reporter.reportBug(new BugInstance("ME_MUTABLE_ENUM_FIELD", NORMAL_PRIORITY).addClass(classContext.getJavaClass()) .addField(field)); } else { hasInterestingField = true; } } } if(hasInterestingField) { super.visitClassContext(classContext); } }
Item summary = fieldSummary.getSummary(xfield); if (summary != null) { if (xfield.isFinal() && summary.isNull()) { return TypeFrame.getNullType();
int matches = 0; for (XField f2 : x.getXFields()) { if (!f.equals(f2) && !f2.isStatic() && !f2.isFinal() && !f2.isSynthetic() && f2.getSignature().equals(f.getSignature())) {