重複コード(またはコードクローン) とは何ですか?

重複コード(英: Duplicate Code) は、コードクローン(英: Code Clone)とも呼ばれ、ソースコード中に存在する、互いに一致または類似したコード片の対のことを指します。コードクローンは、様々な理由で既存のコードを「コピペ」した際に生成されます。

全ての重複コードが問題というわけはありませんが、一般的に重複コードの量が多いソフトウェアは変更や拡張に弱くなります。あるバグを修正するために、そのバグの発現したコードを修正するだけでは不十分なケースが増え、当該コードをコピー元とする重複コードを全て検索し、コピー先にも同じ修正が必要かどうか判断する必要があります。ソフトウェアの規模が大きくなるに従い、この作業の難易度は増していきます。

修正漏れバグとは何ですか?

オリジナルのコードを何らかの理由で「コピペ」した際に、コピペ先で必要な修正を忘れてしまうことがあります。他に、重複したコードの一つを編集する場合、他の重複コードをすべて検索し、同じように編集する必要がありますが、その際に、一部のコードで修正が漏れてしまうことがあります。以上のような重複コードに起因する修正の見落としを、「修正漏れバグ」と呼んでいます。

入力されたソースコードはどう取り扱われていますか?

Siderscan は、ユーザーの管理するサーバー上で動作します。入力されたソースコードは、ユーザーの管理するサーバーのCPU、メモリー、等のリソースを用い、サーバー内部で解析処理されます。入力されたソースコードがネットワークを通じて外部サーバーへ送信されることは一切ありません。

外部サーバーとの通信は無いのでしょうか?

Siderscan はソフトウェアの性能向上を目的として、ソフトウェア利用状況のデータを収集します。具体的には、以下の情報を収集します。なお、Professional 版には、以下の情報のSiderへの送信を無効にするオプションがあります。

  • Siderscan が解析を開始した際に、利用しているユーザーのE-mail アドレス、送信元IPアドレス、および解析開始日時を取得します。
  • Siderscan が解析を終了した際に、利用しているユーザーのE-mail アドレス、送信元IPアドレス、解析終了時刻、および検出された指摘の数を取得します。
  • 解析結果を詳細ビューワー(指摘レポートに添付されたURLから開く、ブラウザで閲覧するソースコードビューワー) で閲覧した際に、閲覧時間、プログラミング言語、指摘ごとの閲覧の優先度スコア、優先度スコア計算のための構成要素の値、解析番号、重複コードの類似度、重複コードのステートメント数、および重複コードの複雑度を取得します。
  • ソフトウェアの不具合などで、解析が正常に終わらなかった際に、エラーメッセージを取得します。

なお、いずれの場合であっても、Siderがお客様のソースコードの全部または一部を取得することはありませんのでご安心下さい。

解析できるプログラミング言語は何でしょうか?

現在は、Java/JavaScript/TypeScript/PHP/C/C++/C#/Swift/Ruby/CUDA に対応しております。入力されたディレクトリにある、拡張子が c, h, cc, cpp, cxx, cs, hpp, cu, cuh, php, swift, js, jsx, ts, tsx, vue, php, java, rb 以外のファイルは分析の対象になりません。

また、FPGA記述言語(拡張子: vhd, vhdl, v, sv) Objective-C に関しては、専用の解析器はないのですが、C/C++コードみなして解析処理を行っています。他に対応を希望する言語がございましたら、是非お知らせ下さい。

クローンの重要度はどのように算出していますか?

Siderscan 内でのクローンの重要度の計算方法は、我々が独自に行ったオープンソースプロジェクトの解析結果や、ユーザーインタビュー等に基づき導出されたヒューリスティックな値であり、絶対ではありません。また、より有用な指摘ができるよう現在も開発中の指標であり、今後のSiderscan の解析機の進化により定義や値が変更される可能性があります。

現在のバージョンで、重要度の計算に加味している要素は以下の通りです。

  • クローンの行数: クローンとみなされたコードブロックの行数です
  • クローンの類似度: 変数や関数の名称が違うなど、ロジックとしては同じでも文字列が異なる箇所がどのぐらいあるかを示します
  • 同一ファイル係数: 異なるファイルの場合、より重要度が上がるよう係数をかけています
  • クローン部分のロジックの複雑さ: 制御構造を分析し、複雑なロジックに関しては重要度が上がるよう係数をかけています

要確認コードの「優先度」はどのように算出していますか?

Siderscan では、検出されたクローンのペア間におけるコードの一貫性の欠如を検出し、これを「要確認コード」として提示します。要確認コードとは、変更漏れのバグの可能性がある、あるいはバグではないが可読性の観点から修正したほうがよいと思われるコードになります。
我々のパターン分析アルゴリズムの性質上、特に問題の無いコードも要確認コードとして検出されてしまうことがあります。いわゆるFalse-Positive (偽陽性)問題です。そこで、要確認コードを様々な観点から一つ一つ評価し、総合的に確認の「優先度」を算出しています。現在、優先度の算出に使用している基準の一例は以下のとおりです。

  • 指摘された単語(変数、関数名、定数、引数など)のクローン内での出現頻度
  • 同一クローン内での指摘の数
  • 一致した単語と一致していない単語の比率
  • 一致した単語と一致していない単語のクローン内でのスコープ

今後、算出アルゴリズムの追加・修正により、優先度が入れ替わる可能性があります。また、ユーザーから得られたフィードバックは、主にこの優先度算出アルゴリズムの改善に利用させていただきます。

解析結果を共有する方法はありませんか?

SiderscanをCIツールに設定する際に、解析の結果をアーティファクトとしてCIツールや共有フォルダに保存するように設定ください。各CIツールのQuick Start Guide の通り設定いただければ、すでにそのようになっています。要確認コードや、重要な重複コードが検出された場合、結果がメールで送信されますが、そのメールを転送したり、そのメールに記載のあるURL をチームメンバーに伝えることで情報の共有が可能です。

解析時間はどれくらいですか?

解析時間は、解析ディレクトリのサイズや、重複コードの検知数によって異なります。目安として、2000ファイル程度のリポジトリで30分程度かかります。

サポートはありますか?

有償版のユーザーにのみ、E-mail で技術サポートをさせていただきます。