simotin13's message

simotin13といいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

Intel Pin を使ってコードカバレッジツールを作ってみた

一年ほど前にGDBを使ったコードカバレッジツールを作っていましたが、
mcommit.hatenadiary.com
最近少し時間ができたのでIntelPinという動的バイナリ計装エンジン(Dynamic Binary Instrumentation Engine)を使う形で改めて作ってみました。
IntelのPinプラグインを書くのは初めてだったので使い方やバイナリ計装について調べたので諸々を記事に書いておきたいと思います。

  • Intel Pin とは何か?
  • DBI は何をしているのか?
  • Pinの使い方
    • Pinの実行方法
    • Pin のAPIの利用法
    • Makefileについて
  • Pinを使ってみたきっかけ
  • 作ってみたカバレッジツールについて
  • 参考書籍・参考サイト
  • 感想

Intel Pin とは何か?

Intel Pin は文字通りIntelが公開している動的バイナリ計装エンジンです。ユーザアプリケーションを実行時に計装くれて、実行した命令やメモリアクセス、関数呼び出し時のレジスタの値など、様々な情報を収集することができます。プラットフォームはLinuxWindowsに対応しているようです。
正式名称は Pin のようなので以降はPinで統一して記載します。

Pin本体はDBI(Dynamic Binary Instrumentation)のエンジンであり、Pinの利用者はPinが提供するAPI(C++)を使って実行時の情報を取得するコードを実装することができます。Pinの様々な機能(API)を利用したツールやサンプルのソースコードは公開されていますが、Pinの本体のソースコードは公開されておらず実行モジュールとして提供されています。

続きを読む

自宅に太陽光発電を設置した結果~1年目~

2021年に太陽光発電・蓄電池を設置していました。
発電が開始されたのは2021年の6月からでしたが、1月~12月の期間での1年の結果が出たことになるので記事を書いてみたいと思います。
太陽光発電については東京都が条例で設置を義務付けしたり、詐欺会社のことがニュースになったりと話題が多いですが、実際に設置した人の声というのはまだまだ世の中に出ていないような気もするので参考になるのではないかと思います。

設置の経緯

そもそもなぜ設置したかというと、2021年に太陽光発電の営業をしている会社の人が来られたのがきっかけでした。
太陽光発電には特に興味はありませんでしたが、再エネ賦課金による電気代の値上がりが続いていることと、保証制度がそれなりに充実してたので蓄電池と合わせて設置を決めました。
我が家は子供が多いので、他の家庭と比べてかなり電気を使っています。契約内容にもよりますが、電気代は使えば使う程に単価が上がっていく仕組みになっており、更に再エネ賦課金も固定料金ではなく従量課金制度です。

FITの制度自体はどうかと思う面はありますが、家族構成上どうしても電気を使う以上、太陽光発電は「得をするから導入する」というよりは「導入しないと損をする」という消極的な理由から導入してみました。

2022年の発電実績

設置した設備はパナソニックの設備になりますが、発電量や蓄電量はモニター端末で確認できます。
2022年のデータとグラフを見てみましょう。

2022年年間データ
2022年年間グラフ

見ての通り、2022年の発電量は2,378kWh。売電量は386kWh。買電量は2,397kWhでした。
ちなみに我が家に設置した太陽光発電の発電量は2.3kW。蓄電池の容量は5.6kWhになります。
また、発電システムの動作はいわゆる環境優先モードにしており、使わない電気は極力蓄電池にためています。
売電量が発電量と比べて少ないのはこのためになります。

シミュレーション結果との比較

導入時に営業の人が発電量のシミュレーションの結果を持ってきてくれたのですが1年経った結果と見比べてみましょう。

営業の人が持ってきたシミュレーション
営業の人が持ってきたシミュレーション

シミュレーションと実績を比較して分かることは、

  1. 全体で発電実績が500kWh程シミュレーションより少ない
  2. シミュレーションより発電実績が多い月はない

という点です。
500kWhを単価20円で計算してみると10,000円に相当します。太陽光発電は10~15年スパンで損得を考える商品ですが、年間10000円の誤差は割と大きいと思います。1年間目の結果として言えることは営業トークは嘘とまでは言いませんが、若干間引いて聞いておくとよいのかもしれません。

感想

