【问题标题】:Finding encoding issues in Java Project/Source在 Java 项目/源代码中查找编码问题
【发布时间】:2011-09-27 06:13:31
【问题描述】:

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

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

当这样的代码:

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

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

Sonar/Findbugs/PMD 有没有可能找到这类问题...

请指教! 谢谢。

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

【问题讨论】:

    标签: encoding findbugs checkstyle sonarqube pmd


    【解决方案1】:

    我同意 @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有更多细节。)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这里的概念与 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-05-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-09
          • 2010-12-19
          相关资源
          最近更新 更多