Skip to content

Commit

Permalink
factor AbstractDetectorForParameterArray2 out of ManualMessageDetector
Browse files Browse the repository at this point in the history
so that in the next commit the upcoming ManualGetStackTraceDetector for
a SLF4J_GET_STACK_TRACE (issue KengoTODA#70) does not have to copy/paste 3/4 of
the ManualMessageDetector
  • Loading branch information
vorburger committed Jul 24, 2018
1 parent 874e1c3 commit a9380ef
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,31 +1,29 @@
package jp.skypencil.findbugs.slf4j;

import static org.apache.bcel.Const.INVOKEVIRTUAL;

import com.google.common.base.Objects;
import jp.skypencil.findbugs.slf4j.parameter.AbstractDetectorForParameterArray2;
import jp.skypencil.findbugs.slf4j.parameter.ArrayData;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
import edu.umd.cs.findbugs.OpcodeStack.CustomUserValue;
import edu.umd.cs.findbugs.OpcodeStack.Item;
import javax.annotation.Nullable;
import jp.skypencil.findbugs.slf4j.parameter.AbstractDetectorForParameterArray;
import jp.skypencil.findbugs.slf4j.parameter.ArrayData;
import jp.skypencil.findbugs.slf4j.parameter.ArrayDataHandler.Strategy;

@CustomUserValue
public final class ManualMessageDetector extends AbstractDetectorForParameterArray {

@Item.SpecialKind
private final int isMessage = Item.defineSpecialKind("message generated by throwable object");

public ManualMessageDetector(BugReporter bugReporter) {
super(bugReporter);
super(bugReporter, "SLF4J_MANUALLY_PROVIDED_MESSAGE");
}

@Override
protected Strategy createArrayCheckStrategy() {
return new Strategy() {
@Override
public void store(Item storedItem, ArrayData arrayData, int index) {
return (storedItem, arrayData, index) -> {
if (arrayData == null) {
return;
}
Expand All @@ -39,8 +37,7 @@ public void store(Item storedItem, ArrayData arrayData, int index) {
if (index == arrayData.getSize() - 1 && !getThrowableHandler().checkThrowable(storedItem)) {
arrayData.mark(false);
}
}
};
};
}

@Override
Expand All @@ -53,6 +50,20 @@ public void afterOpcode(int seen) {
}
}


@Override
protected int getIsOfInterestKind() {
return isMessage;
}

@Override
protected boolean isReallyOfInterest(Item storedItem, ArrayData arrayData, int index) {
// Let developer logs exception message, only when argument does not have throwable instance
// https://github.com/KengoTODA/findbugs-slf4j/issues/31
return !(index == arrayData.getSize() - 1
&& !getThrowableHandler().checkThrowable(storedItem));
}

private boolean isInvokingGetMessage(int seen) {
return seen == INVOKEVIRTUAL
&& !stack.isTop()
Expand All @@ -73,4 +84,13 @@ protected void onLog(@Nullable String format, @Nullable ArrayData arrayData) {
.addCalledMethod(this);
getBugReporter().reportBug(bugInstance);
}

@Override
protected boolean isWhatWeWantToDetect(int seen) {
return seen == INVOKEVIRTUAL && !stack.isTop()
&& getThrowableHandler().checkThrowable(getStack().getStackItem(0))
&& (Objects.equal("getMessage", getNameConstantOperand())
|| Objects.equal("getLocalizedMessage", getNameConstantOperand()));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package jp.skypencil.findbugs.slf4j.parameter;

import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
import edu.umd.cs.findbugs.OpcodeStack.Item;
import javax.annotation.Nullable;
import jp.skypencil.findbugs.slf4j.parameter.ArrayDataHandler.Strategy;

public abstract class AbstractDetectorForParameterArray2 extends AbstractDetectorForParameterArray {

private final String bugPatternName;

public AbstractDetectorForParameterArray2(BugReporter bugReporter, String bugPatternName) {
super(bugReporter);
this.bugPatternName = bugPatternName;
}

@Override
protected final Strategy createArrayCheckStrategy() {
return (storedItem, arrayData, index) -> {
if (arrayData == null) {
return;
}

if (storedItem.getSpecialKind() == getIsOfInterestKind()) {
arrayData.mark(true);
}

if (!isReallyOfInterest(storedItem, arrayData, index)) {
arrayData.mark(false);
}
};
}

protected boolean isReallyOfInterest(Item storedItem, ArrayData arrayData, int index) {
return true;
}

@Override
public final void afterOpcode(int seen) {
boolean isInvokingGetMessage = isWhatWeWantToDetect(seen);
super.afterOpcode(seen);

if (isInvokingGetMessage && !stack.isTop()) {
stack.getStackItem(0).setSpecialKind(getIsOfInterestKind());
}
}

@Override
protected final void onLog(@Nullable String format, @Nullable ArrayData arrayData) {
if (arrayData == null || !arrayData.isMarked()) {
return;
}
BugInstance bugInstance = new BugInstance(this,
bugPatternName, NORMAL_PRIORITY)
.addSourceLine(this).addClassAndMethod(this)
.addCalledMethod(this);
getBugReporter().reportBug(bugInstance);
}

abstract protected boolean isWhatWeWantToDetect(int seen);

abstract protected int getIsOfInterestKind();

}

0 comments on commit a9380ef

Please sign in to comment.