設置して1年(実質的には1年半ですが)経った感想ですが、太陽光発電のお陰で毎月の電気代は下がっているのは事実なので付けない方がよかったという感覚はありません。例えば発電量が増えてくる4~5月、9~10月頃は消費電力も少なくなるので電気代自体は実質0円になります。
しかし、かといってつけといてよかったなぁという程のお買い得感も今のところ感じていません。

太陽光発電については様々は批判がありますが、化石燃料を使う発電や原子力発電にもそれぞれ問題はあるので単純に太陽光発電自体の問題を捉えて批判するはどうかと思うのですがコスパがいいかどうかを考えると微妙な商品かなと思います。

再エネ賦課金について

再エネ賦課金については最近の物価高の影響を踏まえて実質税金で肩代わりする案が政府・国会で検討されているようです。
肩代わりされるとなると、私を含む太陽光発電を導入した人達は、電気代が安くなる上に売電益を税金で払って貰っている形になるので、その分得をしている状態となります。これはありがたい反面、FITの制度自体おかしいと思う気持ちもあるので複雑な心境になります。

できるだけ電気を使わない生活を意識する

発電にはそれぞれ一長一短がありこれがあれば全て問題解決という発電方法やエネルギー源は今のところ存在しません。結局のところ、少ないエネルギーで生活できるならそれに越したことがないというのが結論なのかなと思います。できるだけ電気を使わなくても夏や涼しく、冬は暖かく過ごせるよう工夫するのが大切な気がします。

私は夏の暑さには比較的耐えられるのですが、寒いのが苦手で、しかも冷え性なので室内でも手足が冷えるため冬場は暖房や電気ストーブを強めに使っています。太陽光発電を設置したことで割と電気代を意識するようになりましたが、今年の冬はできるだけ暖房を使わないように今年の冬はPCの作業用の手袋を使ったり、室内用の防寒スリッパを使って節電しています。

特に手袋の方は、指が冷えるとまともにキーボードが打てないくらい冷えていたので作業効率も上がりました。
冬場に使う電気ストーブは300W~1000W程度の電力を消費しますので身に着ける室内用の防寒衣類で寒さをしのげるのはかなり節電に効果があります。

去年までの実績だと太陽光発電があっても冬場の電気代は月に7000円~1万円程度にはなっています。
今年の冬は急な寒波で寒い日が続いていて、暖房器具に頼っていますが、少しでも消費電力を減らしていけるよう工夫していきたいと思います。

追記

2年目(2023年)の結果についてはこちら

mcommit.hatenadiary.com

大学の勉強をしている間に買った本やよく見たYouTubeについて

先日、通信制帝京大学理工学部を卒業した記事を書きましたが勉強するうえで参考にした書籍やYouTubeの動画について紹介してみたいと思います。

mcommit.hatenadiary.com


教科別に指定されている教科書以外でよかった書籍やYouTubeの動画についてまとめてみました。

線形代数

線形代数では、行列式の展開や連立方程式の解き方、固有値について勉強することになります。
教科書の問題を解くのと合わせてオーム社の漫画でわかる線形代数で全体的な雰囲気をつかんでいました。


微分積分

私は数3を履修していなかったので、大学の微分積分はかなりつらかったです。
結局数3の参考書を買って高校の範囲から勉強し直すような感じでした。

高校の範囲の微分積分YouTube家庭教師のトライから出ている微分積分の動画を見て勉強していました。

www.youtube.com

トライの先生の動画はかなり分かりやすい動画で感謝しています。

離散数学

符号化や群論RSA暗号など整数論に関する内容を学びます。
無事単位は単位は取れましたが、結局BCH符号をちゃんと理解できないまま終わってしまったので少し悔いが残っています。

暗号化・復号に関しては数学ガールで有名な結城先生の暗号技術入門をパラパラとめくったりしました。

また、RSA暗号に関しては数学の先生をされている古賀さんという方の「合同式RSA暗号」の動画がとても分かりやすく説明されています。こちらの動画は8回に分けて必要な知識を順番に説明してくださっているのでとても分かりやすかったです。
www.youtube.com

電気回路

個人的に電気回路はとても苦労しました。KCL・KVLに関する基本的な問題の他、重ね合わせの理、テブナンの定理など電気回路のいろんな解法を学びました。
授業で指定されている教科書は評判が悪く、課題で指定されている問題には解が一意に定まらない問題もありました。

参考にした書籍では、基本から分かる電気回路がカラーで読みやすかったですが、交流回路を学ぶ際に出てくる式や解き方は書籍によって微妙に違っているため初学者は混乱してしまう可能性がありますので注意が必要です。

論理回路

カルノー図や状態遷移表など論理回路に関して段階的に学ぶ授業でした。
論理回路では複雑な式が出てこないのと、計算機の基礎を学んでいる雰囲気があって自分にとってはとても面白い授業でした。

カルノー図については「プログラマの数学」でも触れられています。

また、必須主項を求める方法についていまいちわからずに調べていた時に、海外の方の説明の動画があって助けられたのを覚えています。

こちらの動画は具体的でとても分かりやすかったです。
www.youtube.com

応用数学

応用数学では微分方程式フーリエ解析ラプラス変換について学びます。

微分方程式については、教科書で指定されていますが、「やさしく学べる微分方程式」が分かりやすかったです。*1

ラプラス変換フーリエ変換も石村先生の書籍が分かりやすかったです。


フーリエ解析については、「まんがでわかるフーリエ解析」が分かりやすかったです。

ちなみにこちらの本はポケットサイズの本も出ているので、持ち運びにはそちらの方が便利です。

まとめ

ということで思いつく範囲でいくつかおすすめの書籍や動画を上げてみました。
帝京大学通信制は実質的に独学に近いので、卒業までにはここにあげていない本や動画をかなり見ていたはずなのですが、今となって思い出せないものが多いです。

思い出したら都度この記事に追記していきたいと思います。

*1:わかりやすいといっても微分方程式自体はいろいろ覚えることが多くて辛かったですが

帝京大学 理工学部 情報科学科 通信教育課程を卒業しました

2022年9月を以て帝京大学理工学部情報科学科の通信教育課程を卒業しました。
www.teikyo-u.ac.jp

卒業確定の連絡を受けたのは9月20日ごろだったかと思います。



卒業証書・学位記

一般的な教育機関の年度は4月~翌年の3月までですが、帝京大学では9月卒業の制度があるため、9月での卒業が可能です。2023年3月まで学習を継続することも可能でしたが、卒業に必要な単位を満たしてしまったので何となくもう卒業でもいいかなと思い卒業することにしました。

私は2018年の4月に入学して卒業したのが2022年9月なので4年半学んでいたことになります。入学した当初は仕事も家庭もあるし、もしかしたら卒業は無理かもしれないなとぼんやり思っていましたが無事卒業できたのでほっとしています。

せっかく卒業できたので、なぜ大学に入ろうと思ったのかとか、通信制での勉強のことなど書いておきたいと思います。

入学前の状態

普段はプログラマとして仕事をしていて、主に組込ソフトとか通信プロトコルの実装やWebアプリ開発などの仕事などをしています。大学は元々文学部を卒業していたので、入学時は2年目からの編入で入学していました。

なぜ帝京大学通信制に入ろうと思ったか?

普段から仕事で必要な知識は学びながらこれまでプログラマとしてやってきましたが、プログラマとして日常で必要になるのはあくまで応用です。そのため数学やアナログ回路・ディジタル回路に関する基礎知識をきちんと勉強することがありませんでした。

いわばベースとなる基礎知識がない状態で仕事を長年してきたのですが、あるときグラフィックス関係の仕事を担当した際に、数学的な知識が不足しているためにあまり明確な成果が出せず個人的に悔しい思いことがありました。
また、近年のAIブームもあり数学の重要性などが叫ばれるようになったこともありなんとなく数学やらないとダメかな見たいな気持ちもありましたが、なかなか腰を据えて勉強できていない状況が続いていました。

自分は基本的にやる気のない人間です。お尻に火がつかないと動けないタイプの人間なので、「お金を払って学んでいる」という状況を作ることで勉強する動機づけをしたかったというのが入学の理由の一つです。

大学に入学してしまえば試験と単位取得というノルマが発生しますので、「お金を払って自分のお尻に火をつける」という一見誰得な状態を作り出していたわけですが、無事卒業できたし、入学していなければ絶対に勉強はしていなかったと思うのでこの戦略自体は成功と言ってよいと思います。

良かった点

数式を見ても発狂しなくなった

元々文系出身なので数学には苦手意識がありました。特に書籍に数式が出てくると脳みそが溶けだしていましたが、今では数式をみてもちょっと眠たくなるくらいには数学の苦手意識を克服できました。

成績はよくありませんでしたが、線形代数微分積分・数理統計学応用数学といった科目を勉強できたのはよかったです。*1

AI・機械学習には今はあまり興味はありませんが、仕事でそういった案件に関わる機会が増えてきており、その理論を数学や統計に関する知識を元に理解することができるのでこれらの数学系の勉強できたことは良かったと思います。

電気回路の勉強ができた

組込系のソフトウェア開発をしていると回路に関する知識が多少なり必要になることがあります。これまでアナログ回路の知識ががっつりと求められることはありませんでしたがやはり一般教養レベルでも電気回路のことを知っているとハードウェアエンジニアの方との会話がしやすくなるので電気回路・電磁気学・電子回路について勉強できたのは良かったです。*2

学割のメリットを享受できた

勉強以外の副産物的なメリットですが、商品やサービスの購入時に学割を受けることができるのでありがたかったです。
と言ってもYouTube Premiumくらいですが。

成績・GPAについて

卒業時点のGPAは2.45であまり芳しくない結果でした。
そもそも自分の場合、コンピュータサイエンスに関わる基礎的な知識を身につけたいという動機が強かったので、履修する上でGPAはほとんど気にしていませんでした。GPAという制度が無批判に日本の大学に導入されていること自体どうかと思いますが、それはそれとしてもう少し気にしながら勉強してもよかった気もしています。

ただし、正規の大学では履修期間中に初回・2回目の講義を受けてみて先生との相性や難易度、親しい友達の履修状況を踏まえて履修を取り消したり追加したりできますが、帝京大学通信制の場合、科目に関する情報はシラバスがあるだけで、講義の難易度などの具体的な情報はその時点ではわからないことが多いです。科目が難しい場合実際に課題に取り組んでみて、「あぁ、この科目このペースじゃ無理だわ...諦めよう」となりますが、そのころには履修登録期間は終わっていたりします。

あとこれは通信制に関わらず言えることですが、試験の成績となると知り合いの先輩や友達から過去問の情報を貰えるかどうかで大きく結果が変わってしまいます。通信制の場合当然ですが、部活やサークル活動で他の学生と連絡を取り合う機会はないので基本的には自力でしっかりと勉強しなければいけません。このこと自体は良いことかもしれませんが。

ちなみに単位の修得ができずに終わった科目が6科目もありそれらを除くとGPAは2.7程度になる計算になるので、それなりに勉強は頑張ったけど、成績はまぁまぁという結果です。GPAを気にする人は履修科目について情報取集と選択に気をつけた上できちんと勉強すればGPA 3は無理な数字ではないような気がします。

最終成績は以下のようになりました。

最終成績

おおむねAが多かったですが、理解が浅い科目やとりあえず単位が取れればいいかなと思った科目はBが多いです。
Cになった科目は勉強をさぼったというより勉強の量に比例して理解が深まらなかったという印象があります。

逆にSを取った科目についてはめっちゃ勉強したかというとそうではなく、むしろ全然勉強していません。プログラミング1~プログラミング4については課題をこなす以外の勉強時間は合計2~3時間程度しかかけていなかったと思います。

評価として、頑張らなくてもSが取れたり、めっちゃ頑張ってもCにしかならなかったりすることが往々にしてあるわけで、その点でもこのGPAという評価制度には強い疑問を感じます。

GPAという評価制度では、自分がよく知っている科目は評価が高くなりますが、よく知らない科目は逆に低くなりがちです。その基準自体は分かりやすくフェアな評価制度なのですが、一方でそもそも知らないことを知ろうとして大学に入ろうとするわけで、GPAが最初から高くなることが自明であれば、必ずしも大学で学ぶ必要もないような気がします。

他の学生の方との交流

他の学生の皆さんとの交流という点では、1~2年次の科目でスクーリング(対面式)の授業があり板橋のキャンパスで授業を受ける機会があります。その際に知り合った他の学生の皆さんと履修登録や試験に関する情報交換をさせて貰っていました。
通信制は基本的に独学なので、モチベーション維持のためにも時々近況を話し合う仲間がいるというのは心強いものです。
スクーリング以外では、科目習得試験は全国各地の試験会場で年に4回実施されますのでその際にも他の学生の皆さんと会うことがあります。

苦労した点

勉強できる環境を作ることは勉強することよりも何倍も難しい

自分の意志で勉強しているとは言え、勉強し続けるのはなかなか大変でした。特に数学と電気系の勉強はつらかったです。
結婚して子供もいる自分の場合、「仕事」「家庭」「勉強」に並行して時間を使う必要があり、しかも1か月や2か月といった短期間ではなく数年単位でこの3つのバランスをうまくとり続けないと卒業できません。

実際、これはなかなか大変です。勉強する以前に、勉強する時間を確保する大変さは勉強自体の大変さ以上です。

また、家庭があると家事や育児もしなければなりませんし、子供達が小さいと家が騒がしくなるので落ち着いて勉強するのは難しいです。線形代数の宿題で、4次の行列式を展開している横で子供が大声で叫びだしたときは気が狂いそうになりました。

家庭の経済格差が学力格差になり、学力格差が経済格差になることはよく言われていますが、社会人の立場で勉強してみるとそのことがよく分かります。
勉強できる適切な環境(机と椅子と集中できる時間)がなければ腰を据えて勉強はできません。

入学したときは「勉強しておけばよかった」と後悔するのではなく、「したいと思ったときにすればいい」と考えていましたが、若いうちに勉強しておくに越したことはありませんね。

勉強できる環境を作ることは勉強することよりも何倍も難しい

は1つの真理として心にとどめておきたいと思います。

体重が増えた

卒業までは履修している科目の勉強が続きます。夜中に勉強をしているとおなかが減るので自然と間食をすることが多くなります。その成果、入学時から体重が10kg程増えました。在学中は運動する時間が取れませんでしたが、元々は体を動かすのが好きなのでこれから痩せる予定です。*3

どうやって辛い状況を乗り切るのか

上記のように社会人として仕事と家庭を持ちつつ勉強をするのはとても大変です。
辛い状況が続くとモチベーションを失いそうになりますが、モチベーションを失わずに勉強するために

得意そうな科目・簡単そうな科目の単位を確実に取る

を3年目の2020年からは意識していました。こうすることで試験を受けるたびに卒業までに必要な単位数が確実に減っていき、家族にも共有することで家族の理解も得られやすくなると思います。

元々の私の方針は

自分が知らない分野で、比較的すぐに知識が役に立ちそうな科目から勉強しよう

を方針として履修する科目を決めていましたが、難しい科目を選んでしまうと十分勉強時間が確保できなければ単位が修得できなくなってしまいます。
卒業には124単位の履修が必要で、私は2年次編入での入学で32単位を認定済みでした。なので実際に修得すべき単位は92単位になります。

修得できた単位の推移ですが、

年度 習得単位数
2018年 26単位
2019年 12単位
2020年 22単位
2021年 20単位
2022年 12単位

という推移になりました。2019年は仕事が忙しく単位があまりとれなかったため、2020年からは上記のように方針を見直すことにしました。

上記の推移を見て思うのは

  • 1年あたりに取れる単位は恐らく16~30未満
  • 2年編入の場合ストレートにいけば3年で卒業できるが、これは実際のところほぼ不可能
  • うまく履修を組んで、計画的にコツコツと頑張れば4年では卒業できる

という印象です。

いまいちだった点

大学について良かったこともありましたが、いまいちだなと思うこともそれなりにありました。いくつか感じたことを挙げておきたいと思います。

指定の教科書が書店で買えない

既に出版が終了し、書店で販売されていない本が教科書として指定されている科目がいくつかありました。
メルカリとかAmazonの中古販売では入手できたけど、やはり通常の書店で新品が買えないような書籍を教科書に指定するのはちょっとおかしいと思います。

既に授業の掲示板などでも学生側から指摘がちらほら上がっていましたが、中古販売に頼っていると状況を理解した転売屋の的にされる可能性もあり非常に良くないので、これは大学・教員の方には真剣に捉えて貰いたい問題です。

応用系の授業が時代に追従できていない

