Поиск проблем кодирования в Java Project / Source - PullRequest
1 голос
/ 02 июля 2011

В настоящее время я работаю над Java-проектом, в рамках которого я слежу за качеством. В качестве инструментов я использую Jenkins в сочетании с Sonar. Эти инструменты великолепны и помогли мне быстро и непрерывно отслеживать проблемы.

Одна проблема, которую я не контролирую, заключается в том, что некоторые люди принимают другие кодировки, отличные от UTF-8.

Когда код такой:

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

... Слушаюсь, Сонар поможет мне найти проблему "Строковое буквальное равенство". Но, как вы видите во второй строке, существует проблема с кодировкой: « » обычно должно быть « ü ».

Есть ли возможность найти подобные проблемы с Sonar / Findbugs / PMD ...

Пожалуйста, совет! Спасибо.

PS: Конечно, я пытался объяснить проблему своим со-разработчикам лично, а также по электронной почте. Я даже сам изменил кодировку их проекта / рабочего пространства ... Но каким-то образом все-таки удается зафиксировать такой код.

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

Я согласен с @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 .)

1 голос
/ 02 июля 2011

Вы можете написать контрольный стиль и расширения PMD на Java, а также пройтись по AST и обнаружить что-то новое. Проблема в том, что код уже будет преобразован из чего-то в Unicode. Этот блот-символ - это конкретный символ Unicode, используемый для замены символов, которые не могут быть отображены в текущей кодировке, поэтому вы можете их искать. Это не поможет вам, если путаница кодирования приведет к? или просто неверный персонаж. Может быть сложно заставить Sonar применять ваши пользовательские правила.

0 голосов
/ 28 ноября 2011

Это та же концепция, что и в ответе 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.

Вот несколько уроков по использованию пользовательских правил PMD с использованием XPath на тот случай, если вы или кто-то еще, кто читает этот ответ, не знакомы.

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

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

...