Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * fb-contrib - Auxiliary detectors for Java programs
   * Copyright (C) 2005-2015 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;
 
 
 
looks for code that builds an array by using a StringTokenizer to break up a string and place individual elements into an array. It is simpler to use String.split instead.
 
 public class UseSplit extends BytecodeScanningDetector 
 {
 	enum State {SEEN_NOTHING, SEEN_STRINGTOKENIZER, SEEN_COUNTTOKENS, SEEN_NEWARRAY, SEEN_HASMORE, SEEN_NEXT, SEEN_ARRAYSTORE}
 	
 	
 	private OpcodeStack stack;
 	private Map<IntegerStateregValueType;
 	private State state;
 	private int loopStartloopEnd;
 	
 	public UseSplit(BugReporter bugReporter) {
 		this. = bugReporter;
 	}
 	
 	public void visitClassContext(ClassContext classContext) {
 		try {	
 			JavaClass cls = classContext.getJavaClass();
 			if (cls.getMajor() >= ) {
 				 = new OpcodeStack();
 				super.visitClassContext(classContext);
 			}
 		} finally {
 			 = null;
 			 = null;
 		}
 	}

implements the visitor to reset the stack

Parameters:
obj the context object of the currently parsed code block
 
 	public void visitCode(Code obj) {
 		 = -1;
 		 = -1;
 		super.visitCode(obj);
 	}
 	
 	public void sawOpcode(int seen) {
 		try {
 	        .precomputation(this);
 			
 			int pc = getPC();
 			if (( != -1) && (pc > )) {
 				 = -1;
 				 = -1;
			}
			if ((seen == ) || ((seen >= ) && (seen <= ))) {
				int reg = RegisterUtils.getALoadReg(thisseen);
				State type = .get(Integer.valueOf(reg));
				if (type != null)
					 = type;
				else
				return;
			}
			if ((seen == ) || ((seen >= ) && (seen <= ))) {
				if (.getStackDepth() > 0) {
					int reg = RegisterUtils.getAStoreReg(thisseen);
					.put(Integer.valueOf(reg), (State)item.getUserValue());
				}
				return;
			}			
			if ((seen == ) || ((seen >= ) && (seen <= ))) {
				int reg = RegisterUtils.getLoadReg(thisseen);
				State type = .get(Integer.valueOf(reg));
				if (type != null)
					 = type;
				else
				return;
			}
			if ((seen == ) || ((seen >= ) && (seen <= ))) {
				if (.getStackDepth() > 0) {
					int reg = RegisterUtils.getStoreReg(thisseen);
					.put(Integer.valueOf(reg), (State)item.getUserValue());
				}
				return;
			}
			switch () {
					if (seen == ) {
						if (("java/util/StringTokenizer".equals(getClassConstantOperand()))
						&&  ("(Ljava/lang/String;Ljava/lang/String;)V".equals(getSigConstantOperand())))
					}
				break;
					if (seen == ) {
						String methodName = getNameConstantOperand();
						String signature = getSigConstantOperand();
						if (("countTokens".equals(methodName))
						&&  ("()I".equals(signature)))
						else if ("hasMoreTokens".equals(methodName) || "hasMoreElements".equals(methodName))
						else if ("nextToken".equals(methodName) || "nextElement".equals(methodName)) {
							if ((pc < ) || (pc > ))
							else
						}
					}
				break;
					if (seen == )
					else if (seen == ) {
						int target = getBranchTarget() - 3;//sizeof goto
						byte[] code = getCode().getCode();
						if ((code[target] & 0x000000FF) == ) {
							int offset = (code[target+1] << 1) + code[target+2];
							int gotoTarget = target + offset + 3;
							if (gotoTarget < getPC()) {
								 = gotoTarget;
								 = target;
							}
						}	
					}
				break;
					if (seen == ) {
						int target = getBranchTarget() - 3;//sizeof goto
						byte[] code = getCode().getCode();
						if ((code[target] & 0x000000FF) == ) {
							int offset = (code[target+1] << 1) + code[target+2];
							int gotoTarget = target + offset + 3;
							if (gotoTarget < getPC()) {
								 = gotoTarget;
								 = target;
							}
						}
					}
				break;
				case :
					if (seen == ) {
						if ((pc > ) && (pc < )) {
							if (.getStackDepth() > 2) {
								State arrayType = (State)arrayItem.getUserValue();
								State elemType = (State)elemItem.getUserValue();
								if ((arrayType == .) && (elemType == .)) {
											   .addClass(this)
											   .addMethod(this)
											   .addSourceLine(this));
								}
							}
						}
					}
				break;
				break;
			}
finally {
			TernaryPatcher.pre(seen);
			.sawOpcode(thisseen);
			TernaryPatcher.post(seen);
			if ( != .) {
				if (.getStackDepth() > 0) {
				}
			}
		}
	}
New to GrepCode? Check out our FAQ X