応用系の授業、特に変化の激しいWeb系の内容を扱う授業では内容が現実に追従できていませんでした。下手をするとその辺のプログラミングスクール以下の内容かもしれません。
頻繁に授業内容を見直すのは大変な作業だと思うので、大学でこういった応用的な内容を教えるのはかえって難しいんだろうなと思いました。やはり大学(特に学部教育)では基礎的な内容を重視するという方針が良いのではないかと思います。

学費や勉強にかかった費用について

大学で学ぶとなると気になるのは費用面についてですが、帝京大学通信制

  • 初年度(入学金・学費): 約 200,000円
  • 2年目以降(学費): 約 150,000円

になります。

また学費以外にかかる費用ですが、

  • スクーリングを受ける際の交通費・宿泊費

これは関東の方は無視できるかと思います。

  • 教科書・参考書: 年間約 約20,000~40,000円

ということで、上記をどんぶり勘定で計算してみると卒業するまでの4年半で、80万円~100万円程度は費やしているのではないかと思います。

大学の雰囲気について

通信制なので、スクーリングの授業(2日程度)を除いて、大学に通うことは基本的にありません。
連絡事項は学生向けシステムのメッセージや掲示板を通してやり取りされます。
事務の方は基本的にはレスポンスが早く、質問に対しては比較的丁寧に対応してくださっていた印象があります。

教員の先生の印象はというと、おおむね丁寧に教えてくれる先生が多かったです。不明点について質問をすると土日であっても返信してくださる先生もいらっしゃいました。一方で小数ではありますが質問に対して高圧的に返答をする先生もいました。どの大学にも不親切・高圧的な先生はいるかと思いますが、通信制という学生の学習環境を踏まえると、この点はぜひ改善して欲しいと思います。

大学教育の将来について

通信制といっても基本的には独学で勉強になるので、私は教育系YouTuberの動画をかなりたくさん見ていました。分かりやすく説明してくれる動画も多く教育系YouTuberの皆さんにはとても感謝しています。どこかでこの記事とは別に勉強する際に閲覧したおすすめの動画の記事を書きたいと思います。

動画を見て勉強して思うのは、質の高い教育コンテンツがYouTubeのような動画配信サービスから溢れてきたとき、物理的な大学の存在はどうなっていくのかということです。

高価な実験器具などが必要になる学部・学科を除けば、大学で学ぶ知識は基本的に世界中どこにいても学ぶことができますので大学に行って席に座って講義を受けること自体の価値というのはどんどん下がっています。

今後重要になってくる大学の付加価値というのは、学生同士や先生との人間関係・人脈であったり、学びたい内容について対話・就職のサポートといったところになってくると思います。

学生や社会に向けた付加価値をどうやって提供し続けるのか、「大学 vs 教育コンテンツの戦い」 は既に始まっているので、今後世界の教育の在り方がどう変わっていくのかはとても気になります。

まとめ

色々と書いてみましたが、時間をかけてコンピュータサイエンスについて体系的に学べたことはおおむね満足しています。
勉強したことがすぐに役に立ったり直接的な結果として現れることはないかもしれませんが、社会人になってから時間をかけてひとつのことをやり切るというのはなかなかないことなので自信にもつながりました。

これからどうするのか

とりあえず勉強に使っていた時間が自由に使えるので、仕事をしつつ自分の好きなコードを書いたり、ブログの更新などぼちぼちとやっていきたいと思います。
あと英会話の勉強に真面目に取り組めたらと考えています。

元々フリーのソフトウェアエンジニアとして仕事をしていますが、理工学部を卒業したところですので、どこかよい会社があれば就職してもよいかなとぼんやり考えています。お仕事のお話があれば声をかけて頂けると幸いです。

追記

在学中によく見た教育系YouTuberの動画や書籍などについてまとめてみました。
mcommit.hatenadiary.com

*1:でも微分積分2の単位を取れていないので偏微分をちゃんと勉強できていない

*2:最終的に電子回路は単位は取らずに卒業してしまいましたが

*3:でも、生活習慣が少し変わってしまったので苦労しています

C/C++ 用のコードカバレッジツールを作ってみた

タイトルの通り C/C++言語で使えるコードカバレッジツールを作ってみました。
x86_64 GNU/Linux 向けのバイナリと動作確認のサンプル用シェルスクリプトGithubで公開しています。

github.com

このコードカバレッジツールは covme という名称のシングルバイナリのプログラムです。機能的にはまだまだ充実していなくて、現時点では実用性は低いのですが、簡単なプログラムであればC0レベルのカバレッジを取ることができ、結果をHTMLファイルとして出力します。

covme動作イメージ
covme demo

使い方について

詳しくはレポジトリのREADME(日本語)に書きましたが、ダウンロードして


$ ./covme 計測したいプログラム名

のように実行して頂くと引数で指定したプログラムのカバレッジ計測ができます。

いくつか動作確認用のスクリプトを同梱しており、 00_build_examples.sh から 04_try_simple_cpp_example.sh まで順番に実行して頂けると雰囲気を理解して頂けるのではないかと思います。

計測の精度・機能性についてですが、I/Oを伴うプログラムだとうまく動作しない可能性があります。(ターゲットプログラムによってはフリーズしてしまうかもしれません...ごめんなさい)
今後も継続して機能を追加・改善していきたいので、バグレポートや要望など頂けると嬉しいです。

どうやってカバレッジを計測しているのか?

GDBの利用

covme ではカバレッジを計測したいプログラムをターゲットプログラム(デバッギ)として gdb を起動しています。

covmeのプロセス構成
covmeのプロセス構成

gdb によりターゲットプログラムをステップ実行することでどのコードが実行されたかを記録しています。

要するに

IDE でデバッガを起動し、ステップ実行のボタンを押してはどの行に止まったかをメモする」

をひたすら繰り返すことによりカバレッジ計測を行っています。

伝統的な日本企業のソフトウェア開発では、Excel シートにソースコードを張り付けて、プログラムを1行1行ステップ実行し、Exccel シートの実行できた行に印をつけるという、地下帝国の労働のようなことが現実に行われていることがあります。この手の作業を自動化してくれるようなツールと思って頂ければよいかと思います。

ちなみにこのような話を口裂け女のような都市伝説と思っている方がいらっしゃるかもしれませんが、実際に私自身も何度かそのような仕事をしたことがあります。(当時ギャンブルで破産していた私は、メモリ 4GB の Intel Celeron のパソコンで作業させられ給料はペリカで支払われていました。)

DWARFの利用

gdb を使ってデバッガを1行1行ステップ実行させるだけではコードカバレッジを取ることはできなくて、コードカバレッジを取るためには、例えば

  1. ソースコードのうち、ある関数は何行目から何行目までなのか?
  2. ブレークポイントで止まったアドレスはソースコードの何行目なのか?

といった情報が必要になります。

1に関しては「構文解析ツールを自作する」「llvm を利用する」というアプローチも考えてみましたが、よくよく考えるとビルド時のコンパイラの解析結果と一致しないとうまく機能しない可能性があります。

2に関しても、ファイル名と行番号の情報はGDBのレスポンスに含まれているのですが、ソースコードのパスは含まれていませんので、同じファイル名のファイルが複数あるとどのファイルの関数なのかが特定できないという欠点があります。

ということで、 ビルド時にデバッグ情報をつけるという制約を設ける(具体的には -g オプションをつけてビルドしてもらう)ことにしてバイナリに含まれるDWARF形式のデバッグ情報を解析することで、カバレッジに必要な情報を得ることにしました。
セクションとしては .debug_aranges, .debug_info, .debug_abbrev, .debug_line といったセクションの情報を解析しています。お陰でDWARFを読むことができるようになりましたので、機会があればDWARFの読み方についてブログの記事やどこか勉強会の場などで発表させて頂きたいなぁと思います。

動機

C/C++ 言語用のコードカバレッジツールがあまりない

そもそも、なんでこんなものをつくったかというと、シンプルに C/C++ のフリーのコードカバレッジツールが欲しいからでした。
C/C++ 言語用のコードカバレッジツールは世の中にあるにはありますが、有償かつ高額だったりするので気軽に手が出せないというのが現状かと思います。

フリーのC/C++言語のアプリケーションのコードカバレッジ用ソフトとしては gcov が挙げられます。gcov は便利なのですがいくつかデメリットがあります。

  • gccでないと使えない
  • gcc と gcov のバージョンで互換性がないバージョンがある
  • Unix/Linux 環境以外で使えない
  • C2カバレッジが取れない

というデメリットがあります。

組み込みソフトウェアの開発で CI/CD したい

長期的な目標としてはこちらの理由が大きな理由です。

長年自分がやりたいと思っていることの一つに組み込みソフトウェアでのテストの自動化があります。
ソフトウェアのテストとその自動化は、近年のアプリケーションの開発では当たり前のように行われつつあるといってよいかと思います。
かつてはテストが難しいとされていたフロントエンドの領域ですら Selenium や puppeteer といったブラウザを制御するためのソフトを使ってテストが行われるようになってきており、今後もこの傾向は強くなると考えられます。

しかしながら、組み込みソフトウェアのテストとその自動化は他のソフトウェア開発の分野と比べてあまり進歩していません。

これにはいくつか克服が難しい理由がありますが、コスト的な理由として

  1. ターゲットボード上で動作するプログラムをトレースをするためのハード・ソフトが非常に高価
  2. C/C++言語のアプリケーションの品質測定(静的解析・動的解析・カバレッジ計測...etc)のためのソフトウェアは少なく、高価であることが多い

の2つがあるかと思います。自作のツールでこの2つの要因を解決したいと思い コードカバレッジツールを書き始めました。

covme で実現したいこと

gcov は上記のようにUnix/Linux系OS以外の環境での利用ができません。

組込ソフトウェア開発でもLinuxが利用されることが多くなってきましたが、全ての機器がそのようなリッチなCPU/OSを使って開発されているわけではありません。IoT機器のようにインターネットに接続するような機器であってもOSレスやRTOSなどを使って開発されていることが多いです。

そしてIoT機器のようにネットワークに接続する機器にとって品質を担保する重要性は、サイバー攻撃の脅威に対応する」という観点からも高くなっていると言ってよいかと思いますが、にもかかわらずそういった組み込みソフトウェアの品質を担保するための敷居は高く、人命にかかわるようなクリティカルな製品の開発を除いては、実際の品質担保が置いてけぼりになっているのが組み込みソフトウェア開発の現状と言えます。

covme はそういった組み込みソフトウェア開発における品質担保に使えるレベルにしたいと思います。

どうやってやるのさ?

組み込みソフト開発でのホスト環境とターゲットボードの関係は以下のような構成になっています。

組み込みソフトウェア開発の構成
組み込みソフト開発の構成

この構成のうち、JTAG・デバッガに関してはある程度低価格で入手できるようになってきていますが、動的解析やコードカバレッジの計測を行おうとすると「開発環境(IDE)」「JTAG・デバッガ」の部分のソフト・ハードにそれ相当の機能を持った製品を導入する必要があり、これにはそれなりのコストをかける必要があります。

ところで、このJTAG・デバッガ」との通信ですが、最終的にはGDBプロトコルで扱われることが多いようです。具体的には GDB Server がホスト環境上に存在しており、この GDB Server と 適切な通信をすることで ターゲットボード上で動作するプログラムのコードカバレッジを取ることが実現できると考えています。

そして、組み込み開発で使われる商用コンパイラにおいてもデバッグ情報はDWARF形式で出力されていることが多いという点も covme でのアプローチにはメリットになります。ちなみに、DWARF 以外のデバッグ情報の形式としてマイクロソフトPDB がありますが、PDB 形式に関する情報も多少は世に出ているようですので必要があればサポートしたいと考えています。

ソースコードについて

covme は go言語で書いてみましたが、私は go初心者ということもあり現状ではソースが雑な状態なので今のところバイナリを公開しています。
あと、コードカバレッジツールはビジネスの世界にも関わる面もあるので、コードは少し寝かしておいてもよいのではという気持ちもちょっとあります。

まとめ・今後について

現在公開している covme は x86_64 GNU/Linux 専用になっています。始めたばかりのプロジェクトなので性能的な改善や機能の追加は十分にあり、x86_64 向けの機能も充実させていきたいですが、並行して ARMv7-M あたりをターゲットとしたバージョンも作っていければと思います。

追記

こちらのコードカバレッジツールについてKernel/VM探検隊online part5 で発表させて頂きました。
5:45あたりからが私の発表になります。

www.youtube.com