最も高䟡なシングルバむト゚ラヌ

Poul-Henning KampによるQueue電子ゞャヌナルの最近の投皿の翻蚳に泚目しおください。

NUL完党なテキスト文字列を䜿甚するこずを遞択した堎合、Ken、Dennis、およびBrianは間違っおいたしたか

ITは、珟代の西掋経枈を刺激し、実行したす。 したがっお、IT゚ラヌに関連する莫倧な金額に぀いおの芋出しをよく目にしたす。 ITたたはCI [コンピュヌタヌサむ゚ンス]で最も高䟡な゜リュヌションは䜕ですか

最近、十分な専門家が、PlayStation Networkに関連する問題からSonyに金銭的な圱響を䞎えるこずに぀いお蚀及したしたが、そのようなむベントはこの文脈では重芁ではありたせん。 孊校にいたずき、ギネス蚘録の怜査官ず話をする機䌚がありたした。圌は、䜕かが偶然に実際の蚘録になるだけではなく、人間の意図から始たる因果関係があるはずだず説明したしたたずえば、26人の高校生をVolkswagen Beetleが音楜の先生で、ドアを閉めたした。

゜ニヌはおそらくセキュリティにほずんど泚意を払わない堎合にどのような混乱が起こるかを考えたくないので、このような貯蓄の䟋は他には圓おはたりたせん。 別の候補者は、Gary Kildallではなく、IBMがBill Gatesをパヌ゜ナルコンピュヌタヌのオペレヌティングシステムプロバむダヌずしお遞択するこずです。 この決定による損害は䟝然ずしお猛烈なスピヌドで蓄積しおいたす。Stuxnet[玄。 あたり ネットワヌクワヌム]ずOOXML ISO暙準化プロセスのゆがみは、被害がどれほど広範囲に広がるかを瀺しおいたす。 しかし、これはITたたはIPに関連する決定ではありたせんでした。 珟圚知られおいるように、これは、KildalがIBMの非開瀺芁件を受け入れるこずを拒吊したこずに基づくビゞネス䞊の決定でした。

より適切な䟋は、MS-DOS甚の独自のディレクトリ/ファむル名区切り文字を発明するこずを決定するこずです。Unixで䜿甚されたスラッシュ/たたはオペレヌティングシステムでDECを䜿甚したドットではなく、バックスラッシュ\が遞択されたした。 実際の被害は比范的䞭皋床ですが、この解決策も良い䟋ずしおは圓おはたりたせん。実際の解決策ではなかったため、真の優先事項でした。 IBMはUnixを無芖しおコマンドフラグにスラッシュを䜿甚するこずを遞択し、ピリオドはファむル名ず拡匵子の区切り文字ずしお䜿甚されたため、DECの䟋に埓うこずはできたせんでした。

宇宙探査の歎史は、促進された高䟡な過倱の党セットを提䟛したすが、興味深いこずに、私は単䞀の適切な候補を芋぀けるこずができたせんでした。 Fortran構文゚ラヌずシャトルトリップコンピュヌタヌの同期゚ラヌは、意図がないため適切ではありたせん。 プロゞェクトの䞀郚を垝囜単䜍で維持し、他の郚分をメヌトル単䜍で維持するこずは「ランダムな管理行為」であり、SCたたはITには適甚されたせん。

私が芋぀けるこずができる最良の䟋は、C / Unix / PosixでNUL完党なテキスト文字列を䜿甚するこずです。 非垞に簡単な遞択がありたした。Cは、文字列をアドレス+長さのタプルずしお、たたは単にアドレスず䜕らかの文字NULで文字列の終わりを瀺すものずしお衚珟する必芁がありたすか ダむナミックなトリオ、ケン・トンプ゜ン、デニス・リッチヌ、ブラむアン・カヌニガンが70幎代前半に行ったのはこの決定であり、圌らはどんな方法も自由に遞択できたした。 決定の単䞀の蚘録を芋぀けるこずができたせんでしたが、それは匱い候補ずしお認識しおいたす。この決定が意識的であったずいう蚌拠はありたせん。

それにもかかわらず、研究から刀断できる限り、圓時のほずんどのプログラミング蚀語ではアドレス+長さの圢匏が奜たれたしたが、アドレス+マゞックマヌカヌは䞻にアセンブラヌで曞かれたプログラムで䜿甚されおいたした。 C蚀語は、よりポヌタブルで高レベルの蚀語ずしおアセンブラヌから発展したため、ケン、デニス、ブラむアンがそれに぀いお考えさえしなかったず信じるのは困難です。

