cat /dev/zero | ssh username@remotehost "cat > /dev/null"
That caused 100% CPU loading on the Raspberry Pi. Throughput is about 6MB per second.
cat /dev/zero | ssh username@remotehost "cat > /dev/null"
String s = "" + bd;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.List;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBodyDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter;
import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator;
import net.sourceforge.pmd.lang.java.ast.ASTType;
import net.sourceforge.pmd.lang.java.ast.ASTLiteral;
import net.sourceforge.pmd.lang.java.ast.ASTName;
import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId;
import net.sourceforge.pmd.lang.java.ast.ASTAdditiveExpression;
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
import net.sourceforge.pmd.lang.java.symboltable.NameOccurrence;
import net.sourceforge.pmd.util.CollectionUtil;
/**
*
*/
public class ScanBigDecimal extends AbstractJavaRule {
/**
* These are the BigDecimal methods
*/
private static final Set<String> BIG_DECIMAL_METHODS = CollectionUtil.asSet(new String[] { ".toString" });
/**
* These are the classes that the rule can apply to
*/
private static final Map<String, Set<String>> MAP_CLASSES = new HashMap<String, Set<String>>();
static {
MAP_CLASSES.put("java.math.BigDecimal", BIG_DECIMAL_METHODS);
MAP_CLASSES.put("BigDecimal", BIG_DECIMAL_METHODS);
}
@Override
public Object visit(ASTLocalVariableDeclaration node, Object data) {
ASTVariableDeclaratorId var = getDeclaration(node);
if (var == null) {
return super.visit(node, data);
}
String variableName = var.getImage();
for (NameOccurrence no: var.getUsages()) {
// FIXME - getUsages will return everything with the same name as the variable,
// see JUnit test, case 6. Changing to Node below, revisit when getUsages is fixed
Node sn = no.getLocation();
Node primaryExpression = sn.jjtGetParent().jjtGetParent();
Class<? extends Node> parentClass = primaryExpression.jjtGetParent().getClass();
// see if we are calling the methods we are interested in
String methodCall = sn.getImage().substring(variableName.length());
ASTType nodeType = node.getTypeNode();
if (nodeType != null && MAP_CLASSES.get(nodeType.getTypeImage()).contains(methodCall)) {
addViolation(data, sn);
}
}
return super.visit(node, data);
}
@Override
public Object visit(ASTAdditiveExpression node, Object data) {
boolean hasLiteral = true;
boolean hasClass = false;
if (node == null) {
return super.visit(node, data);
}
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
Node child = node.jjtGetChild(i);
if (child.hasDescendantOfType(ASTLiteral.class)) {
hasLiteral = true;
} else {
ASTName nameNode = (ASTName)child.getFirstDescendantOfType(ASTName.class);
if (nameNode != null && findDeclaration(node, nameNode.getImage()) != null) {
hasClass = true;
}
}
if (hasLiteral && hasClass) {
addViolation(data, node);
break;
}
}
return super.visit(node, data);
}
/**
* This method checks the variable declaration if it is on a class we care
* about. If it is, it returns the DeclaratorId
*
* @param node
* The ASTLocalVariableDeclaration which is a problem
* @return ASTVariableDeclaratorId
*/
private ASTVariableDeclaratorId getDeclaration(ASTLocalVariableDeclaration node) {
ASTType type = node.getTypeNode();
if (MAP_CLASSES.keySet().contains(type.getTypeImage())) {
return node.getFirstDescendantOfType(ASTVariableDeclaratorId.class);
}
return null;
}
private ASTVariableDeclaratorId findDeclaration(Node node, String varName) {
if (node == null || varName == null) {
return null;
}
Node parent = node.getFirstParentOfType(ASTClassOrInterfaceBodyDeclaration.class);
if (parent != null) {
List<ASTVariableDeclaratorId> list = parent.findDescendantsOfType(ASTVariableDeclaratorId.class);
for (ASTVariableDeclaratorId declarator : list) {
if (varName.equals(declarator.getImage())) {
ASTType nodeType = null;
if (declarator.jjtGetParent() instanceof ASTFormalParameter) {
nodeType = ((ASTFormalParameter)(declarator.jjtGetParent())).getTypeNode();
} else if (declarator.jjtGetParent() instanceof ASTLocalVariableDeclaration) {
nodeType = ((ASTLocalVariableDeclaration)(declarator.jjtGetParent())).getTypeNode();
} else if (declarator.jjtGetParent() instanceof ASTVariableDeclarator) {
nodeType = ((ASTLocalVariableDeclaration)(declarator.jjtGetParent().jjtGetParent())).getTypeNode();
} else {
System.err.println("Unknown type");
}
if (nodeType != null && MAP_CLASSES.keySet().contains(nodeType.getTypeImage())) {
return declarator;
}
}
}
}
return null;
}
}
<?xml version="1.0"?>
<ruleset name="My custom rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"
xsi:noNamespaceSchemaLocation="http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<rule name="ScanBigDecimal"
message="Avoid using BigDecimal.toString or implicit casting to string"
class="ScanBigDecimal">
<description>
Avoid using BigDecimal.toString or implicit casting to string
</description>
<priority>3</priority>
<example>
<![CDATA[
}
]]>
</example>
</rule>
</ruleset>
java -cp "C:/Users/clarence/Documents/MyApps/pmd-bin-5.0.0/lib/*";. net.sourceforge.pmd.PMD C:/Users/clarence/Documents/MyTest/pmd/MyTestCase.java text bigdecimal.xml
import java.math.BigDecimal;
public class MyTestCase {
public static void main(String args) {
BigDecimal bd = new BigDecimal("12.345");
// will trigger error
System.out.println("This is the number: " + bd);
// this type can't be detected...
System.out.println(bd);
// will trigger error;
String s = "" + bd;
String s2 = "" + bd.toString();
String s3 = bd + "";
String s4 = bd + MyTestCase.returnStr();
// can't be detected
String s5 = "" + returnBigDecimal("12.34");
System.err.println(returnString(bd));
// this wont trigger warning
String s6 = "" + bd.toPlainString();
String s7 = "" + "a" + "b";
}
private static String returnStr() {
return "hello";
}
private static String returnString(BigDecimal bd) {
return "" + bd;
}
private static BigDecimal returnBigDecimal(String num) {
return new BigDecimal(num);
}
}