2017年03月01日

SOLIDの特徴である「開発環境と実行環境の一体化」とは?(連載第二回)

SOLID紹介記事の第二回目として、今回はSOLIDの特徴である「開発環境と実行環境一体化のメリット」と一体化により実現できた「アドレスサニタイザ」について、その機能や仕組みの解説も交えて紹介いたします。

開発環境と実行環境一体化のメリットとは?
iPhoneアプリは”Mac PCと統合開発環境であるXcode”が、Windowsアプリは”Windows PCとVisual Studio” さえあれば、ソフトのコーディング、コンパイルからデバッグまで一連の作業が行える、シンプルで応用的な開発環境になっていると思います。
一方で組込ソフト開発現場では、統合開発環境、コンパイラ、OS,デバッガといったツール類は、各々高機能化が進んでいるものの、その豊富な(複雑な!)機能を使いこなすためには単にツールを揃えただけでは不十分です。むしろ高機能になりすぎて、ツールの組み合わせに制約が生じてしまう等、シンプル化とは反対方向に進んでいるのかもしれません。

「組込開発向けでもシンプルで気の利いた開発環境が作れないか?」

シンプルな開発環境とは、実行環境を想定したOSカーネルやBSPの情報がツール間で連携し、開発作業をスムーズにアシストするものでなければいけません。でもそれだけでは、まだ今までの延長線上です。

「組込システムの開発環境にも新しい進化、もっと新しい体験ができないか?」

例えば、KMCが以前から注目しているLLVM/Clangコンパイラは、プログラムの静的解析や不具合の自動検出が実現できる仕組みを備えた先進的なツールです。iPhoneアプリ開発だと、ClangコンパイラとiOSとXcodeが連携していて、このような解析機能が使えます。ところが、組み込み開発にClangコンパイラを使ったとしても、この解析機能を実現するにはユーザプログラム側に解析用のランタイムを組み込んだり、開発環境側に問題レポート機能を用意する必要があり、コンパイラだけ用意しても簡単にはこれらの機能を使う事が出来ません。
実行宇環境と開発環境の密結合
しかし、この解析用のランタイムや開発環境向けに専用の機能を僕たちで作り込めば、そして、それをOS、BSP含めて一体的な開発環境として作り込めば、シンプルで先進的な開発体験を提供できるかもしれない、とあるときに気がつきました。そして、少々大げさですが、これがツール屋に課せられた使命なのかもしれない・・・と。

もちろん、単に機能を繋ぎ合わせるだけではなく、徹底した高速応答性や、直感的に操作できるような分かりやすさにもこだわりました。そこはKMCなので。

SOLIDで特徴的なアドレスサニタイザってどんなもの?
Clangコンパイラには、有名なアドレスサニタイザ、という機能があります。これはC言語(C++/Objective-C)プログラムにおいて、不正なメモリアクセスを、専用のハードウェアを使わず、ソフトウェアだけで検出する機能です。スタック破壊、オーバーラン、メモリリークなどを、プログラマが問題のある箇所を検討することなく、実行するだけで自動的にあぶり出し検出してくれます。一見問題ない隠れた不正メモリアクセスバグも、そのパスを実行すると検出します。

たとえば、次のようにバグを含むコードだと。。。。
void root_task(intptr_t exinf)
{
	int            i;
	char	        buf[10];                        // 10個のバイト配列
	ER           ercd;

	syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_INFO));

	for (i = 0; i <=10; i++) {               // <= 10なので、11回のループ実行
		buf[i] = i;
	}
buf[]は10バイトの配列なのですが、ループが11回まわってしまい、隣の領域を破壊してしまっています。しかし、破壊した先が、その時点で実害がなければ、特に異常はみられずにスルーされてしまう、いわゆる"隠れたバグ"になります。
アドレスサニタイザモードで実行すると、この11個目の不正なメモリアクセスを即時に検出します。今回に僕たちが用意したSOLID-IDEでは、検出時に以下のような表示になります(図をクリックして拡大してください)。
アドレスサニタイザ発動
今回KMCでは、SOLIDのアドレスサニタイザを実現するために、RTOS用の専用検出ランタイムの開発、問題を検出したときのIDEデバッガへのレポート表示機能などを新規に開発しました。おそらくですが、ベアメタルやRTOS環境としては、世界で初めてClangコンパイラのアドレスサニタイザを実現できたとのでは、と思っています(たぶん、、、、です)。

SOLID-IDEでアドレスサニタイザが動作する様子(youtube動画)

SOLIDの一体化でアドレスサニタイザを実現
このアドレスサニタイザですが、コンパイラがチェックするべき内容を決定し、専用のランタイムで検出を行い、そして専用の開発環境に問題をレポートする、ようするにOS、コンパイラ、デバッガ、IDEが一体化し連携して始めて使いやすく実現できる機能なのです。それぞれの各ツールやランタイムが以下の役割を果たしています。

 1.コンパイラ
  コンパイル時にアクセス可能・不可能なメモリ領域の情報やチェックするべき箇所を生成
 2.IDE-ビルダー
  アドレスサニタイザ実行支援ランタイムライブラリや、支援memcpy関数などを自動リンク
 3.アドレスサニタイザ支援ランタイムライブラリ
  チェック箇所実行時に、コンパイラが出力した情報を元にアクセス正当性をチェック
  違反アクセスなら、レポート
 4.デバッガ
  違反アクセス時のレポート表示など

このように、開発ツールや実行ランタイムが密接に連携することで、はじめて簡単にアドレスサニタイザを使えるようになります。これがSOLIDの目指す、開発環境と実行環境の一体化による、開発支援機能の進化、のひとつです。このアドレスサニタイザの他に、デバッグ・テスト支援機能を中心に、一体化で実現できる新しく進化した機能を色々予定しています。SOLIDは開発環境と実行環境を一体化し、それを生かしてソフトウェア開発プラットフォームとして進化を続けようと思っています。


次回は、SOLID-OSとして採用したTOPPERS/ASP3の特徴や、SOLIDを構成する他のツールとどのように連携しているかなど、OSを中心に紹介する予定です。


トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード