1

私は現在Javaプロジェクトに取り組んでおり、品質を監視することが私の仕事の一部です。ツールとして、私はJenkinsをSonarと組み合わせて使用​​します。これらのツールは素晴らしく、問題を迅速かつ継続的に追跡するのに役立ちました。

私が制御できない問題の1つは、UTF-8以外のエンコーディングを使用してコミットする人がいることです。

このようなコードの場合:

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

...コミットすると、Sonarは「文字列リテラルの平等」の問題を見つけるのに役立ちます。しかし、2行目にあるように、エンコーディングに問題があります。「�」は通常「ü」である必要があります。

Sonar / Findbugs/PMDでこの種の問題を見つける可能性はありますか...

ご意見をお聞かせください!ありがとうございました。

追伸:もちろん、私は共同開発者に直接、または電子メールで問題を説明しようとしました。私は彼らのプロジェクト/ワークスペースのエンコーディングを自分で変更しました...しかし、どういうわけか、まだこのようなコードをコミットすることに成功しています。

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);
    }

}

条件を逆にして、allowedCharsASCII文字とローカル文字を使用してホワイトリストを作成すると便利な場合があります。(この回答には、カスタムPMDルールの詳細がいくつかあります。)

于 2011-09-21T06:20:40.603 に答える
1

JavaでcheckstyleおよびPMD拡張機能を記述でき、ASTを歩いて物事を発見することができます。問題は、コードがすでに何かからUnicodeに変換されていることです。そのブロット文字は、現在のエンコーディングでマップできない文字の代わりに使用される特定のUnicode文字なので、それらを探すことができます。エンコーディングの混乱が結果として生じる場合、それはあなたを助けませんか?または単に間違った文字。ソナーにカスタムルールを適用させるのは難しいかもしれません。

于 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 に答える