ちゃっぴの監禁部屋

ガチガチに締めすぎて動きがとれなくなる。。。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  405  : 記事  5  : コメント  12059  : トラックバック  134

ニュース

記事カテゴリ

書庫

日記カテゴリ

Communities

Personal Information

わんくま同盟 横浜勉強会 #1 で話題に上ったこと。

ちゃんと理解していないオイラが書くのもなんですが、やっぱり将来性がないと思う。
# 御大すみません。

多くの人が C/C++ は複雑すぎるというのが理由としてあげていましたが、もっと深刻な問題として security の問題があると思います。

多くの人がご存じのとおり、C/C++ で coding すると buffer overflow の問題を避けて通れません。このことを完璧に理解して、かつ対策を完璧に実践できるのであれば問題はありませんが、この手の問題に完璧はありません。

このことは現時点で最も脆弱性に気を使っていると思われる Microsoft でも脆弱性が無くならないことが証明していると思われます。

知らない人も結構いるでしょうけど、MicrosoftTrustworthy Computing の一環として SDL: Security Development Lifecycle を取り入れていますので、現状では security に関して一歩先に進んでいます。それでも、ご存知のとおり深刻な脆弱性は無くなっていません。
# Check-in するときに security に問題のある code を弾くことをやっているのはすごいですね。
# ぜひ、一般でも扱えるように展開してもらいたいものです。

私は基本的に software を開発する立場ではなく、software を扱う立場ですが、意識の差はあるにしろ少しでも脆弱性が少ない software を扱いたいというのは software を扱う者の共通した願望でしょう。

ということで、performance や機能の問題で C/C++ が必須とされる場合を除き、C#, VB, JAVA 等の memory 管理を自動で勝手にやってくれる言語で書いて欲しいと思っています。

ぶっちゃけ、C/C++ で全く脆弱性の存在しない code を書くのは非常に難しいです。ということで、C/C++ で書くのは本当にどうしようもない場合に限って欲しいなぁというのが願望です。

間違っても、programmer 一年目のど素人とかには絶対に手を出して欲しくないです。扱うなら下記を熟読し、完璧に理解した上で数年みっちり修業し、しかるべき code review を実施した上で release して欲しいものです。

C/C++ 扱う上で気にしなければならない security の問題点が説明されています。また、software の内部動作を理解する上でも役に立つでしょう。

Windows platform を扱うなら絶対に読んで欲しい本。Coding の問題点を指摘する書籍は他にもいろいろありますが、coding 以外の設計等で脆弱性を局所化することを説明している書籍は少ないのでぜひ一読すべき。
# ただし、個人的にはちょっと問題に思える部分があるので鵜呑みにしない方がいいと思われます。もっとも、それを差し引いても概念を理解するためには非常に役立ちます。

投稿日時 : 2008年8月31日 23:16

コメント

# re: C/C++ の将来性 2008/08/31 23:58 アキラ
C++はシステム言語なので、なくなることはありません。
近年では、ようやく開発言語がCからC++に移っているところもあります。

セキュリティのためにメモリ管理を自動で行う言語を推奨する、というのもどうなんでしょうねぇ。
Cはともかく、C++にはRAIIがありますし、ライブラリベンダがメモリ管理を自動で行うライブラリを提供すれば済む話です。
それは言語の問題ではないでしょう。
実際、C++プログラマにはGCよりもRAIIを好む人がいます。

メモリ以外のリソースを扱う場合、スコープを抜けたらCloseしたい、という処理を書く場合、C#では明示的にCloseを書くかusingを書かないといけませんよね。
これはリソースリーク(GCがそのうち解放するでしょうけど)が起こりえると言うことではないでしょうか。

ソフトウェア開発としてのC++と、言語としてのC++はもう少し分けて考えたほうが良いと思います。
もっと言えば、Windowsに特化した話からも離れて、コンピュータプログラミングという枠で考えたほうがいいと思います。
C++は特定のアプリケーションを組むための言語ではないですしね。

