
修正もれ確認
プロジェクト内に存在する重複コードに注目し、コードに修正が加えられた際に、そのコードの類似コードに同様の修正が行われたか確認します。修正に漏れがあれば通知します。
if (horz_.IsArgInput()) { auto &horz_view = horz_.get();
assert(horz_view.is_contiguous());
assert(horz_view.shape.num_elements() == nsamples);
horz_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対づつ横並びで表示し、修正もれ箇所を強調表示します。報告された修正もれ指摘に、対処すべきかどうか判断する際にご利用下さい。