Findbugs Detectors:使用特定的Cast检查实例化?

时间:2015-01-21 23:46:49

标签: java findbugs

我将一个findbugs探测器放在一起寻找在某些java代码中创建的任何HttpURLConnections。一个大项目有很多,不能再进行未加密的连接,所以我想通过findbugs报告它们。

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

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));
         }
        }
    }

这将找到我的代码,但我该如何检查:

HttpURLConnection connection = (HttpURLConnection)new URL("http://www.google.com").openConnection();

具体而言,将网址创建投放到HttpURLConnection

记录,我可以看到我的堆栈深度为3.我可以检查此init的返回值吗?我不知道怎么做。

修改

我已经得到了它的一部分,但基本上我需要查看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));
         }

    }

}

这会检查URL(&#34; Http://....&#34;)并将URLConnection转换为HttpUrlConnection。我可以检查声明httpurlconnection吗?

0 个答案:

没有答案