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 Feb 5, 2019
1 parent f637da0 commit f5e4b0f
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 f5e4b0f

Please sign in to comment.