コラム3.  C言語の規格

K&RのC言語

一口にC言語といっても、実に様々な企画が存在します。そもそもC言語が開発されたのが1972年ですが、標準らしきものが最初にできたのが、1978年に出版されたリッチーとカーニハンの共著である「The C Programming Language」からです。

このころは、C言語の厳密な企画のようなものは存在せず、しばらくの間はこの本の中で用いられてる表記を基にして、C言語の仕様が出来上がってきました。

C89

しかし、その後互換性のない処理系が存在するなどの問題が発生するようになったことから、C言語の標準規格が作られるようになりました。それが、1990年に発表された、「C89」という規格です。この規格は、様々な国際規格を制定しているISOと、米国規格協会、ANSIによってまとめられました。この企画が、「ANSI-C」と呼ばれる規格で、それ以前のものを、「K&R」と呼び、同じC言語でも、明確に区別をしています。

この規格は極めて完成度が高いもので、その後10年間、変化がありませんでした。また、日本でもこの企画がJISの規格として採用されました。なお、このサイトも、「C89」を基準にしています。

C99

その後、1999年に、「C99」という企画が発表されました。この企画により、それ以前は処理系により、実装の有無に違いのあった、行コメント「//」が、正式にC言語のコメントとして使用されるようになりました。

そのほかに、C99言語には、以下のような特徴があります。

この他にも、bool型が加わるなどの様々な改良がくわえられました。bool型は、「真(true)」か「偽(false)」かを表す型であり、現在主要なプログラミング言語では、ほぼ例外なく用いられている型ですが、C言語にはもともとなく、様々なほうほうで代用されていましたが、こういった型がC言語にも導入されるようになったということは画期的な変化だと言えるでしょう。

現在のところ、まだ一部のCの処理系でこの企画が完全に実装されていないといったこともあり、そういった仕様はまだ本格的には使われていないのが現状です。

C11

そののち、C言語の仕様にさらに大きな変化がおこります。それが、「C11」の登場です。

なお、C言語に関する最新の使用は、「C2011」もしくは、「C11」と表記される2011年に制定されたもので、その大きな特徴の一つに「脆弱性への対応」があります。

ではその「脆弱性」とは何でしょう?実は、C言語には大きな欠点があります。それが、バッファオーバーフローと呼ばれるものです。バッファオーバーフローとは、プログラムで用意してあるバッファの大きさを超えるデータが送り込まれ、データが溢れることである。 また、データを溢れさせることで、システムに誤動作を起こしたり、悪意のあるプログラムを実行することを指します。

現在、クラッカーなどによって行われるコンピュータへの攻撃の一つである、バッファオーバーフロー攻撃は、実行中のプログラムのメモリ内に攻撃者の手による機械語プログラムが送り込まれて実行され、最悪の場合、コンピュータ全体の制御が奪われることになります。

実は従来のC言語はこういったバッファオーバーフロー攻撃に弱いという特徴があったのです。これに対処をしたのが、C11だったのです。

C99でもsnprintf関数の導入など、バッファオーバーフローへの対策は入っていましたが、本格的な対策を行ったのはC11からといえるでしょう。

C11ではgets関数の削除や、printf関数における「%n」書式の廃止、fopen関数への排他モードの追加など、さまざまな脆弱性対応が導入されています。そのため、「C11」は私たちが現在「C言語」と言っている言語とはずいぶんと形が変わっているといえるでしょう。