在Java Project / Source中查找编码问题

时间:2011-07-02 11:41:59

标签: encoding findbugs checkstyle sonarqube pmd

我目前正在开发一个Java项目,我的工作就是关注质量。作为工具,我将Jenkins与Sonar结合使用。这些工具很棒,帮助我快速,持续地跟踪问题。

我无法控制的一个问题是有些人使用其他编码而不是UTF-8。

当这样的代码:

if (someString == "something") {
    resultString = "string with encoding problem: �";
}

...得到承诺,Sonar将帮助我找到“String Literal Equality”问题。但正如你在第二行看到的那样,编码有一个问题:“ ”通常应该是“ü”。

是否有可能在Sonar / Findbugs / PMD中找到这些问题......

请指教! 谢谢。

Ps:我当然试图亲自和通过电子邮件向我的合作开发者解释这个问题。我甚至自己改变了他们的项目/工作区编码......但不知怎的,仍然成功地提交了像这样的代码。

3 个答案:

答案 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规则的教程,以防您或其他读取此答案的人不熟悉。

http://www.techtraits.ca/custom-pmd-rules-using-xpath/

http://blog.code-cop.org/2010/05/custom-pmd-rules.html