BT

Checked C - Microsoftによる,より安全なC/C++

| 作者: Abel Avram フォローする 7 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2016年7月27日. 推定読書時間: 3 分 |

原文(投稿日:2016/06/16)へのリンク

MicrosoftがChecked Cをオープンソースとして公開した。CとC++言語への境界チェック導入を目的とした研究プロジェクトだ。

CとC++の重大な脆弱性のひとつとして,メモリの範囲外アクセスの実行可能性がある。NIST(National Vulnerability Database)によれば,2010年から2015年に米国で発生したセキュリティ上の脆弱性の16%は,バッファオーバーフローを原因とするものだった。さらに,システムソフトウェア(オペレーティングシステム,データベース,コンパイラ,インタプリタ,ブラウザなど)のほとんどがこの2言語で記述されていることから,現存するシステムの大半には,個人情報の搾取やシステム乗っ取りを目的とした攻撃や誤動作の対象となり得るメモリ破損の可能性がある,ということになる。Microsoftとメリーランド大学の研究者グループは,Cの拡張とC++のサブセットとして,これらの言語に境界チェックを導入したChecked Cを提案することにより,これらの問題に対処しようとしている。

自動境界チェックを備えたJavaやC#などの最近の言語とは異なり,C言語にこのような機能を追加するのは簡単ではない – こう説明するのは,プロジェクトに参加しているMicrosoftの研究者のひとりであるDavid Tarditi氏だ。

C言語への境界チェックの導入には2つの問題点があります。そのひとつは,実行時に境界をどこに置くべきかが明確でないことです。ふたつめは,パフォーマンスを重視するプログラムにおいて,効率的な境界チェックを行なう方法が自明ではない点です。Cのポインタ型と配列すべてに境界情報を持たせるような変更は,現実的なソリューションとして十分ではありません。C言語が使用されるシステム基盤では,ハードウェアや標準によってデータ構造が変更不可能な場合も少なくないのです。Cプログラムは既存のオペレーティングシステムや,特定のデータレイアウトを必要とするソフトウェアとも相互運用できなくてはなりません。

Checked Cを使えば,C/C++による“境界チェックの保証された”コードの記述が可能になる。これを実現するためにChecked Cでは,コンパイル時と実行時に両方ともチェックされるような,新しいポインタと配列型が導入されている。

  • ptr<T> – 境界チェックを必要としない型Tへのポインタ。このポインタには,ポインタ演算を行なうことはできない。また,メモリアクセス時にnullであってはならない。ほとんどのポインタはこのタイプであると想定される。
  • array_ptr<T> – 型Tの値を含む配列要素へのポインタ。このポインタは,算術演算に含めることができる。メモリの参照あるいは更新時にnullであってはならない。境界チェックの責任はプログラマに委ねられる。
  • span<T> – 境界情報を持つポインタ。算術演算をサポートする。メモリの参照あるいは更新時にnullであってはならない。
  • T array_var checked[100] – 型Tとサイズ100を宣言した配列で,境界チェックの対象となる。C言語の変換規則によってarray_ptrに変換される。

仕様では間接参照や配列参照,代入,加算,比較,address-of(&),checked配列型からポインタ型への変換など,ポインタ型に関するさまざまな操作に対する振る舞いを規定している。

既存のコードを棄損しないように*はチェックされず,ポインタの算術演算も認められているので,従来のCプログラムは“これまでどおり(as is)”動作する。ただし仕様では,*の使用に対して,警告あるいはエラーを報告するオプションをコンパイラに追加するように求めている。

今回GitHub上でオープンソースとして提供されるのは,Checked Cの仕様およびclangでの実装LLVMでの実装である。プロジェクトに関心を持った開発者による仕様改善,型変換やメモリ管理に関する新機能の提案,テストの追加,Checked Cをサポートするコンパイラの拡充などのコントリビューションが期待されている。

C言語に境界チェックを導入する試みとしては過去にも,静的解析の利用,言語の変更を伴わないコンパイラやランタイムの拡張,プログラム検証,C言語ベースの新言語などがあった。仕様書の9章“Related Work”には,これらアプローチの詳細と,著者らが言語拡張を選択した理由が説明されている。

 
 

この記事を評価

関連性
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT