ソフトウェア・シンポジウム2019 in 熊本

組み込みソフトウェアにおけるコードクローン出現に関する考察
若林 奎人

水野 修

京都工芸繊維大学 大学院工芸科学研究科

京都工芸繊維大学 情報工学・人間科学系

博士前期課程 情報工学専攻

o-mizuno@kit.ac.jp

k-wakabayashi@se.is.kit.ac.jp

要旨

1

はじめに

近年組み込みソフトウェアにおいて，個人でハード

ソフトウェアの果たす社会的な役割は大きく，ソフト

ウェア部品を安価に入手できることや部品の多様化に伴ウェアの品質を高く保つことはソフトウェア工学におけい，ソフトウェア中にはコードクローンが発生することる重要な目標である．また，ソフトウェア品質を高く保がある．

つためには，ソフトウェアの保守性を高める必要がある．

組み込み開発プラットフォームの１つである Arduino

しかし，1950 年代にソフトウェアが生まれて以来，ソフは，特にハードウェア部品が安価であり，また，ハード

トウェアの保守性を高めるのは困難な課題の 1 つである．

ウェア，ソフトウェア共にオープンソースであるため，

ソフトウェアの保守性を下げる要因の 1 つにコードク

派生品や互換機も数多く存在し，環境下には多くのコーローンがある．コードクローンは主にソースコードの再

ドクローンが発生していると考えられる．コードクロー

利用によって生まれる，ソースコードの内容が同じ構造

ンはソフトウェアの保守を困難にしている要因の１つでになっているものを指す．そのため，不具合を持つソーあると指摘されている．

スコードのクローンが他のソフトウェアに含まれる場合，

そこで，GitHub から watch 数の多い Arduino のプロ

その不具合全てを発見し，修正することは困難になる．

ジェクトを 170 個取得し，コードクローン検出ツール

特に，組み込みソフトウェアにおいては，個人でのソフである CCFinder に入力することで，コードクローンのトウェア開発者も多いことから，コードクローンが幅広

位置を把握し，他のプロジェクトにおけるコードクロー

く発生していると考えられる．中でも Arduino [1] プロ

ンの数と比較することで Arduino プロジェクトにおけるジェクトはハードウェア，ソフトウェアともにオープン

コードクローンの発生率について考察する．さらに組み

ソースであり，一般に広く再利用されやすい構造である込みソフトウェア特有のコードクローンについて考察すため，組み込みソフトウェアの中でもコードクローンがることで，組み込みソフトウェアにおけるコードクロー

発生しやすいと考えられる．

ンに関する知見を得る．

そこで，コードクローン検出ツールである CCFinder

CCFinder を用いた結果，Arduino プロジェクトには他のプロジェクトよりもコードクローンが多く発生していることがわかった．また，発生率の高いコードクローンの種類や，組み込みソフトウェア特有と思われるコードクローンを発見した．

[2] を Arduino プロジェクトに適用することで，コードクローンの発生状況を調査する．
本研究では，Arduino プロジェクトと組み込みソフト
ウェア以外のソフトウェアにおけるコードクローンの発生率を比較し，Arduino プロジェクトの方がコードクロー
ンの発生率が高いことを確認した．また， Arduino プロ
ジェクトにおいて，発生率の高いコードクローンについて考察し，その中から組み込みソフトウェア特有と思われるものを発見した．

66

SEA

ソフトウェア・シンポジウム2019 in 熊本

も同様にオープンソースであり，世界中のユーザーの知

本報告書の構成を以下に示す．2 章では本研究を行う

見によって拡大し続けている．

目的について述べる．3 章では本実験に必要な前提事項
や対象となるプロジェクトについて述べる．4 章では実数年に渡り，Arduino は日用品から工業用まで様々な験の手順について説明する．5 章では実験結果を報告す

プロジェクトに応用されている．学生からプログラマー，る．6 章では実験結果の考察を行う．7 章では本研究のアーティスト，専門家など，世界中の人々が Arduino を

まとめと今後の課題について述べる．

利用しており，知見を寄せ合っている．Arduino はそのシンプルさによって数多くのアプリケーションに利用さ

研究の目的

2

れている．また，その統合開発環境である Arduino IDE
は Mac，Windows，Linux 上で動作させることができる．

本研究の目的は，CCFinder を Arduino プロジェクト本研究では Arduino プロジェクトにおけるコードクに適用し，出力としてコードクローンのメトリクスを得

ローンの分析を行う．Arduino には派生プロジェクトがた上で，Arduino 環境に存在するコードクローンについ多く存在するため，コードクローンの影響が強いと予想て考察することである．

される．

この目的のため，以下の研究設問を設定し，実験結果

3.2について考察する．本研究における研究設問を以下に

GitHub示す．

GitHub [3] とは，開発プラットフォームであり，オー
プンソースプロジェクトやビジネスユースまで，GitHub
上にソースコードをホスティングすることで他の開発者からレビューを得ることや，プロジェクトを管理しながらソフトウェアの開発を行うことができる．
バージョン管理は Git によって行われる．Git は分散型バージョン管理システムの一つであり，開発参加者 1人 1 人がリポジトリのコピーを保有できる．
開発者は他者にレビューをリクエストでき，他者は開発者にプルリクエストをしてコードの変更を提案できる．
GitHub にはフォーク機能があり，他者のリポジトリをコピーし変更を加えることができる．変更が加えられたら，コピー元の開発者はマージすることでその変更を自分のコードに導入できる．また，変更内容の差分を確認できるので，他者はレビューを迅速に行うことができる．
GitHub が誕生する以前は，オープンソースのプロジェクトに貢献するために，そのプロジェクトのソースコー
ドを手作業でコピーし，変更をローカルに加え，パッチを元の開発者にメールで送る，という手順を踏む必要があった．しかし現在では，全て GitHub のプラットフォー
ム上で行うことができる．

RQ1 Arduino 環境においてどの程度の割合でコードク
ローンが存在するか．
RQ2 ソースコードのどのような部分にコードクローンが存在するか．
RQ3 組み込みソフトウェア特有のコードクローンは存
在するか．

3

準備

3.1

ArduinoArduino とは，安価で入手できるオープンソースのプ
ラットフォームである．Arduino の基板は，光センサーやスイッチ，音センサーから入力を受け付け，モーターやLED などへの出力を可能とする．Arduino 基板を動作させるには，C++言語を拡張した Arduino 言語と Arduino
用統合開発環境を用いる必要がある．
Arduino はイタリアのイベーラインタラクションデザイン大学で誕生した，エレクトロニクスやプログラミン
グの知識のない学生でも利用できるように開発されたツールである．幅広いコミュニティで利用されるようになると，シンプルな 8 ビット基板から，ウェアラブル機器，3D プリント，組み込み環境など，新しい形に変化していった．全ての Arduino 基板はオープンソースであり，個人のニーズに合わせて開発できる．ソフトウェア

3.3

Google Big Query

Google Big Query1 [4] とは，Google が提供するビッグデータ解析ツールである．データベースの操作には SQL
1 https://cloud.google.com/bigquery

67

SEA

ソフトウェア・シンポジウム2019 in 熊本

文を使用でき，GitHub のリポジトリのデータベースがソースコード 1. コードクローン例
public class MultiButtonUI extends ButtonUI {public static ComponentUI createUI ( JComponent a) {ComponentUI mui = new MultiButtonUI ();return MultiLookAndFeel . createUIs (mui ,(( MultiButtonUI ) mui ).uis ,a);
}
}

存在する．

3.4 コードクローン
コードクローンとは，複数のソースファイル中で類似

public class MultiColorChooserUI extends ColorChooserUI {public static ComponentUI createUI ( JComponent a) {ComponentUI mui = new MultiColorChooserUI ();return MultiLookAndFeel . createUIs(mui ,(( MultiColorChooserUI ) mui ).uis ,a);}}

したコード部分のことである [4]．コードクローンは，コピーアンドペーストなど，コードの再使用によって生まれる．また，改変が繰り返された生存時間の長いプロジェ
クトにもしばしばコードクローンが発生する．さらに，コードをコピーした後，僅かに変化を加えたものもコー

3.5 CCFinder

ドクローンとなり得る．
コードクローンはソフトウェアの保守性を下げる．例

CCFinder とは，神谷らによって開発されたコードク
ローン検出ツールである [2]．工業用の大規模なソフト
ウェアシステムのような，複数のエンジニアが数十年に渡りメンテナンスを続けているプログラムに含まれるコードクローンを効率的に検出するツールが存在しなかったことが CCFinder 開発の動機となっている．
CCFinder の特徴は下記のようになっている．

えば，複製され，変化を加えられたコードクローンを複数持つソフトウェアが存在したとする．複数あるコードクローンの内，どれか 1 つに不具合が見つかったとき，
エンジニアは全てのコードクローンの不具合を除去しなければならない．複数のエンジニアが開発に携わる，複雑で大規模なソフトウェアであった場合，不具合を除去するのはさらに困難になる．
もしコードクローンの存在を事前に知っており，メン• メモリと計算能力があれば，100 万行を超える工業用ソフトウェアシステムのソースコードにも適用できる．

テナンスをしていれば，不具合の除去は比較的簡単になるが，コードクローンの情報を保持し続けるのは困難でコストがかかる．

• 大規模なシステムで大量のコードクローンが検出された場合，役に立つ情報を持つコードクローンのみを選ぶ．例えば，変数の初期化などは役に立たないものとして選出されない．

コードクローンは，シンボル数ではなく文字数が最大になるように定義される．例えば，

axyzbxyzcxyd• 完全に同じコードだけでなく，変数名が異なったものなど，僅かに異なったコードからもコードクロー
ンを検出する．

という文字列があった場合，コードクローンは，xyz，xy，yz の 3 種類があるが，このとき文字数が最大のものを選ぶので，コードクローンは xyz となる．
次に，コードクローンを含むソースコードの例を，ソースコード 1 に示す．クラス名が異なるだけで，同じ処理をしている．
ここで，MultiButtonUI と MultiColorChooserUI の 2 つのクラスは，クラス名が異なるだけで同じ処理をしているため，コードクローンであると言える．

• 数種類のプログラミング言語に対応している．
CCFinder は接尾辞木を用いて文字列マッチングを行っており，行マッチングよりも計算量が大きい．しかし，いくつかの最適化を行い，大規模なソフトウェアにも実践的に使えるように設計されている．また，数種類のメ
トリクス値が計算され，コードクローンに関する情報を得ることができる．
各メトリクスの説明を表 1 に示す．

68

SEA

ソフトウェア・シンポジウム2019 in 熊本のを使用した．次に，実験対象データである Arduino プ

表 1. CCFinder が算出するメトリクス
内容
メトリクス名 略称

NumberFileof

LengthFILE

ロジェクトを Google Big Query を用いて GitHub から入手する．2016 年 1 月から 5 月の間でウォッチ数が 10 以入力するファイル数

上のプロジェクトを集めたところ，170 個のプロジェク

を表す．

LEN

トを入手した．このとき使用したクエリを 2 に示す．さ

コードクローンの文らに，Java のビルドツールである Apache Ant (v1.10.5)

字数を表す．

Line of CodeLOC

を Apache ソフトウェア財団のホームページ3 [5] からダ入力されたソースフ

ウンロードする．

ァイル群の合計行数
を表す．

Source Lineof CodeSLOC

LOC から空行とコ

ソースコード 2. Arduino プロジェクトを取得する

メント行の数を引い

クエリ

たもの．

Clone Line of
Code

CLOC

Population ofa ClonePOP

Coverage ofClone % LOC

CVR %LOC