「Windowsでセキュアなコードを組むのに特化した開発では.NETを使いましょう」というのであれば納得できます。

# re: C/C++ の将来性 2008/09/01 0:20 アキラ
> 「Windowsでセキュアなコードを組むのに特化した開発では.NETを使いましょう」というのであれば納得できます。

あー、でもC++0xになればそうとも言えないですね。
より簡単で、より安全にプログラミングするための数々の言語拡張と、より強力な標準ライブラリが入るので。

あとはライブラリベンダが、より簡単でより安全にソフトウェア開発を行うライブラリを提供すればいいですね。

複雑すぎるという問題も、ぼくらが紹介したおすすめ書籍にはよりよい言語の学び方を示唆する本もあります。
(Cの前提知識を必要としないC++入門書である『Accelerated C++』とか)

# re: C/C++ の将来性 2008/09/01 0:20 ちゃっぴ
> C++はシステム言語なので、なくなることはありません。

このことに関しては同意です。また、software をきちんと理解するためには C/C++ を勉強しろ!また、さらには assembler を理解するべきだと思います。必要なら利用することは否定しません。

ただし、現状を鑑みるにど素人の programmer を投入しなければならない software 開発の現状を考えるとここら辺を意識して coding しなければならない C/C++ は正直将来性が無いと思います。

C/C++ をちゃんと扱うためにはものすごく深い知識と経験が必要だと思います。本当に必要とされる現場ではお願いですからど素人を投入しないでください。
# ぶっちゃけ、Microsoft が実践しているように投入する人員には数ヶ月 secuirty 教育を施して欲しいです。

> セキュリティのためにメモリ管理を自動で行う言語を推奨する、というのもどうなんでしょうねぇ。

少なくとも GC を採用している言語では、その基盤となる framework に buffer overflow の脆弱性が存在しない限り、それを意識する必要すら無いですよね。また、 framework に buffer overflow の脆弱性があったとしても、すぐに patch が release されますからそれを適用するだけで済みますよね?この違いは大きいと思いますがいかがでしょう?

> これはリソースリーク(GCがそのうち解放するでしょうけど)が起こりえると言うことではないでしょうか。

Resource leak と buffer overflow は別だと思います。
Resource leak することにより、DoS を食らうことはありますけど、code execution は発生しませんよね。この違いは大きい思いますがいかがでしょうか?

先にも書きましたが、現状の software 開発では本当にどうしようもない programmer が投入される場合が存在しています。理想論としては、そんな programmer 使うな!というのが正しいですが、そうも言っていられない場合が多いでしょう。そういう programmer を扱うならば、native API を直接 call しない限り buffer overflow が発生しない managed code を利用するべきというのは正しい選択ではないでしょうか?

# re: C/C++ の将来性 2008/09/01 0:24 シャノン
> ライブラリベンダがメモリ管理を自動で行うライブラリを提供すれば済む話です。

ちょっと本題を外れるかもしれませんが、そういうものを用意したとしても、C++ が C++ である限り、生ポインタはどこかで露出します。
C++ と同じコードを吐ける言語を一から設計したら、もうちょっとマシになるだろう部分というのは挙げることができると思います。
もっとも、それはどの言語でも同じでしょうけど。

> C++は特定のアプリケーションを組むための言語ではないですしね。
> 「Windowsでセキュアなコードを組むのに特化した開発では.NETを使いましょう」というのであれば納得できます。

うん?
いや、(横浜勉強会に出ていない俺が言うのもあれですが)やっぱり、C++ と C# では、気を配るべきことという点では C++ の方が多いと思いますよ。
それと、「セキュアなコードを組むのに特化した開発」って? 病院とか原子炉のシステムのことですか?
そういうことでないなら、何の開発であれ、セキュリティをないがしろにしていいことなどないと思います。
社内アプリで、攻撃者がそもそも標的にしないことをもって防御とするのでセキュリティはザルでもいいですよね、なんてことにはならないでしょう。

