FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Microsoftの開発したC言語拡張「Checked-C」とは何なのか

f:id:msyksphinz:20160520003556j:plain

Microsoftが、C言語を拡張した独自言語「Checked-C」の仕様をオープンソース化した。

developers.srad.jp

Checked CはC言語にポインタの境界チェック機能を追加したことが名前の由来となっている。チェックに対応する新しい種類の配列型やポインタ型が追加されており、スコープを指定してチェックを強制することもできる。

何故Microsoftが、このような言語拡張を開発したのかはちょっと想像できない。C++の機能改善や機能拡張により、バッファオーバフローをなるべく早く検出したり、valgrindなどの様々なソフトウェアを拡張することで、独自言語を作るまでもなくその機能を補うことはできるように思うが、そこは内部の事情があるのだろうか。

それにしても、開発効率を上げるためなら言語から作り上げるというのは、AppleのSwift、GoogleのGoと言い、かなり重要なテーマなのだろうか。

Checked-Cの仕様書を手に入れる

Checked-Cは、LaTeXソースコードとして配布されている。

github.com

Linuxの環境でリポジトリをチェックアウトして、ビルドしてみよう。

# UbuntuにてLaTeXのインストール
sudo apt-get install texlive-lang-cjk  
sudo aptitude install texlive-latex-extra

git clone https://github.com/Microsoft/checkedc.git
cd checkedc/
make

これで、checkedc.pdfが生成される。

f:id:msyksphinz:20160622010317p:plain

最初のイントロダクションを読んだだけだが、大きな特徴としてはやはりポインタだ。C言語のポインタ*以外に、3種類のポインタを導入する。境界チェックの必要ないptr型、ポインタの算術演算が可能な配列array_ptr、動的に境界が変動するspan型を導入する。

checked修飾子を付けた配列を導入する。例えば、

int a checked[10];

は、配列を参照した際に常に境界チェックが行われる。

void add(int a checked[2][2], int b checked[2][2])
{
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      a[i][j] += b[i][j];
    }
  }
}