SELECT
repo_name ,watch_count
FROM[bigquery -public -data: GitHub_repos . sample_repos ]WHERE
repo_name IN(
SELECT sample_repo_name
FROM [bigquery -public -data: GitHub_repos . sample_contents ]WHERE content LIKE ’%# include " Arduino .h"% ’OR sample_repo_name LIKE ’% Arduino %’OR sample_path LIKE ’%. ino%’)
ORDER BY watch_count DESC
LIMIT 200 ；コードクローンの合計行数を表す．
コードクローンの出
現回数を表す．
合計行数のうちのコードクローンの行数の割合を表す．

4実験
4.2 実験内容
本章では実験する対象と内容について説明する．本研究
各研究設問に対する実験内容について説明する．

では，多くの Arduino モジュールのライブラリが GitHubのリポジトリとして存在することと，実験対象となるプ
ロジェクト数が多いことから，Google Big Query を用い

4.2.1 RQ1て GitHub から Arduino 用ライブラリとそのライブラリ

設問内容:Arduino 環境においてどの程度の割合でコーを使用しているプロジェクトを取得する．その後，取得した Arduino プロジェクトに CCFinder を適用し，出力

ドクローンが存在するか．

されるコードクローンに関するメトリクスを観測するこGitHub から入手した 170 個の Arduino プロジェクト
それぞれに CCFinder を適用し，CVR % LOC を取得し，Ekram ら [10] の実験結果から，テキストエディタである
Gedit，Glimmer とウィンドウマネージャである icewmの CVR % LOC の値と比較する．
次に，コンパイル機能を持つ ESP82664 [6] の Arduino
ライブラリと，Java のコンパイラである Apache Ant に対しそれぞれ CCFinder を適用することで，同じ機能を持つプロジェクト間におけるコードクローンの検出結果を比較する．

とで研究設問に答える．

4.1 実験の準備
実験に使用するツールと実験対象データの取得方法について説明する．
まず，実験でコードクローンを検出するためのツールである CCFinder2 を入手する．公式の最新バージョンである CCFinder は 2010 年で開発が止まっており，当時の実行環境 (Win32，Ubuntu9.1) を用意することが困難であるため，GitHub 上で第 3 者によってフォークされたも3 http://www.apache.org
2 https://github.com/radekg1000/ccfinderx

4 https://github.com/esp8266/Arduino.git

69

SEA

ソフトウェア・シンポジウム2019 in 熊本

4.2.2 RQ2

表 2. 各プロジェクトのコードクローン情報 1
FILE
LOC CVR % LOC

設問内容:ソースコードのどのような部分にコードク
ローンが存在するか．

Arduino Projects
Gedit [10]Glimmer [10]icewm [10]

RQ1 で得た 170 個の Arduino プロジェクト全体に
CCFinder を適用し，ソフトウェアへの影響が大きいコー
ドクローンを選ぶため，CLOC が 500 行以上で POP が10 回以上のコードクローンを集め，ソースコードのどのような部分にコードクローンが発生しているかを調べる．

152
121
124
200

38,79546,87744,33952,689

21.5
1.0
2.6
0.1

表 3. 各プロジェクトのコードクローン情報 2
FILE
LOC CVR % LOC

4.2.3 RQ3

ESP8266 Library
Apache Ant

設問内容:組み込みソフトウェア特有のコードクロー

1,464
1,272

316,462
272,359

37.8
26.6

ンは存在するか．

5.2 RQ2

RQ2 で得たコードクローンのソースファイルを観察することで，そのコードクローンを含むプロジェクトの特徴を調べ，組み込みソフトウェア開発経験者の手で分類を行い，組み込みソフトウェア特有のコードクローンの存在について調べる．

設問内容:ソースコードのどのような部分にコードク
ローンが存在するか．

4.2 節で説明した条件に基づきコードクローンを選出したところ，15 種類のコードクローンを得ることができ5た．また，170 個の Arduino プロジェクト全体の CVR %結果

LOC は 62.3%であった．4.2 節で説明した条件に基つき選出したコードクローンを表 4 に示す．また，SIMD 命
令の羅列によるコードクローンとコアの種類によるコー
ドクローンの例をソースコード 3 と 4 に示す．

各研究設問に対する実験結果を示す．

5.1 RQ1• 組み込み関数による SIMD 命令の羅列 組み込み関数として使用されている SIMD 命令がコードクロー
ンとして検出された．各コードクローンの違いは，演算子や型の違いである．15 種類のコードクロー
ンの合計行数のうち 22.9%を占めている．

設問内容:Arduino 環境においてどの程度の割合でコー
ドクローンが存在するか．

170 個の Arduino プロジェクトにおけるコードクロー
ンに関する情報の平均値と，Wi-Fi モジュールである
ESP8266 の Arduino ライブラリ，Java のビルドツール
である Apache Ant に含まれるコードクローンに関する
情報と，Ekram ら [10] の実験結果から，Gedit，Glimmer，
icewm における CVR % LOC を表 2、表 3 に示す．また，170 個の Arduino プロジェクトそれぞれに CCFinder を適用し算出した各プロジェクトの CVR % LOC を図 1 に示す．
表 2 より，Arduino プロジェクトの CVR % LOC の平均値は Gedit，Glimmer，icewm より大きいことがわかる．また，ESP8266 Library と Apache Ant の CVR の値を比較すると，ESP8266 Library の方が大きいことがわかった．

• レジスタ処理 ネットワークのパラメータを得るための関数を再利用しているものがコードクローンとして検出された．各コードクローンの違いは，対象となっているレジスタ名の違いである．15 種類のコー
ドクローンの合計行数のうち 5.0%を占めている．
• コンパイラによる構文解析 RTOS プロジェクト5 [7]のビルドツールによる構文解析のための関数がコー
ドクローンとして検出されている．各コードクロー
ンの違いは，関数名の違いである．15 種類のコー
ドクローンの合計行数のうち 2.7%を占めている．

5 https://github.com/TrampolineRTOS/trampoline

70

SEA

ソフトウェア・シンポジウム2019 in 熊本

表 4. CVR の大きいコードクローン情報
クローンの種類
LEN
POP

100

組み込み関数による SIMD

CVR % LOC [%]

80

2,626

46

レジスタ処理1,511

20

コンパイラによる構文解析

1,081

11

ツールで自動生成された

3,184

15

4,037

10

命令の羅列

60

40

コード
コアの種類によるクローン

200

ソースコード 3. SIMD 命令の羅列によるコードク
1

ローン例

Arduino Projects__attribute__ ( ( always_inline ) ) static __INLINE
uint32_t __SADD8 ( uint32_t op1 , uint32_t op2){
uint32_t result ;図 1. 170 個の Arduino プロジェクトの CVR %LOC__ASM volatile (" sadd8 %0, %1, %2" : "=r" ( result ) :"r" (op1), "r" (op2) );return ( result );• ツールで自動生成されたコード 基板に非対応のモジュールを接続するための変換アダプタのプロジェ
クト6 に含まれているものがコードクローンとして検出された．ソースコードのコメントから，自動生成されたものであることがわかった．各コードクロー
ンの違いは，初期化するパラメータの違いである．
15 種類のコードクローンの合計行数のうち 9.0% を占めている．

}__attribute__ ( ( always_inline ) ) static __INLINE
uint32_t __QADD8 ( uint32_t op1 , uint32_t op2){
uint32_t result ;__ASM volatile (" qadd8 %0, %1, %2" : "=r" ( result ) :"r" (op1), "r" (op2) );return ( result );}5.3 RQ3• コアの種類によるクローン SAM マイクロコント
ローラー [9] や AVR マイクロコントローラー [10]など，異なるマイクロコントローラーに対し，同じライブラリを使っているものがクローンとして検出された．全く同じライブラリを使用しているので，
コードクローンの間に違いはない．15 種類のコー
ドクローンの合計行数のうち 7.6%を占めている．

設問内容:組み込みソフトウェア特有のコードクロー
ンは存在するか．

RQ2 への実験結果で得たコードクローンのうち，組み込みソフトウェア特有であるものの情報を表 5 に示す．
また，各コードクローンの例について説明する．
RQ2 で選出した 15 種類のコードクローンの内，組み込みソフトウェア特有であると思われるものは 12 種類あった．また，15 種類のコードクローンの合計行数の内，組み込みソフトウェア特有のコードクローンの割合
は 40.0%であった．
• コアの種類 5.2 節で説明した通りである．コアモ
ジュールの種類が異なるが，同じソースコードを用いているので，組み込みソフトウェア特有のクローンであると判断した．
• ディスプレイの種類 異なる種類のディスプレイに対し同じ制御ライブラリを使用し，コードクローン

6 https://github.com/Microsoft/Windows-iotcore-samples

71

SEA

ソフトウェア・シンポジウム2019 in 熊本

6

考察

表 5. 組み込みソフトウェア特有のコードクローン
情報

コアの種類
ディスプレイの種類
ファームウェアの動作モードの種類

6.1 RQ1
LEN

POP

4,037
2,205
3,115

10
13
10

設問内容:Arduino 環境においてどの程度の割合でコー
ドクローンが存在するか．
表 2 より，テキストエディタやウィンドウマネージャ
よりも Arduino プロジェクトの方が CVR % LOC の値が大きい．R. Al Ekram ら [10] の実験結果から，多くのとして検出され，組み込みソフトウェア特有のコー

プロジェクトにおける CVR % LOC はおおよそ 10%か

ドクローンであると判断した．15 種類のコードク

ら 15%の間となっており，Arduino プロジェクトは平均

ローンの合計行数のうち 5.4%を占めている．

21.5%であるので，プロジェクトに対してコードクロー
ンの発生率が高いと言える．
以上のことから，Arduino プロジェクトには組み込み
以外のソフトウェアより多くのコードクローンが発生していることがわかる．

• ファームウェアの動作モードの種類 ファームウェ
アの動作モードによって異なる制御ライブラリが用意されているが，ソースコードの内容が等しいた
めコードクローンとして検出され，組み込みソフト
ウェア特有のコードクローンと判断した．15 種類のコードクローンの合計行数のうち 5.9%を占めている．

6.2 RQ2
設問内容:ソースコードのどのような部分にコードク
ローンが存在するか．
組み込み関数による SIMD 命令の羅列はコードクロー

ソースコード 4. コアの種類によるコードクロー

ンとして検出された．しかしこれは，組み込み処理の最ン例

適化によるものであり，ハードウェアの多様化やオープ
ンソースであることが原因ではないと考えた．

String :: String (const char *cstr){
init ();
if (cstr) copy(cstr , strlen (cstr ));}一方で，レジスタを直接参照する記述においてもコー
ドクローンが多く発見されることがわかった．
同様に，5.2 節の結果と神谷ら [2] の実験結果から，String :: String ( const String & value){
init ();*this = value ;}ツールによって自動生成されたコードには多くのコード

String :: String ( const __FlashStringHelper *pstr){
init ();*this = pstr;}

変更して生成するためであると考えられる．

クローンが含まれることがわかる．原因として，自動生
成ツールは同じ処理のコードを，使用する変数名のみを以上のことから，SIMD 命令の羅列や，レジスタの処理，自動生成によるコードなどにコードクローンが多く検出されるということがわかる．

# ifdef __GXX_EXPERIMENTAL_CXX0X__
String :: String ( String && rval){
init ();
move(rval );}String :: String ( StringSumHelper && rval){
init ();
move(rval );}6.3 RQ3
設問内容:組み込みソフトウェア特有のコードクロー
ンは存在するか．

4.3 節で述べた方法に基づき，コアの種類，ディスプ
レイの種類，ファームウェアの動作モードの種類によって生まれるコードクローンを組み込みソフトウェア特有のコードクローンであると判定した．

72

SEA

ソフトウェア・シンポジウム2019 in 熊本

また，Ekram ら [10] の研究から，RQ2 で検出した変発生した場合の対処方法と，コードクローンの発生を未数名のみが違うコードクローンは，テキストエディタ

然に防ぐ方法についてより深く考察する必要がある．

やウィンドウマネージャーにも検出されたので，組み込
みソフトウェア特有のものではないと考えられる．反対7

まとめに，組み込みソフトウェア特有であると判断したコードクローンと同じ特徴をもつコードクローンは，Ekram ら

本研究では組み込みソフトウェアにおけるコードク[10] の研究においては検出されなかった．
構文解析文におけるコードクローンは，Apache Ant に
おいて 3.1%，ESP8266 において 1.6%確認されているため，組み込みソフトウェア特有ものではないと判断した．
本研究で発見した組み込みソフトウェア特有のコード
クローンが発生する原因として，伊藤ら [11] の研究か
ら，あるハードウェアを改良して新たにハードウェアを開発する際，開発の効率を上げるためにソースコードを再利用するということや，別種のハードウェアであっても，機能が似ていれば同じ処理のソースコードが使われるということが考えられる．
コードクローンを関数として一つにまとめた場合，呼び出しの際にオーバーヘッドが生まれてしまうため，RQ2で検出した組み込み関数によるインライン展開を利用するなど，対処する必要がある．Joseph Caldwell ら [12] の研究から，ソースコードの量を増やさずにインライン展
開を行い，関数呼び出しの最適化をする手法が考案されている．この研究の結果から，この手法を C++言語プ
ログラムに適用し 29%のオーバーヘッドを軽減できるので，C++言語ベースである Arduino ソフトウェアにも同等の結果が期待できる．

ローンの存在について考察する足がかりとして，GitHubから取得した 170 個の Arduino プロジェクトに対し，コー
ドクローン検出ツールである CCFinder を適用した．実験の結果，Arduino プロジェクトには組み込み以外のソ
フトウェアより多くのコードクローンが発生していることがわかった．発見されたコードクローンのうち，SIMD
命令の羅列や，レジスタの処理，自動生成されたコードにコードクローンが多く見られた．また，組み込みソフ
トウェア特有と判断できるコードクローンも見られた．
今後の課題として，Arduino 以外の組み込みソフトウェ
アにおけるコードクローンの発生状況を調べ，コードク
ローンが発生した場合の対処法を考える必要がある．

参考文献[1] Arduino, （ オ ン ラ イ ン ）, 入 手 先〈https://www.arduino.cc〉（参照 2019-1-26）.
[2] T. Kamiya, S. Kusumoto, and K. Inoue, “Ccfinder: A
multilinguistic token-based code clone detection system for large scale source code,” IEEE Transaction
on Software Engineering, vol.28, no.7, pp.1–17, July
2002.

6.4 妥当性への脅威[3] Github, （オンライン）, 入手先〈https://github.com〉（参照 2019-1-26）.

現在 ArduinoIDE にはライブラリマネージャの機能が存在するため，IDE によって管理されているライブラリ[4] Google, Google BigQuery, （オンライン）, 入手
先〈https://cloud.google.com/bigquery〉（参照 20191-26）.

がプロジェクトに含まれるものは CVR % LOC が下がる
可能性がある．

6.5 課題[5] The Apache Software Foundation, （オンライン）, 入
手先〈http://www.apache.org〉（参照 2019-1-26）.

今後の課題として以下のようなことが挙げられる．
本研究ではオープンソースである Arduino のプロジェ[6] ESPRESSIF,
ESP8266（
オン
ラ イ ン ）,
入 手 先〈https://www.espressif.com/en/products/hardware/esp8266ex/overview〉（参照 2019-1-26）.

クトを実験対象としたが，他の組み込みソフトウェアではコードクローンはどのように発生しているのか調べる必要がある．
また，本研究で組み込みソフトウェアにコードクロー
ンが発生するいくつかの原因を発見することができたが，

73

SEA

ソフトウェア・シンポジウム2019 in 熊本[7] trampoline, TrampolineRTOS, TrampolineRTOS/trampoline（ オ ン ラ イ ン ）,入 手 先〈https://github.com/TrampolineRTOS/trampoline〉（ 参 照2019-1-26）.
[8] MICROCHIP, Microchip/sam（ オ ン ラ イ ン ）, 入
手先〈https://www.microchip.com/design-centers/32bit/sam-32-bit-mcus/sam-c-mcus〉（参照 2019-1-26）.
[9] MICROCHIP, Microchip/avr（オンライン）, 入手
先〈https://www.microchip.com/design-centers/8bit/avr-mcus〉（参照 2019-1-26）.
[10] R.A. Ekram，C. Kapser，R. Holt，M. Godfrey，“Cloning by accident: an empirical study of sourcecode cloning across software systems,” International Symposium on Empirical Software Engineering, vol.10, no.7, pp.17–18, Dec. 2005.
[11] M. Ito, Y. Sakai, T. Sato, M. Sato, and T. Matsumoto,“The method of extracting the reusable software assets for improving the quality in embedded software,”Technical report, SQiP, 2006.
[12] J. Caldwell and S. Chiba, “Reducing calling convention overhead in object-oriented programming onembedded arm thumb-2 platforms,” Proceedings ofthe 16th ACM SIGPLAN International Conference on
Generative Programming: Concepts and Experiences,
vol.52, no.12, pp.146–156, Oct. 2017.

74

SEA