我目前正在开发一个Java项目,我的工作就是关注质量。作为工具,我将Jenkins与Sonar结合使用。这些工具很棒,帮助我快速,持续地跟踪问题。
我无法控制的一个问题是有些人使用其他编码而不是UTF-8。
当这样的代码:
if (someString == "something") {
resultString = "string with encoding problem: �";
}
...得到承诺,Sonar将帮助我找到“String Literal Equality”问题。但正如你在第二行看到的那样,编码有一个问题:“ ”通常应该是“ü”。
是否有可能在Sonar / Findbugs / PMD中找到这些问题......
请指教! 谢谢。
Ps:我当然试图亲自和通过电子邮件向我的合作开发者解释这个问题。我甚至自己改变了他们的项目/工作区编码......但不知怎的,仍然成功地提交了像这样的代码。
答案 0 :(得分:2)
我同意@bmargulies,它是一个有效的UTF-8字符(实际上它是replacement character),但毕竟PMD规则可以提供帮助。以下是带有硬编码不允许字符列表的概念验证规则:
import net.sourceforge.pmd.AbstractJavaRule;
import net.sourceforge.pmd.ast.ASTLiteral;
import org.apache.commons.lang3.StringUtils;
public class EncodingRule extends AbstractJavaRule {
private static final String badChars = "\uFFFD";
public EncodingRule() {
}
@Override
public Object visit(final ASTLiteral node, final Object data) {
if (node.isStringLiteral()) {
final String image = node.getImage();
if (StringUtils.containsAny(image, badChars)) {
addViolationWithMessage(data, node, "Disallowed char in '"
+ image + "'");
}
}
return super.visit(node, data);
}
}
反转条件并使用ASCII字符和本地字符制作allowedChars
白名单可能会有用。 (custom PMD rules in this answer还有一些细节。)
答案 1 :(得分:1)
您可以用Java编写checkstyle和PMD扩展,然后您可以浏览AST并发现内容。问题是,代码已经从某些东西转换为Unicode。该Blot字符是一个特定的Unicode字符,用于替换当前编码中无法映射的字符,因此您可以查找这些字符。如果编码混淆导致一个?或者只是一个错误的角色。让Sonar应用您的自定义规则可能具有挑战性。
答案 2 :(得分:0)
这与palacsint的答案相同,但在XPath中
Black list any string that contains X or Y
//Literal[matches(@Image,"[XY]")]
White list any string that does not match X or Y
//Literal[not(matches(@Image,"[XY]"))]
Black list any string that contains X using the unicode representation
//Literal[matches(@Image,"[\u0058]")]
使用XPath可能比使用Java更简洁。
以下是一些使用XPath使用自定义PMD规则的教程,以防您或其他读取此答案的人不熟悉。