プログラミング言語Cはおぞましい。いや、素晴らしくもある、もちろん。私たちの住む世界の大部分はCの上に作られている。そしてほとんどのコンピュータープログラミングの基礎をなしている、歴史的にも、実質的にも。Xavier Nielの革新的な “42” スクールのカリキュラムが、学生に標準Cライブラリー関数を一から書き直させることから始まるのはそれが理由だ。しかしCは、C自身が作り上げたこの世界にとってもはやふさわしくない。
「おぞましい」と言ったのは「悪い」ということではなく「畏敬の念を起こさせる怖さ」という意味だ。Cはモンスターになってしまった。あまりに多くの大砲を与えたためにユーザーは自分の足を撃ち抜いてしまう。豊富な体験が教えるところによると、セキュリティーホールにむしばまれることなく大量のCコードを書くことは非常に困難であり「事実上不可能」になりつつある。2年前、私は最初の「Cに死を[Death To C]」の記事にこう書いた:
原理上、ソフトウェアが成長し進化して成熟度を増すほど、セキュリティー脆弱性は複雑になっていく。しかし、C/C++で書かれたソフトウェアにそれは当てはまらない。バッファーオーバーフローや宙ぶらりんのポインターのために壊滅的セキュリティーホールが生まれる事態は、繰り返し繰り返し起こっていて、昔も今も変わることがない。
私たちはこれ以上巨大な口を開けたセキュリティーの盲点を放っておくことはできない。引退して別の言語に取って代わられる時期はとうに過ぎている。問題なのは、ほとんどの近代言語はCを置き換えようという意欲すら持っていないことだ。〈中略〉どの言語もCが最も得意とすることに長けていない ―― 例えばシステムの奥深くまで掘り下げてマッハスピードで動くこと。
あなたがデベロッパーなら、私の言いたいことはもちろんわかっているだろう。Rustの長所を並べることだ。実際これは有望なC/C++の後継だ。2年前に私は、新規の下層レベルコーディングをCではなくRustで書くことを勧めた。つまるところ、穴に関して何よりも大切なのは、掘るのをやめることだ。
[Cでプログラミングする際のセキュリティー心得(2017年版):
1)タイプするのをやめる
2)すでにタイプしたものを削除する]
今私は、エンジニアが既存のCコードをリファクタリングするとき、特にパーサーなどの入力ハンドラーを書き直すとき ―― ゆっくりと、すこしずつ ―― Rustで置き換えるように真剣に勧めている。
何か行動を起こす必要がある。自分たちのソフトウェア基盤を強固にしなくてはならない。それは、オペレーティングシステムやドライバー、ライブラリー、コマンドラインツール、サーバー等あらゆるものを修正するという意味だ。今すぐ、あるは来年までに直すことはできないかもしれないが、おそらく10年後には状況が改善されているだろう。
残念ながら、全部を書き換えることはできない。〈中略〉私が勧めるのはもっとずっと簡単なこと:弱い部分を手術で置き換え、プロジェクトの大部分はそのままにしておくことだ。〈中略〉既存プロジェクトからCコードの断片を取り出し、RustからアクセスできるようにCの構造体と関数をインポートし、コードをRustで書き直し、Rustから関数と構造体をエキスポートし、コンパイルしてプロジェクトのほかの部分とリンクすればよい。
Rustはもちろん万能薬ではないし、ソフトウェアの安定性とセキュリティーを改善する有効な方法はほかにもたくさんある(例えば形式検証[Formal verification]やLangsec構想など)。しかし、これは有望で価値ある反復アプローチであり、私たちはこの巨大なセキュリティーホールから自らの手で這い出すために、良いコードを書き良いツールを使うことをスコップ一杯ずつ反復していくことしかできない。掘り始めるのが早ければ早いほど、Cは早く風化していく。
[原文へ]
(翻訳:Nob Takahashi / facebook )