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