Java Findbugs检测器:使用特定强制转换检查实例化?

Java Findbugs检测器:使用特定强制转换检查实例化?,java,findbugs,Java,Findbugs,我正在组装一个findbugs检测器,以查找在某些java代码中创建的任何HttpURLConnections。一个大的项目有很多,并且不能再执行未加密的连接,所以我想通过findbugs报告它们 我知道我可以使用以下内容检查使用http的新java.net.URL实例化:// import edu.umd.cs.findbugs.bcel.OpcodeStackDetector; import edu.umd.cs.findbugs.BugInstance; import edu.umd.cs

我正在组装一个findbugs检测器,以查找在某些java代码中创建的任何HttpURLConnections。一个大的项目有很多,并且不能再执行未加密的连接,所以我想通过findbugs报告它们

我知道我可以使用以下内容检查使用http的新java.net.URL实例化://

import edu.umd.cs.findbugs.bcel.OpcodeStackDetector;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;


public class UnencryptedHttpDetector extends OpcodeStackDetector {

     private BugReporter bugReporter;

        public UnencryptedHttpDetector(BugReporter bugReporter) {
            this.bugReporter = bugReporter;
        }


    @Override
    /***
     * Look for instantiation of HttpUrlConnection
     */
public void sawOpcode(int seen) {

    if ((seen == INVOKESPECIAL) &&  getClassConstantOperand().equals("java/net/URL") 
            && getNameConstantOperand().equals("<init>")
              ){

         OpcodeStack.Item top = stack.getStackItem(0);
         //Object value = top.getConstant();
         String value = top.getConstant().toString();
         if(value.toLowerCase().startsWith("http://"))
         {
                bugReporter.reportBug(new BugInstance(this, "HTTP_INSECURE_CONNECTION", NORMAL_PRIORITY)
                        .addClassAndMethod(this).addSourceLine(this));
         }
        }
    }
具体来说,URL创建在何处强制转换为HttpURLConnection

记录时,我可以看到堆栈深度为3。我可以检查这个初始化的返回值吗?我不知道怎么做

编辑:

我已经得到了其中的一部分,但基本上我需要查看一个CHECKCAST,并在转换到HttpUrlConnection时抛出一些东西,或者实际检查变量声明

我的新方法如下所示:

@Override
/***
 * Look for instantiation of HttpUrlConnection
 */
public void sawOpcode(int seen) {
    //Check Invoking URL with a http:// url
    if ((seen == INVOKESPECIAL) &&  getClassConstantOperand().equals("java/net/URL") 
            && getNameConstantOperand().equals("<init>")
              ){

         OpcodeStack.Item top = stack.getStackItem(0);
         String value = top.getConstant().toString();
         if(value.toLowerCase().startsWith("http://"))
         {
                bugReporter.reportBug(new BugInstance(this, "HTTP_INSECURE_CONNECTION", NORMAL_PRIORITY)
                        .addClassAndMethod(this).addSourceLine(this));
         }
        }
    //Check Casting URLConnection to HttpURLConnection
    else if(seen == CHECKCAST && getClassConstantOperand().equals("java/net/HttpURLConnection"))
    {
         OpcodeStack.Item top = stack.getStackItem(0);
         if(top.getSignature().equals("java/net/URLConnection"))
         {
               bugReporter.reportBug(new BugInstance(this, "HTTP_INSECURE_CONNECTION", NORMAL_PRIORITY)
               .addClassAndMethod(this).addSourceLine(this));
         }

    }

}

这检查URLHttp://.... 并将URLConnection强制转换为HttpUrlConnection。我可以检查是否声明了httpurlconnection吗?

我看到我得到了一个INVOKEVIRTUAL和一个CHECKCAST,并且仍然在研究如何在堆栈上以正确的顺序检查它们。
@Override
/***
 * Look for instantiation of HttpUrlConnection
 */
public void sawOpcode(int seen) {
    //Check Invoking URL with a http:// url
    if ((seen == INVOKESPECIAL) &&  getClassConstantOperand().equals("java/net/URL") 
            && getNameConstantOperand().equals("<init>")
              ){

         OpcodeStack.Item top = stack.getStackItem(0);
         String value = top.getConstant().toString();
         if(value.toLowerCase().startsWith("http://"))
         {
                bugReporter.reportBug(new BugInstance(this, "HTTP_INSECURE_CONNECTION", NORMAL_PRIORITY)
                        .addClassAndMethod(this).addSourceLine(this));
         }
        }
    //Check Casting URLConnection to HttpURLConnection
    else if(seen == CHECKCAST && getClassConstantOperand().equals("java/net/HttpURLConnection"))
    {
         OpcodeStack.Item top = stack.getStackItem(0);
         if(top.getSignature().equals("java/net/URLConnection"))
         {
               bugReporter.reportBug(new BugInstance(this, "HTTP_INSECURE_CONNECTION", NORMAL_PRIORITY)
               .addClassAndMethod(this).addSourceLine(this));
         }

    }

}