何より、最初に「システム言語なので」と言ってしまっている。
「C++ は特定のアプリを組むための言語ではない」と言いながら、「システムソフト(OS とかドライバとか)を組むための言語である」と半ば認めていませんか?
そして事実、そうなりつつある現状がありませんか?
確かに(今はまだ)C# で OS やドライバは作れません(Microsoft はやる気みたいですが)。
そういう意味では、確かに C++ では何でも作れて、C# では作れないものもある。
でも、だからといって C++ が万能言語ということではないし、何を作るにも最適ということでもない。

まぁ、C# が(Java はどうか知りませんが)ネイティブリソースとの相性が悪いというのには激しく同意します。
ただ、なんだか C++ は C# とは別次元の言語であるような感想を持ってしまいました。
あ、C++ が嫌いだとは言ってませんよ。念のため。

# re: C/C++ の将来性 2008/09/01 0:27 シャノン
> また、さらには assembler を理解するべきだと思います。

勘弁してください。
そこまでは要りません。
# 何を作るかにもよりますけど。一般的には。

> この違いは大きいと思いますがいかがでしょう?

大して違いません。違うと思いたくありません。

# re: C/C++ の将来性 2008/09/01 0:32 ちゃっぴ
>> この違いは大きいと思いますがいかがでしょう?
> 大して違いません。違うと思いたくありません。

そうですか?
まあ、DoS が生じると service が利用できなくなりますけど、それだけです。Code execution が発生するとそれこそその security context で可能なすべての処理を行うことができてしまいます。それによって生じる損失は、DoS に比べて遥かに大きいと思いますがいかがでしょうか?

# re: C/C++ の将来性 2008/09/01 0:37 シャノン
人事担当者の目の前に
「こっちのプログラマーはバッファオーバーフローを発生させるコードを書きます。
こっちのプログラマーはメモリリークを発生させるコードを書きます。
どっちを採用しますか?」
って2人連れて行ったら、どっちが採用されると思いますか?
ちゃっぴさんだったらどっちを採用しますか?
俺ならどっちも採用しません。

採用担当が技術に疎い人だと、「メモリリーク」っていう言葉は知っていても、「バッファオーバーフロー」っていう言葉は知らないか、その影響を知らなくて、前者を通してしまいそうな気もしますが。なんとなく。

# re: C/C++ の将来性 2008/09/01 0:46 ちゃっぴ
あ、二箇所あるのでこっちの方かな?

> 少なくとも GC を採用している言語では、その基盤となる framework に buffer overflow の脆弱性が存在しない限り、それを意識する必要すら無いですよね。また、 framework に buffer overflow の脆弱性があったとしても、すぐに patch が release されますからそれを適用するだけで済みますよね?この違いは大きいと思いますがいかがでしょう?

確かに問題である点は双方同じです。
ただし、その脆弱性を修正するのに applications の改修が必要か?という面で大きく違うと思っています。

一点目としては、ごく限られた applications を除き、application の自動更新機能を設けているのは少ないですよね?ということはすなわち、利用者が更新された applications を手動で適用しなければならないわけです。

で、自動更新機能が無い applications を手動で必ず適用する users ってどれだけいると思います?正直半数もいかないと思います。この現状を考えると大きく違うんじゃないかと思うわけです。

二点目としては applications の修正費用です。脆弱性が存在したとして、個々に対策を行うのは修正費用が正直馬鹿にならないと思います。

そういう意味で全然違うと思いますが、いかがでしょうか?

# re: C/C++ の将来性 2008/09/01 0:52 ちゃっぴ
> 人事担当者の目の前に
> 「こっちのプログラマーはバッファオーバーフローを発生させるコードを書きます。
> こっちのプログラマーはメモリリークを発生させるコードを書きます。
どっちを採用しますか?」
> って2人連れて行ったら、どっちが採用されると思いますか?
> ちゃっぴさんだったらどっちを採用しますか?
> 俺ならどっちも採用しません。

