Class ByteCodePatternDetector

  • All Implemented Interfaces:
    Detector, Priorities
    Direct Known Subclasses:
    LazyInit

    public abstract class ByteCodePatternDetector
    extends java.lang.Object
    implements Detector
    A base class for bug detectors that are based on a ByteCodePattern. ByteCodePatterns provide an easy way to detect patterns of bytecode instructions, taking into account control flow and uses of fields and values.
    See Also:
    ByteCodePattern
    • Constructor Detail

      • ByteCodePatternDetector

        public ByteCodePatternDetector()
    • Method Detail

      • getBugReporter

        protected abstract BugReporter getBugReporter()
      • visitClassContext

        public void visitClassContext​(ClassContext classContext)
        Description copied from interface: Detector
        Visit the ClassContext for a class which should be analyzed for instances of bug patterns.
        Specified by:
        visitClassContext in interface Detector
        Parameters:
        classContext - the ClassContext
      • report

        public void report()
        Description copied from interface: Detector
        This method is called after all classes to be visited. It should be used by any detectors which accumulate information over all visited classes to generate results.
        Specified by:
        report in interface Detector
      • getPattern

        public abstract ByteCodePattern getPattern()
        Get the ByteCodePattern for this detector.
      • prescreen

        public abstract boolean prescreen​(org.apache.bcel.classfile.Method method,
                                          ClassContext classContext)

        Prescreen a method. It is a valid, but dumb, implementation simply to return true unconditionally. A better implementation is to call ClassContext.getBytecodeSet() to check whether the method actually contains the bytecode instructions that the pattern will look for. The theory is that checking the bytecode set is very fast, while building the MethodGen, CFG, ValueNumberAnalysis, etc. objects required to match ByteCodePatterns is slow, and the bytecode pattern matching algorithm is also not particularly fast.

        As a datapoint, prescreening speeds up the BCPDoubleCheck detector by a factor of 5 with no loss of generality and only a dozen or so extra lines of code.

        Parameters:
        method - the method
        classContext - the ClassContext for the method
        Returns:
        true if the method should be analyzed for instances of the ByteCodePattern