BLOGTIMES
2017/06/19

境界チェックがある C 言語拡張「Checked C」

  c  microsoft 
このエントリーをはてなブックマークに追加

C 言語に配列の境界チェックを追加した Microsoft/checked というプロジェクトを見つけたのでメモ。リポジトリ名を見ると分かるとおり、マイクロソフトのプロジェクトで、提案されているのは仕様だけで、実装についてはコンパイラごとになっているようです。

C には境界チェックがないので、気づかないうちに配列の添字が有効範囲からはみ出していたということは、プログラマーであれば誰しも経験があるはずです。また、配列が境界情報を持っていないので、例えば int strncmp(const char *s1, const char *s2, size_t n) のように、配列の長さを表す size_t が至る所で出てきます。この Checked C は互換性を確保しつつ、必要な部分だけに動的に境界チェックができるようにするというのが目的となっています。

Checked C - Microsoft Research

Many programming languages already have bounds checking. C# and Java are examples of such languages. However, those languages automatically add the information needed for bounds checking to data structures. This is a problem for system software, where the programmer needs precise control over what a program is doing. In Checked C, the programmer controls the placement of information needed for bounds-checking and how the information flows through the program, so the programmer retains precise control over what a program is doing.

新しい機構としては * の代わりに以下の3つを使ってプログラミングをすることになります。

  • ptr<T> : T型のポインタ。アドレスの演算できない。
  • array ptr<T>: 配列用ののポインタ。ポインタ演算できるが、境界情報を与えると境界チェックがされる。
  • span<T>: 境界情報を動的に運ぶポインタ。

この中では span<T> が一番特徴的で、以下のような感じで境界情報を取り出すことができるようになります。
これがあれば、関数のかなりの部分から size_t を取り除くことができそうな感じです。

int x[10] span<int> p = x; // p.current = x; p.lower_bound = x; p.upper_bound = x + 10;

こういう機構が標準に取り込まれてくれるといいんですけどね。。。。。。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/9418
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン