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;
 import java.util.Set;
 
 
 
looks for issues related to manually specified charsets by using string literals.
 
 public class CharsetIssues extends BytecodeScanningDetector {
 	
 	private static final String CHARSET_SIG = "Ljava/nio/charset/Charset;";
 	
 	private static final Map<StringIntegerREPLACEABLE_ENCODING_METHODS;
 	private static final Map<StringIntegerUNREPLACEABLE_ENCODING_METHODS;
 	public static final Set<StringSTANDARD_JDK7_ENCODINGS;
 	
 	/*
 	 * The stack offset refers to the relative position of the Ljava/lang/String; of interest (i.e. the one
 	 * that is the charset)  For example, a stack offset of 0 means the String charset was the last param, 
 	 * and a stack offset of 2 means it was the 3rd to last.
 	 * 
 	 * Not coincidentally, the argument that needs to be replaced is the [(# of arguments) - offset]th one
 	 */
 	static {
 		Map<StringIntegerreplaceable = new HashMap<StringInteger>(8);
 		replaceable.put("java/io/InputStreamReader.<init>(Ljava/io/InputStream;Ljava/lang/String;)V".);
 		replaceable.put("java/io/OutputStreamWriter.<init>(Ljava/io/OutputStream;Ljava/lang/String;)V".);
 		replaceable.put("java/lang/String.<init>([BLjava/lang/String;)V".);
 		replaceable.put("java/lang/String.<init>([BIILjava/lang/String;)V".);
 		replaceable.put("java/lang/String.getBytes(Ljava/lang/String;)[B".);
 		replaceable.put("java/util/Formatter.<init>(Ljava/io/File;Ljava/lang/String;Ljava/util/Locale;)V".);
 		
 		 = Collections.unmodifiableMap(replaceable);
 		
 		Map<StringIntegerunreplaceable = new HashMap<StringInteger>(32);
 		unreplaceable.put("java/net/URLEncoder.encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;".);
 		unreplaceable.put("java/net/URLDecoder.decode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;".);
 		unreplaceable.put("java/io/ByteArrayOutputStream.toString(Ljava/lang/String;)V".);
 		unreplaceable.put("java/io/PrintStream.<init>(Ljava/lang/String;Ljava/lang/String;)V".);
 		unreplaceable.put("java/io/PrintStream.<init>(Ljava/io/File;Ljava/lang/String;)V".);
 		unreplaceable.put("java/io/PrintStream.<init>(Ljava/io/OutputStream;BLjava/lang/String;)V".);
 		unreplaceable.put("java/io/PrintStream.toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;".);
 		unreplaceable.put("java/io/PrintWriter.<init>(Ljava/lang/String;Ljava/lang/String;)V".);
 		unreplaceable.put("java/io/PrintWriter.<init>(Ljava/io/File;Ljava/lang/String;)V".);
 		unreplaceable.put("java/io/PrintWriter.toCharset(Ljava/lang/String;)Ljava/nio/charset/Charset;".);
 		unreplaceable.put("java/lang/StringCoding.decode(Ljava/lang/String;[BII)[C".);
 		unreplaceable.put("java/lang/StringCoding.encode(Ljava/lang/String;[CII)[B".);
 		unreplaceable.put("java/util/Formatter.<init>(Ljava/io/File;Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/Formatter.<init>(Ljava/io/OutputStream;Ljava/lang/String;Ljava/util/Locale;)V".);
 		unreplaceable.put("java/util/Formatter.<init>(Ljava/io/OutputStream;Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/Formatter.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Locale;)V".);
 		unreplaceable.put("java/util/Formatter.<init>(Ljava/lang/String;Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/Formatter.toCharset(Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/logging/Handler.setEncoding(Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/logging/MemoryHandler.setEncoding(Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/logging/StreamHandler.setEncoding(Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/Scanner.<init>(Ljava/io/File;Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/Scanner.<init>(Ljava/io/InputStream;Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/Scanner.<init>(Ljava/nio/file/Path;Ljava/lang/String;)V".);
 		unreplaceable.put("java/util/Scanner.<init>(Ljava/nio/channels/ReadableByteChannel;Ljava/lang/String;)V".);
 		unreplaceable.put("java/lang/StringCoding.decode(Ljava/lang/String;[BII)[C".);
 		unreplaceable.put("java/lang/StringCoding.encode(Ljava/lang/String;[CII)[B".);
 		unreplaceable.put("javax/servlet/ServletResponse.setCharacterEncoding(Ljava/lang/String;)V".);	
		unreplaceable.put("java/beans/XMLEncoder.<init>(Ljava/io/OutputStream;Ljava/lang/String;ZI)V".);
		unreplaceable.put("java/nio/channels/Channels.newReader(Ljava/nio/channels/ReadableByteChannel;Ljava/lang/String;)Ljava/io/Reader;".);	
		unreplaceable.put("java/nio/channels/Channels.newWriter(Ljava/nio/channels/WritableByteChannel;Ljava/lang/String;)Ljava/io/Writer;".);	
		 = Collections.unmodifiableMap(unreplaceable);
		Set<Stringencodings = new HashSet<String>();
		encodings.add("US-ASCII");
		encodings.add("ISO-8859-1");
		encodings.add("UTF-8");
		encodings.add("UTF-16BE");
		encodings.add("UTF-16LE");
		encodings.add("UTF-16");
		 = Collections.unmodifiableSet(encodings);
	}
	private final BugReporter bugReporter;
	private OpcodeStack stack;
	private int classVersion;

constructs a CSI detector given the reporter to report bugs on

Parameters:
bugReporter the sync of bug reports
	public CharsetIssues(BugReporter bugReporter) {
		this. = bugReporter;
	}
	public void visitClassContext(ClassContext classContext) {
		try {
			 = classContext.getJavaClass().getMajor();
				 = new OpcodeStack();
				super.visitClassContext(classContext);
			}
finally {
			 = null;
		}
	}
	public void visitMethod(Method obj) {
	}
	public void sawOpcode(int seen) {
		try {
			switch (seen) {
					String encoding = null;
					String methodName = getNameConstantOperand();
					String methodSig = getSigConstantOperand();
					String methodInfo = className + '.' + methodName + methodSig;
					Integer stackOffset = .get(methodInfo);
					if (stackOffset != null) {
						int offset = stackOffset.intValue();
						if (.getStackDepth() > offset) {
							encoding = (Stringitem.getConstant();
								// the counts put in the Pair are indexed from the beginning of
								String changedMethodSig = replaceNthArgWithCharsetString(methodSigoffset);
											.addClass(this)
											.addMethod(this)
											.addCalledMethod(classNamemethodNamechangedMethodSigseen == ));
							}
						}
else {
						Integer offsetValue = .get(methodInfo);
						if (offsetValue != null) {
							int offset = offsetValue.intValue();
							if (.getStackDepth() > offset) {
								encoding = (Stringitem.getConstant();
												.addClass(this)
												.addMethod(this)
								}
							}
						}
					}
					if (encoding != null) {
						try {
							Charset.forName(encoding);
catch (IllegalArgumentException e) {  //encompasses both IllegalCharsetNameException and UnsupportedCharsetException
										.addClass(this)
										.addMethod(this)
										.addString(encoding));
						}
					}
				break;
				default:
					break;
			}
finally {
			.sawOpcode(thisseen);
		}
	}
	private static String replaceNthArgWithCharsetString(String sigInteger stackOffset) {
		Type[] arguments = Type.getArgumentTypes(sig);
		StringBuilder sb = new StringBuilder("(");
		int argumentIndexToReplace = (arguments.length - stackOffset) - 1;
		for(int i = 0; i < arguments.length ; i++) {
			if (i == argumentIndexToReplace) {
else {
				sb.append(arguments[i].getSignature());
			}
		}
		sb.append(sig.substring(sig.lastIndexOf(')'), sig.length()));
		return sb.toString();
	}
	@PublicAPI("Used by fb-contrib-eclipse-quickfixes to determine type of fix to apply")
	}
	@PublicAPI("Used by fb-contrib-eclipse-quickfixes to determine type of fix to apply")
        return ;
    }
New to GrepCode? Check out our FAQ X