ええ、そこまで理解して採用するのであれば問題無いんですよ。
でも、現実はどうでしょう?Google とか Microsoft とか一部の企業を除きそのような採用 process を踏んでいるとは正直思えません。

やっぱり、現実を見る必要があると思います。
現状としては、費用面の折り合いでろくでもない programmer を扱わなきゃならない場合もあるでしょう。

そういった場合、想定していない code execution を招く C/C++ と managed code では大きく違うのではないでしょうか?

# re: C/C++ の将来性 2008/09/01 0:56 アキラ
> 現状を鑑みるにど素人の programmer を投入しなければならない software 開発の現状を考えると

開発体制や、採用する人間の問題でしょう。言語の問題とは言い切れないと思います。
素人でもお手軽に組む必要があるなら、状況に合わせて言語を選択すればいいでしょう。

「3日でまともなコード組めるようになれ」という話なら私もC++はおすすめはしませんよ。
(そういう状況では)

また、3日で覚えられない言語は将来性がない、というようなことが言えるのでしょうか。

> framework に buffer overflow の脆弱性があったとしても、すぐに patch が release されますから
それも言語の問題ですか~?
企業が提供してるフレームワークだから、でしょう。


> Resource leak と buffer overflow は別だと思います。
バッファオーバーフローに対する返信ではなく、「メモリ管理を自動に行う」に対する返信の付加情報のつもりです。


> C++ が C++ である限り、生ポインタはどこかで露出します。
スマートポインタという"選択肢"が用意されますし、極力ポインタを使用しないコードは書けます。

> C++ と C# では、気を配るべきことという点では C++ の方が多いと思いますよ。
C++がC#より簡単、とか気を配ることが少ないとは言ってないつもりです。


> 「セキュアなコードを組むのに特化した開発」って?
ちゃっぴさんの言う、メモリ管理を自動で行い、セキュリティに気を配ることがより少なく、安全であることが必要な開発です。

> 何の開発であれ、セキュリティをないがしろにしていいことなどないと思います。
ないがしろにしろ、とは言ってないです。
Windowsでの開発において、.NETがより安全にできるならそっち選択してもいいんじゃない、という意味です。
C++でも安全にすることはできますが、それに教育コストがかかるというのであれば、特定のターゲットの開発に特化した言語を選択しましょう、ということです。
> 「システムソフト(OS とかドライバとか)を組むための言語である」と半ば認めていませんか?
半ば、というか「OSやドライバも組むことができる言語」でしょう。

# re: C/C++ の将来性 2008/09/01 1:00 シャノン
> application の自動更新機能を設けているのは少ないですよね?

# 気を利かせたつもりでもうけたそんな機能が穴になったりしそうですけどね。

> 想定していない code execution を招く C/C++ と managed code では大きく違うのではないでしょうか?

ロン氏には同意します。って誰やねん。論旨です。
ただ、なんかね…「大きく」違うって書かれるたびに、「リソースリークなら起こしてもOK」って書いてあるような気がしてしまうんです。

# re: C/C++ の将来性 2008/09/01 1:05 NyaRuRu
>確かに(今はまだ)C# で OS やドライバは作れません(Microsoft はやる気みたいですが)。

「作れる」「作れない」の基準は何なのでしょうか?
実証例がひとつ存在するかどうかなら,現在公開されているSingularityで十分だと思うのですが.

# re: C/C++ の将来性 2008/09/01 1:08 NyaRuRu
>実証例がひとつ存在するかどうかなら,現在公開されているSingularityで十分だと思うのですが.

とはいえあれはSpec#を使っているのでC#では無いというのも正しいかも.

# re: C/C++ の将来性 2008/09/01 1:09 アキラ
抽象化された開発がしたいなら、そういうライブラリと、よりよい入門書があればいいと思うのですがどうなんでしょう。

