@Override public String getSignature() { if (_signature == null) { _signature = super.getSignature(); } return _signature; }
@Override public String getSignature() { if (_signature == null) { _signature = super.getSignature(); } return _signature; }
@Override public String getSignature() { if (_signature == null) { _signature = super.getSignature(); } return _signature; }
@Override public final String toString() { return _handleType + " " + _method.getFullName() + ":" + _method.getSignature(); } }
@Override public final String toString() { return _handleType + " " + _method.getFullName() + ":" + _method.getSignature(); } }
@Override public final String toString() { return _handleType + " " + _method.getFullName() + ":" + _method.getSignature(); } }
private static boolean isFinalizer(MethodReference mr) { return mr.getName().equals("finalize") && mr.getSignature().equals("()V"); }
public static boolean isEqualsMethod(MethodReference mr) { return mr.getName().equals("equals") && mr.getSignature().equals("(Ljava/lang/Object;)Z"); }
public static boolean isHashCodeMethod(MethodReference mr) { return mr.getName().equals("hashCode") && mr.getSignature().equals("()I"); }
private static boolean isAppendOutput(Expression expr) { if (expr.getCode() == AstCode.InitObject) { MethodReference ctor = (MethodReference) expr.getOperand(); if (ctor.getDeclaringType().getInternalName().equals("java/io/FileOutputStream") && (ctor.getSignature().equals("(Ljava/io/File;Z)V") || ctor.getSignature().equals( "(Ljava/lang/String;Z)V"))) { Object constant = Nodes.getConstant(expr.getArguments().get(1)); if (constant instanceof Integer && ((Integer) constant).intValue() == 1) { return true; } } } return false; } }
private static boolean isBufferedStream(Expression expr) { if (expr.getCode() == AstCode.InitObject) { MethodReference ctor = (MethodReference) expr.getOperand(); if (ctor.getDeclaringType().getInternalName().equals("java/io/BufferedOutputStream") && ctor.getSignature().equals("(Ljava/io/OutputStream;)V")) { return true; } } return false; }
@AstVisitor(nodes=AstNodes.EXPRESSIONS) public void visit(Expression expr, NodeChain nc, MethodContext mc) { if(expr.getCode() == AstCode.InvokeVirtual) { MethodReference mr = (MethodReference) expr.getOperand(); if(mr.getDeclaringType().getInternalName().startsWith("javax/swing/") && (mr.getName().equals("show") && mr.getSignature().equals("()V") || mr.getName().equals("pack") && mr.getSignature().equals("()V") || mr.getName().equals("setVisible") && mr.getSignature().equals("(Z)V"))) { if(nc.getLambdaMethod() != null) { return; } mc.report("SwingMethodNotInSwingThread", 0, expr); } } } }
private boolean isStringValueOf(Expression expr) { if (expr.getCode() != AstCode.InvokeStatic) return false; MethodReference mr = (MethodReference) expr.getOperand(); return mr.getName().equals("valueOf") && mr.getSignature().equals("(Ljava/lang/Object;)Ljava/lang/String;") && mr.getDeclaringType().getInternalName().equals("java/lang/String"); }
private boolean isStringBuilderToString(Expression expr) { if (expr.getCode() != AstCode.InvokeVirtual) return false; MethodReference mr = (MethodReference) expr.getOperand(); return mr.getName().equals("toString") && mr.getSignature().equals("()Ljava/lang/String;") && mr.getDeclaringType().getInternalName().startsWith("java/lang/StringBu"); }
private boolean isBoxedToString(Expression expr) { if (expr.getCode() == AstCode.InvokeVirtual) { MethodReference mr = (MethodReference) expr.getOperand(); if (mr.getName().equals("toString") && mr.getSignature().equals("()Ljava/lang/String;")) { TypeReference type = mr.getDeclaringType(); if (Types.isBoxed(type)) { return true; } } } return false; }
private boolean isRandomDouble(Node node) { if (Nodes.isInvoke(node)) { MethodReference mr = (MethodReference) ((Expression) node).getOperand(); if (mr.getSignature().equals("()D") && (Types.isRandomClass(mr.getDeclaringType()) && mr.getName().equals("nextDouble") || mr .getDeclaringType().getInternalName().equals("java/lang/Math") && mr.getName().equals("random"))) { return true; } } return false; } }
private boolean isBoxing(Expression expr) { if (Nodes.isBoxing(expr)) return true; if (expr.getCode() == AstCode.InitObject) { MethodReference ctor = (MethodReference) expr.getOperand(); // like "(I)V" return Types.isBoxed(ctor.getDeclaringType()) && ctor.getSignature().length() == 4; } return false; } }
private void check(Expression expr, MethodContext mc) { if(expr.getCode() == AstCode.Rem) { Expression target = Exprs.getChild(expr, 0); if(target.getCode() == AstCode.InvokeVirtual) { MethodReference mr = (MethodReference) target.getOperand(); if(Methods.isHashCodeMethod(mr)) { mc.report("HashCodeRemainder", 0, target); } else if(Types.isRandomClass(mr.getDeclaringType()) && mr.getName().equals("nextInt") && mr.getSignature().equals("()I")) { mc.report("RandomIntRemainder", 0, target); } } } } }
private Expression findOverloadCall(MethodDefinition md, Block block) { return (Expression)Nodes.find(block, node -> { if (Nodes.isOp(node, md.isConstructor() ? AstCode.InvokeSpecial : md.isStatic() ? AstCode.InvokeStatic : AstCode.InvokeVirtual)) { Expression expr = (Expression) node; MethodReference mr = (MethodReference) expr.getOperand(); if (mr.getDeclaringType().isEquivalentTo(md.getDeclaringType()) && mr.getName().equals(md.getName()) && !mr.getSignature().equals(md.getSignature())) { return true; } } return false; }); } }
@AstVisitor(nodes = AstNodes.EXPRESSIONS) public void visit(Expression expr, MethodContext mc) { if (expr.getCode() != AstCode.InitObject) return; MethodReference ctor = (MethodReference) expr.getOperand(); if (!ctor.getDeclaringType().getInternalName().equals("java/io/ObjectOutputStream") || !ctor.getSignature().equals("(Ljava/io/OutputStream;)V")) return; Expression outStream = Exprs.getChild(expr, 0); while (isBufferedStream(outStream)) outStream = Exprs.getChild(outStream, 0); Expression target = ValuesFlow.findFirst(outStream, AppendObjectOutputStream::isAppendOutput); if (target != null) { mc.report("AppendObjectOutputStream", 0, expr, STREAM_CREATED_AT.create(mc, target), OOS_TYPE.create(ctor .getDeclaringType())); } }