*
*/
private void checkForComparingClasses() {
if (stack.getStackDepth() >= 2) {
Item left = stack.getStackItem(1);
XMethod leftM = left.getReturnValueOf();
Item right = stack.getStackItem(0);
XMethod rightM = right.getReturnValueOf();
if (left.getSignature().equals("Ljava/lang/Class;") && right.getSignature().equals("Ljava/lang/Class;")) {
boolean leftMatch = leftM != null && leftM.getName().equals("getClass");
boolean rightMatch = rightM != null && rightM.getName().equals("getClass");
if (leftMatch && rightMatch) {
sawGoodEqualsClass = true;
} else {
if (getClassName().equals(left.getConstant()) && rightMatch || leftMatch
&& getClassName().equals(right.getConstant())) {
if (getThisClass().isFinal()) {
sawGoodEqualsClass = true;
} else {
sawBadEqualsClass = true;
if (AnalysisContext.currentAnalysisContext().isApplicationClass(getThisClass())) {
int priority = Priorities.NORMAL_PRIORITY;
BugInstance bug = new BugInstance(this, "EQ_GETCLASS_AND_CLASS_CONSTANT", priority)
.addClassAndMethod(this);
try {
Subtypes2 subtypes2 = AnalysisContext.currentAnalysisContext().getSubtypes2();
Set<ClassDescriptor> subtypes = subtypes2.getDirectSubtypes(getClassDescriptor());
for (ClassDescriptor c : subtypes) {
try {
Global.getAnalysisCache().getClassAnalysis(XClass.class, c);
} catch (CheckedAnalysisException e) {
continue;
}
XMethod m = Hierarchy2.findMethod(c, "equals", "(Ljava/lang/Object;)Z", false);
if (m == null) {
bug.addClass(c).describe(ClassAnnotation.SUBCLASS_ROLE);
priority--;
bug.setPriority(priority);
}