Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * fb-contrib - Auxiliary detectors for Java programs
   * Copyright (C) 2005-2013 Dave Brosius
   * 
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   * 
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  * 
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 package com.mebigfatguy.fbcontrib.detect;
 
 import java.util.Map;
 
 import  org.apache.bcel.classfile.Code;
 import  org.apache.bcel.generic.Type;
 
 
 import  edu.umd.cs.findbugs.BugInstance;
 import  edu.umd.cs.findbugs.BugReporter;
 import  edu.umd.cs.findbugs.BytecodeScanningDetector;
 import  edu.umd.cs.findbugs.OpcodeStack;
 import  edu.umd.cs.findbugs.OpcodeStack.CustomUserValue;
 import  edu.umd.cs.findbugs.ba.ClassContext;

looks for methods that access objects in http sessions, that are complex objects, modifies those objects, but does not call setAttribute to signify a change so that cluster replication can happen.
 
 @CustomUserValue
 public class SuspiciousClusteredSessionSupport extends BytecodeScanningDetector {
 	
 	private static final Pattern modifyingNames = Pattern.compile("(add|insert|put|remove|clear|set).*");
 	
 	private BugReporter bugReporter;
 	private OpcodeStack stack;
 	
 	public SuspiciousClusteredSessionSupport(BugReporter bugReporter) {
 		this. = bugReporter;
 	}
 	
 	public void visitClassContext(ClassContext classContext) {
 		try {
 			 = new OpcodeStack();
 			super.visitClassContext(classContext);
 		} finally {
 			 = null;
 			 = null;
 			 = null;
 		}
 	}
 	
 	public void visitCode(Code obj) {
 		.resetForMethodEntry(this);
 		super.visitCode(obj);
 		for (Integer pc : .values()) {
 			.reportBug(new BugInstance(this"SCSS_SUSPICIOUS_CLUSTERED_SESSION_SUPPORT", NORMAL_PRIORITY)
 					   .addClass(this)
 					   .addMethod(this)
 					   .addSourceLine(thispc.intValue()));
 		}
 	}
 	
 	public void sawOpcode(int seen) {
 		String attributeName = null;
 		boolean sawGetAttribute = false;
 		try {
 	        .precomputation(this);
 	        
 			if (seen == INVOKEINTERFACE) {
 				if ("javax/servlet/http/HttpSession".equals(clsName)) {
 					String methodName = getNameConstantOperand();
 					if ("getAttribute".equals(methodName)) {
 						if (.getStackDepth() > 0) {
 							OpcodeStack.Item item = .getStackItem(0);
							Object con = item.getConstant();
							if (con instanceof String) {
								attributeName = (String)con;
								sawGetAttribute = true;
							}
						}
else if ("setAttribute".equals(methodName)) {
						if (.getStackDepth() > 1) {
							OpcodeStack.Item item = .getStackItem(1);
							Object con = item.getConstant();
							if (con instanceof String) {
								attributeName = (String)con;
								.remove(attributeName);
							}
						}
					}
				}
else if (((seen >= ALOAD_0) && (seen <= ALOAD_3)) || (seen == ALOAD)) {
				int reg = RegisterUtils.getALoadReg(thisseen);
				attributeName = .get(Integer.valueOf(reg));
				sawGetAttribute = attributeName != null;
else if (((seen >= ASTORE_0) && (seen <= ASTORE_3)) || (seen == ASTORE)) {
				if (.getStackDepth() > 0) {
					OpcodeStack.Item item = .getStackItem(0);
					attributeName = (String)item.getUserValue();
					int reg = RegisterUtils.getAStoreReg(thisseen);
					.put(Integer.valueOf(reg), attributeName);
				}
			}
			if ((seen == INVOKEINTERFACE) || (seen == INVOKEVIRTUAL)) {
				String methodName = getNameConstantOperand();
				Matcher m = .matcher(methodName);
				if (m.matches()) {
					String signature = getSigConstantOperand();
					int numArgs = Type.getArgumentTypes(signature).length;
					if (.getStackDepth() > numArgs) {
						OpcodeStack.Item item = .getStackItem(numArgs);
						attributeName = (String)item.getUserValue();
						if (attributeName != null) {
							.put(attributeName, Integer.valueOf(getPC()));
						}
					}
				}
else if ((seen >= IASTORE) && (seen <= SASTORE)) {
				if (.getStackDepth() > 2) {
					OpcodeStack.Item item = .getStackItem(2);
					attributeName = (String)item.getUserValue();
					if (attributeName != null) {
						.put(attributeName, Integer.valueOf(getPC()));
					}
				}
			}
finally {
			TernaryPatcher.pre(seen);
			.sawOpcode(thisseen);
			TernaryPatcher.post(seen);
			if (sawGetAttribute)
			{
				if (.getStackDepth() > 0) {
					OpcodeStack.Item item = .getStackItem(0);
					item.setUserValue(attributeName);
				}
			}
		}
	}
New to GrepCode? Check out our FAQ X