# re: C/C++ の将来性 2008/09/01 1:09 シャノン
将来性という話を持ち出すと、純粋に技術的な話だけでなく、商業性も絡んでくるので面倒になりそうです。
が、どの言語が好きかなんてのは商売抜きの問題でしょう。
C++ や C# はたまたま(主に技術的でない理由によって)市場で受けたかもしれませんが、じゃあ Scala はどうです? Smalltalk は? Eiffel は? D は?
将来性があるって主張しますか?
なくたっていいじゃないですか、そんなもの。

> C++でも安全にすることはできますが、それに教育コストがかかるというのであれば、特定のターゲットの開発に特化した言語を選択しましょう、ということです。
> 半ば、というか「OSやドライバも組むことができる言語」でしょう。

C# は特化言語であると言いつつ、C++ が「OS やドライバに特化した言語」であるということは認めないのですね。
# Boost 作ってる人なんかは認めそうにないですね。
登場当初はそうでなかったにしても、他の言語の影響によってそう追いやられるということもあるでしょう。

C# は万能言語じゃない。C++ も万能言語じゃない。どっちが売れるかという商売的な要素を抜きにすれば、どっちに将来性があるでしょうか?
馬鹿馬鹿しい話じゃないですか? 「C# と C++ のどっちが強いですか?」っていう質問と同じ気がします。
どっちも、それぞれの得意分野で存分に活躍してくれればいいじゃないですか。

# re: C/C++ の将来性 2008/09/01 1:12 アキラ
> C# は特化言語であると言いつつ、C++ が「OS やドライバに特化した言語」であるということは認めないのですね。
最近はSchemeやDもだったかな?でOS作ってる人もいるみたいなので、特化とは言い切れないのかな、と

CはOSを組むための言語、みたいな話はどこかで聞いた気がしますけど

# re: C/C++ の将来性 2008/09/01 1:13 シャノン
> 実証例がひとつ存在するかどうかなら,現在公開されているSingularityで十分だと思うのですが.

もちろん、その例を知っているからこそ、将来的には可能になる、いや場合によっては主流言語にさえなり得るかもしれないということは匂わせたつもりです。
ただ、Singularity はまだまだ実験的プロジェクトですし、C# で WDM ドライバは作れません。
「作れない」と言ったのは語弊があったかもしれませんが、言葉遊びのレベルでしょう?

# サーバ運営のハードルは下がるのか? 2008/09/01 1:16 Out of Memory
サーバ運営のハードルは下がるのか?

# re: C/C++ の将来性 2008/09/01 1:16 アキラ
> どっちも、それぞれの得意分野で存分に活躍してくれればいいじゃないですか。
その通りですね。

# re: C/C++ の将来性 2008/09/01 1:17 ちゃっぴ
>> 現状を鑑みるにど素人の programmer を投入しなければならない software 開発の現状を考えると

> 開発体制や、採用する人間の問題でしょう。言語の問題とは言い切れないと思います。
> 素人でもお手軽に組む必要があるなら、状況に合わせて言語を選択すればいいでしょう。

そう思いますが、現実問題として必要なければ native を扱わせないというのが手っとり早い対策であることは間違い無いんです。

> また、3日で覚えられない言語は将来性がない、というようなことが言えるのでしょうか。

これに関して説明します。現状ではまだまだ C/C++ applications があふれています。今後も同様に扱われるか?というとそうではないのではということで「将来性がない」と書きました。完全に無くなるという意味では無く、本当に必要とされる一部の人のみ扱うようになるのでは?という意味で書いています。

>> framework に buffer overflow の脆弱性があったとしても、すぐに patch が release されますから
> それも言語の問題ですか~?
> 企業が提供してるフレームワークだから、でしょう。

おっしゃるとおり、framework 側の問題ですね。
ですが、C/C++ の問題点は正直 framework 側で解決できない問題と思います。正直 C/C++ の利点の裏返しであるわけですが、言語仕様で脆弱な coding することを許可していますから。C#, JAVA 等では特殊な使い方を利用しない限り、buffer overflow を招くことはありませんし。

> スマートポインタという"選択肢"が用意されますし、極力ポインタを使用しないコードは書けます。

おっしゃるとおりですが、smart pointer を利用しないという選択肢も用意されていることが難しくしている一因だと思います。

言語というか、framework の仕様で縛っているのと開発規約で縛るのはその実効性において現実的に違うんじゃないかと思います。

# re: C/C++ の将来性 2008/09/01 1:22 アキラ
> 正直 C/C++ の利点の裏返しであるわけですが、言語仕様で脆弱な coding することを許可していますから
> おっしゃるとおりですが、smart pointer を利用しないという選択肢も用意されていることが難しくしている一因だと思います。

何度も言ってる気がしますが、より良い入門書で、より推奨される方法を紹介すればいいでしょう。
そういう意味でのおすすめ書籍だと思っています。

C++に落とし穴や選択肢が多いことはわかってます。
それらのより良い解決方法があるのだから、より安全に、と思うのであれば読みましょう。
入門書も読まずにC++で組まなければならない状況ならおすすめはしません

下位互換性を重視する言語では、古くて危険な機能を削るなんてことはとても難しいのです。
それは、今後進化していく言語でも同じでしょう。

# re: C/C++ の将来性 2008/09/01 1:27 アキラ
> 完全に無くなるという意味では無く、本当に必要とされる一部の人のみ扱うようになるのでは?
今も昔もこれからも、必要な人がC/C++を使います。
それは、C/C++で開発するターゲットが減る、というのはではなく、開発できる言語が増えてるのでしょう。

# [C++]日輪の存在 2008/09/01 2:44 Garbage Collection
[C++]日輪の存在

# re: C/C++ の将来性 2008/09/01 3:01 melt
アキラさんとちゃっぴさんで何か話がかみ合ってない感じがしますねー。

「C/C++は言語(フレームワーク)的にセキュアで無いコードが書けてしまう」ということが、言語(フレームワーク)的に問題だということですよね。
確かにC/C++はその点で結構厳しいものがありますね。セキュアなアプリであるということを保証できないので、今度のリリースこそセキュリティーホールが見つかりませんように、とか祈りながらリリースしてますからねー。

で、この保証の問題を「C/C++で安全に書けるようにな能力を身につける」「セキュアなコードが正しく書けるように教育する」といった方法で解決できるとは思えないですね。
実際そういった教育を行ったからと言って、セキュアなアプリになったことが保証されるわけでは無いからです。

だから、言語やフレームワーク的にセキュアであるものを使って、セキュアなアプリであることを言語やフレームワークに保証してもらうんじゃないかなー、というのが自分の理解です。

確かにこの点はC/C++は辛い立場だよなーとか思いつつ、既存の技術者や既存のシステムや実行速度やコードサイズやなんやかんやを考えていくと「C/C++が消えて無くなる」とはあまり思わないですね-。
まあでも、将来「どんな環境であろうと、セキュアだと保証されていないアプリなんてゴミクズ以下のただのカスだ」みたいな認識になるのであれば、「将来性がない」というのは確かにそうなのかもしれないですね。
いやでも、そこまで速度だの何だのが問題ないようになってくると今度はOS側が完全にセキュアであることを保証してくれるようになったり何かして結局OSのレイヤで解決されたりするのかなぁ……うーん。

# C/C++ の将来性 その 2 2008/09/01 4:11 ちゃっぴの監禁部屋
C/C++ の将来性 その 2

# 進化と足枷 2008/09/01 9:55 Out of Memory
進化と足枷

# C/C++ の将来? 2008/09/02 0:20 Ognacの雑感
C/C++ の将来?

Post Feedback

タイトル
名前
Url:
コメント