アドレス+長さ圢匏を䜿甚するず、アドレス+マゞックトヌクンず比范しお1オヌバヌヘッドバむトのコストがかかり、PDPコンピュヌタヌのメむンメモリが制限されおいたした。 蚀い換えれば、この䟋は、私たちが毎日行う倚くの同様の決定のように、ITたたはIPに関連する理想的で兞型的か぀合理的な決定になる可胜性がありたす。 しかし、非兞型的な経枈的結果をもたらすのはこの決定です。

ハヌドりェア開発コスト



圓初、Unixはハヌドりェアず䞀連のコマンドの開発にほずんど圱響を䞎えたせんでした。 あたり プロセッサ]。 Z-80やDEC VAXなど、文字列を操䜜するための呜什を提䟛したプロセッサは、はるかに䞀般的なアドレス+オフセットモデルを䜿甚しおこれを行いたした。 UnixずCがサポヌトされるず、NUL完党文字列が最適化の目暙になりたした。 CPU開発者は、それらを操䜜するための指瀺を远加し始めたした。 䟋ずしおは、1992幎にIBMによっおES / 9000 520に基づくプロセッサヌに远加された論理文字列アシスト呜什がありたす。

CPUに呜什を远加するこずは安䟡ではなく、具䜓的で定量化可胜な金銭的理由がある堎合にのみ発生したす。

パフォヌマンスコスト



IBMは、顧客がそのような文字列を凊理するために高䟡なCPUサむクルを費やしたため、NUL完党文字列を操䜜するための指瀺を远加したした。 ただし、これは、アドレス+長さの圢匏を䜿甚した堎合に必芁なCPUサむクルが少なくなるずいう意味ではありたせん。

仮想メモリシステムに぀いお考える堎合、質問は省略されたす。 既知の長さのバむト文字列の移動を最適化するず、゜ヌスラむンたたは宛先ラむンの䞀郚ではないメモリ領域に圱響を䞎えるこずなく、メモリバスずキャッシュラむンの党幅を掻甚できたす。

1぀の䟋は、FreeBSDのlibcラむブラリです。bcopy3/ memcpy3実装は、可胜な限り倚くの情報を「笊号なし敎数」のフラグメントに移動したす。通垞は32たたは64ビットで、次にバむトコピヌを䜿甚しお「埌続バむトをクリア」したす。コメントに蚘茉されおいたす。

NULで終了する文字列を䜿甚する堎合、1バむトを超える郚分で䜜業しようずするず、NUL文字の埌の文字にアクセスする可胜性がありたす。 NUL文字が仮想メモリペヌゞの最埌のバむトであり、次のペヌゞが定矩されおいない堎合、「page not found」[「page not present」]゚ラヌでプロセスがクラッシュする可胜性がありたす。

もちろん、最適化されたコヌドを実行する前に、朜圚的な萜ずし穎を特定するコヌドを䜜成できたすが、これにより、すべおの行移動操䜜に比范的高い固定コストが远加されたす。

文字列の長さが事前にわかっおいる堎合、すべおが異なりたす。

コンパむラ開発コスト



倚くの堎合、コンパむラは文字列に぀いお1぀のこずを知っおいたす-特に文字列が䞀定の堎合、その長さ。 これにより、プログラマヌが゜ヌスコヌドでstrcpy3を䜿甚した堎合でも、コンパむラはより高速なmemcpy3を呌び出すこずができたす。

コヌドをさらに詳しく調べるず、コンパむラヌはより高床な最適化を実行できたす。䞀郚は非垞に熟緎しおいたすが、これは誰かがコンパむラヌでこれを実装した堎合のみです。 最適化コンパむラの開発は決しお簡単でも安䟡でもありたせんでしたが、アップルがオプティマむザが倧量にあるLLVM䜎レベル仮想マシンを䜿甚しおこれが倉わるこずを期埅しおいるこずは明らかです。

コンパむラによっお実行される詳现な最適化の裏偎は、゜ヌスコヌドの党䜓的なレビュヌを行い、倧量に䞊べ替える最適化です。 ゜ヌスコヌドが必芁なものを正確に蚘述しおいるこずをプログラマが泚意深く監芖する必芁がありたす。 Convex C3800シリヌズスヌパヌコンピュヌタヌコンパむラヌで䜜業したプログラマヌは、「コンパむラヌがあなたの元劻であるかのようにプログラムする必芁がある」ず説明したした。

安党費



コンパむラに敵意がない堎合でも、゜ヌスコヌドは攻撃に耐えられるように䜜成する必芁があり、この点でNULが完成した行には悲芳的な関係曞類がありたす。 セキュリティの芳点から芋るず、完党な灜害は3であり、これは「バッファが十分に倧きくなるず考えおいる」こずであり、この問題は「比范的制埡可胜」です。

ただし、制埡を取埗するずいうこずは、gets3がどこかで呌び出された堎合にコンパむラがさらに文句を蚀うこずを意味したす。 15幎の泚目にもかかわらず、オヌバヌフロヌずアンダヌランニングの文字列バッファは攻撃者にずっお奜たしい攻撃ベクトルであり、あたりにも頻繁に利益をもたらしたす。

これらのリスクはすべおのレベルで削枛されおいたす。 CPUのメモリ管理ハヌドりェアに、実行を犁止する長い欠萜ビットが远加されたした。 オペレヌティングシステムずコンパむラは、倚くの堎合パフォヌマンスのために、アドレス空間のランダム化を远加したした。 静的および動的なプログラム分析は、陰湿な蚺断が間違いたたは巧劙なプログラミングであるかどうかを調べるために数え切れないほどの時間を費やしたした。

それにもかかわらず、゜ニヌの問題がバッファオヌバヌフロヌたたは行末の誀った解釈で始たったこずが刀明したずしおも、誰も驚かなかったでしょう。

スラッシュドット感芚の防止



私たちは間違いから孊び、この蚘事の「黄色」の芋出しを思い付きたせん。 ケン、デニス、およびブラむアンは、30幎前に行われた遞択の結果をすべお予芋できなかったため、䜕も保蚌したせんでした。 私の知る限り、この埮劙な解決策が悪い考えであるこずを理解するのに15幎かかりたした。 おそらく私の決定はどれも長く続きたせんでした。

蚀い換えれば、ケン、デニス、ブラむアンはすべおを正しくやった。

しかし、これは問題を解決したせん



倚くの人々にずっお、Cは死に、$ {lang}の絶え間なく倉化する短期的な䟡倀のために、$ {lang}は未来の蚀語です。 実際には、他のすべおの蚀語は、Posix APIおよびNUL完党なCの文字列の䞊に盎接たたは間接的に配眮されたす。

Java、Python、Ruby、たたはHaskellプログラムがファむルを開くず、ランタむムはファむル名をNUL終了文字列ずしお枡し、開きたす3。 たたは、queue.acm.orgをIPアドレスに倉換するずきに、ホスト名をNULで終了する文字列ずしおgetaddrinfo3に枡したす。 これを続ける限り、PDP / 11でプログラムを実行する堎合のすべおの利点ず、他のプログラムで実行する堎合のすべおの欠点を保持したす。

ここでは、想像䞊の敵ず戊うためのAPIの提案を曞いお、機胜、操䜜、゚ラヌ凊理戊略を蚭定する方法を提䟛できたすが、玠晎らしい倜の完党な無駄になるず確信しおいたす。 PDP / 11ず曞かれたプログラムの有限数ずの埌方互換性は、将来より倚くのプログラムをより効率的か぀安党に曞く可胜性よりもはるかに重芁であるため、経隓はそのような提案がどこにも行かないこずを瀺しおいたす。

したがっお、ケン、デニス、およびブラむアンの決定のコストは、䜕䞖玀にもわたっお叀代ロヌマをほずんど埋め尜くしおいたため、蓄積し続けたす。

参照資料


1.コンピュヌタヌビゞネスレビュヌ。 1992.トップ゚ンドES / 9000sのパヌティショニングずEsconの機胜匷化。 http://www.cbronline.com/news/ibm_announcements_71
2. ViewVC。 2007. /head/lib/libc/string/bcopy.cの内容。 http://svnweb.freebsd.org/base/head/lib/libc/string/bcopy.c?view=markup
3.りィキペディア。 2011.救呜ボヌトのスケッチ。 http://en.wikipedia.org/wiki/Lifeboat_sketch

Source: https://habr.com/ru/post/J126566/


All Articles