arrow-up icon
Image

修正もれ確認

プロジェクト内に存在する重複コードに注目し、コードに修正が加えられた際に、そのコードの類似コードに同様の修正が行われたか確認します。修正に漏れがあれば通知します。

deco-blob-1 decoration
graphical divider
コピー元
if (horz_.IsArgInput()) {  auto &horz_view = horz_.get();
  assert(horz_view.is_contiguous());
  assert(horz_view.shape.num_elements() == nsamples);
  horz_gpu_.Resize({nsamples});
コピー先
if (vert_.IsArgInput()) {  auto &vert_view = horz_.get();
  assert(vert_view.is_contiguous());
  assert(vert_view.shape.num_elements() == nsamples);
  vert_gpu_.Resize({nsamples});

修正もれ指摘とは?

重複コードを多く含むソースコードは、変更や拡張に弱いとされています。例えば、ある重複コードを変更した場合、対象のコードだけではなくそのコードに類似する重複コードを漏れなく全て検索し、それら全てのコードに対して同じ修正が必要か否か判断しなければなりません。ソフトウェアの規模が大きくなるに従い、この作業の難易度は指数関数的に増加し、どうしても修正もれが発生してしまいます。

Siderscan は、コードへの変更が入った場合、そのコードに類似するコードにも同様の変更が入ったか全て確認します。もし類似コードへの修正が認められない場合は、「修正もれ」として検出します。

修正もれ指摘の例

下記は実際に著名なオープンソースソフトウェアで検出された修正もれの例です。左側のコードにおいて、request をcontext に変更したにもかかわらず、同じ重複コードグループに含まれる右側の類似コードでは同様の編集がなされていません。つまり、何らかの理由で修正が漏れてしまったと考えられます。

Siderscan は、このような修正もれを検出した場合に、指定されたユーザーにレポートをメールで通知します。


    KeyedFilter until;

    int numberOfKeys = -1;
    List<KeyedFilter> queries = new ArrayList<>(ctx.joinTerm().size());

    for (JoinTermContext joinTermCtx : ctx.joinTerm()) {
 -    KeyedFilter joinTerm = visitJoinTerm(joinTermCtx, parentJoinKeys);
 +    KeyedFilter joinTerm = visitJoinTerm(joinTermCtx, parentJoinKeys , fieldTimestamp(), fieldTiebreaker());
        int keySize = joinTerm.keys().size();
        if (numberOfKeys < 0) {
            numberOfKeys = keySize;
        } else {
            if (numberOfKeys != keySize) {
                Source src = source(joinTermCtx.by != null ? joinTermCtx.by : joinTermCtx);
                int expected = numberOfKeys - parentJoinKeys.size();
                int found = keySize - parentJoinKeys.size();
                throw new ParsingException(
                    src,
                    "Inconsistent number of join keys specified; expected [{}] but found [{}]",
                    expected,
                    found

    KeyedFilter until;
    int numberOfKeys = -1;
    List queries = new ArrayList<>(ctx.sequenceTerm().size());

    // TODO: unify this with the code from Join if the grammar gets aligned
    for (SequenceTermContext sequenceTermCtx : ctx.sequenceTerm()) {
      KeyedFilter sequenceTerm = visitSequenceTerm(sequenceTermCtx, parentJoinKeys);
        int keySize = sequenceTerm.keys().size();
        if (numberOfKeys < 0) {
            numberOfKeys = keySize;
        } else {
            if (numberOfKeys != keySize) {
                Source src = source(sequenceTermCtx.by != null ? sequenceTermCtx.by : sequenceTermCtx);
                int expected = numberOfKeys - parentJoinKeys.size();
                int found = keySize - parentJoinKeys.size();
                throw new ParsingException(
                    src,
                    "Inconsistent number of join keys specified; expected [{}] but found [{}]",
                    expected,
                    found
                  

※2022.11.30にSiderscanが解析したElasticsearch (https://github.com/elastic/elasticsearch) のソースコード

詳細検討用ビューワ

Siderscan の修正もれ検知機能は、日々改善されていますが発展途上であり、誤検知も含まれます。また真の修正もれだったとしても、修正もれが必ずしもバグと結びつくとは限りません。プロジェクトによっては、類似コード間であえて異なる記述スタイルをとっていることもあるでしょう。

そこでSiderscanでは、報告された各修正もれの詳細検討のためのコードビューワが提供されています。メールで送信される解析レポートについているリンクをクリックすることで、標準的なブラウザで修正もれの詳細が閲覧できます。Sinderscanのコードビューワでは、重複コードを1対づつ横並びで表示し、修正もれ箇所を強調表示します。報告された修正もれ指摘に、対処すべきかどうか判断する際にご利用下さい。

修正もれ指摘の管理

前述の通り、Siderscan が指摘する修正もれの全てがすぐに対処すべきものであるとは限りません。詳しく検討した結果、「偽陽性のため無視する」、「怪しいが一旦保留する」、「最優先で対処する」など、指摘の重要度やプロジェクトの状況に応じて様々な対応が取られることでしょう。

Siderscan では、指摘の一つ一つを分類し、チームメンバーで共有するための管理機能を提供しています。

siderscan-bottle decoration

無料で重複コード管理を始める

1プロジェクトは無料で解析できます