1

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

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

当这样的代码:

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

... 承诺,Sonar 将帮助我找到“字符串文字平等”问题。但是正如您在第二行中看到的,编码存在问题:“�”通常应该是“ ü ”。

是否有可能通过 Sonar/Findbugs/PMD 找到此类问题...

请指教!谢谢你。

Ps:当然,我已经尝试亲自以及通过电子邮件向我的共同开发人员解释这个问题。我什至自己更改了他们的项目/工作区编码......但不知何故,仍然成功地提交了这样的代码。

4

3 回答 3

2

我同意@bmargulies,它是一个有效的 UTF-8 字符(实际上是替换字符),但毕竟,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);
    }

}

也许反转条件并allowedChars使用 ASCII 字符和本地字符创建白名单会很有用。(此答案中有更多关于自定义 PMD 规则的详细信息。)

于 2011-09-21T06:20:40.603 回答
1

你可以用 Java 编写 checkstyle 和 PMD 扩展,你可以走 AST 并发现东西。问题是,代码已经从某种东西转换为 Unicode。该 Blot 字符是一个特定的 Unicode 字符,用于替换当前编码中无法映射的字符,因此您可以查找这些字符。如果编码混淆导致 ? 或者只是一个不正确的字符。让 Sonar 应用您的自定义规则可能具有挑战性。

于 2011-07-02T11:47:48.820 回答
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

于 2011-11-27T22:17:31.690 回答