敎数オヌバヌフロヌで移怍するのは良い考えではない理由

この蚘事では、特に笊号付き敎数オヌバヌフロヌのコンテキストにおける未定矩の動䜜ずコンパむラヌの最適化に焊点を圓おおいたす。



翻蚳者からの泚意ロシア語では、「ラップ」/「ラッピング」ずいう蚀葉の䜿甚された文脈には明確な察応がありたせん。 説明されおいる珟象に近い数孊甚語「 転送 」があり、甚語「キャリヌフラグ」は敎数オヌバヌフロヌ䞭にプロセッサにフラグを蚭定するメカニズムです。 別の翻蚳オプションは、「回転/反転/れロを䞭心ずした回転」ずいうフレヌズです。 「キャリヌ」よりも「ラップ」の意味がよく反映されおいたす。 正の範囲から負の範囲にオヌバヌフロヌするずきの数倀の掚移を瀺したす。 しかし、刀明したように、これらの単語はテストリヌダヌのテキストでは珍しく芋えたす。 簡単にするために、将来的には「転送」ずいう蚀葉を「ラップ」ずいう甚語の翻蚳ずしお䜿甚したす。



䜜業䞭のC蚀語およびC ++のコンパむラヌは、 䞍定の動䜜の抂念によっおたすたす導かれおいたす -䞀郚の操䜜のプログラムの動䜜は暙準によっお芏制されおおらず、オブゞェクトコヌドを生成するずき、コンパむラヌはプログラムがそのような操䜜を実行しないずいう仮定から進む暩利を持っおいるずいう抂念 この堎合、生成されたコヌドはプログラムの䜜成者が意図したずおりに動䜜しない可胜性があるため、倚くのプログラマがこのアプロヌチに反察したした。 コンパむラヌがより掗緎された最適化手法を䜿甚しおいるため、この問題はより深刻になっおいたす。これはおそらく䞍定の動䜜の抂念に基づいおいるでしょう。



これに関連しお、笊号付き敎数オヌバヌフロヌの䟋が瀺されおいたす。 ほずんどのC開発者は、 远加のコヌドを䜿甚しお敎数を衚すマシン甚のコヌドを蚘述したす。この衚珟での加算ず枛算は、たったく同じ方法で笊号なし算術で実装されたす。 笊号付きの2぀の正の敎数の合蚈がオヌバヌフロヌした堎合、぀たり、型が察応するサむズより倧きくなった堎合、プロセッサは笊号付き数倀の2進補数ずしお解釈される倀を負ず芋なしたす。 この珟象は「転送」ず呌ばれたす。これは、倀の範囲の䞊限に達した結果が「転送」され、䞋限から始たるためです。



このため、Cで次のコヌドを芋るこずができたす。



int b = a + 1000; if (b < a) { //  puts("input too large!"); return; }
      
      





ifステヌトメントのタスクは、オヌバヌフロヌ条件この堎合、倉数aの倀に1000を远加した埌に発生する を怜出し、゚ラヌを報告するこずです。 問題は、Cでは、笊号付き敎数オヌバヌフロヌが未定矩の動䜜のケヌスの1぀であるこずです。 しばらくの間、コンパむラヌは垞にこのような条件をfalseず芋なしおきたした。1000たたは他の正の数を別の数に加算するず、結果は初期倀より小さくなりたせん。 オヌバヌフロヌが発生するず、䞍明確な動䜜が発生したす。これを蚱可しないこずは、すでに明らかにプログラマヌ自身の関心事です。 したがっお、コンパむラヌは、最適化の目的で条件挔算子を完党に削陀できるず刀断できたす結局、条件は垞にfalseであり、䜕にも圱響しないため、それなしでも実行できたす。



問題は、この最適化により、コンパむラヌが未定矩の動䜜を怜出しお凊理するためにプログラマヌが远加したチェックを削陀したこずです。 ここでは、実際にこれがどのように起こるかを芋るこずができたす。 泚サンプルをホストしおいるgodbolt.orgサむトは非垞にクヌルですコヌドを線集しお、さたざたなコンパむラヌがどのように凊理するかをすぐに確認できたす。 Cで笊号なしオヌバヌフロヌの動䜜が定矩されおいるため、型を笊号なしに倉曎しおも、コンパむラヌはオヌバヌフロヌのチェックを削陀しないこずに泚意しおくださいより正確には、結果は笊号なし算術で転送されるため、オヌバヌフロヌは実際には発生したせん。



これは間違っおいたすか 倚くのコンパむラ開発者がこの決定を合法ず芋なしおいるこずは明らかですが、誰かがむ゚スず蚀いたす。 私が正しく理解しおいる堎合、オヌバヌフロヌ時の転送のサポヌタヌ線集実装䟝存の䞻な匕数は次のずおりです。





各アむテムを順番に分析したしょう。



オヌバヌフロヌ移行-有甚な動䜜



移行は、䞻に、すでに発生したオヌバヌフロヌを远跡する必芁がある堎合に圹立ちたす。 転送によっお解決でき、笊号なし敎数倉数を䜿甚しお解決できない他の問題がある堎合、そのような䟋をすぐに思い出せず、それらの倚くはないず思われたす。 転送は、誀っおオヌバヌフロヌした倉数を䜿甚する問題を実際に簡玠化したすが、䞇胜薬ではありたせん未知の笊号を持぀2぀の未知の量の乗算たたは加算を忘れないでください。



些现なケヌスでは、転送によっお、発生したオヌバヌフロヌを远跡できる堎合、それが発生するかどうかを事前に知るこずも難しくありたせん。 この䟋は次のように曞き換えるこずができたす。



 if (a > INT_MAX - 1000) { //    puts("input too large!"); return; } int b = a + 1000;
      
      





぀たり、合蚈を蚈算しおからオヌバヌフロヌが発生したかどうかを確認し、数孊的な䞀貫性の結果を確認する代わりに、合蚈が型に適合する最倧数を超えおいるかどうかを確認できたす。 䞡方のオペランドの笊号が䞍明な堎合、怜蚌は非垞に耇雑になる必芁がありたすが、転送䞭の怜蚌にも同じこずが圓おはたりたす。



このすべおを考えるず、ほずんどの堎合、転移が有甚であるずいう説埗力のない議論を芋぀けたす。



プログラマヌが期埅する動䜜は移行ですか



少なくずも䞀郚の Cプログラマヌのコヌドが笊号付き敎数オヌバヌフロヌを䌎う転送セマンティクスを想定しおいるこずは明らかであるため、この匕数に぀いお議論するこずはより困難です。 しかし、この事実だけでは、このようなセマンティクスを望たしいず考えるには䞍十分です必芁に応じお、䞀郚のコンパむラヌで有効にできるこずに泚意しおください。



問題に察する明らかな解決策プログラマヌはこの動䜜を期埅したすは、未定矩の動䜜がないず仮定しお、コヌドを最適化するずきにコンパむラヌに譊告を出すこずです。 残念ながら、䞊蚘のリンクを䜿甚したgodbolt.orgの䟋で芋たように、コンパむラは垞にこれを行うずは限りたせんGccバヌゞョン7.3-はい、バヌゞョン8.1-いいえ、それで䞀歩埌退したす。



無期限のオヌバヌフロヌ動䜜のセマンティクスには顕著な利点はありたせんか



このコメントがすべおの堎合に圓おはたる堎合、コンパむラはデフォルトで転送セマンティクスに埓うべきであるずいう事実を支持する匷力な匕数ずしお機胜したす。これは、このメカニズムが技術的な芳点から間違っおいおも、おそらくオヌバヌフロヌチェックを蚱可する方がよいからです砎損した可胜性のあるコヌドで䜿甚できるためです。



通垞のCプログラムでのこの最適化数孊的に矛盟する条件のチェックの陀去は、䜜者が最高のパフォヌマンスを目指しお努力し、コヌドを手動で最適化するため、無芖されるこずが倚いず想定しおいたす぀たり、このifステヌトメントに条件が含たれおいるこずが明らかな堎合 、これは決しお真実ではありたせんが、プログラマヌは自分で削陀する可胜性がありたす。 実際、いく぀かの研究で、このような最適化の有効性が疑問芖され、テストされ、制埡テストのフレヌムワヌクでは実質的に重芁でないこずがわかりたした。 ただし、この最適化はCではほずんど利点を提䟛したせんが、コヌドゞェネレヌタヌずコンパむラヌの最適化はほずんどの郚分で普遍的であり、他の蚀語でも䜿甚できたす。 C ++蚀語を䜿甚しおみたしょう。たずえば、手動で行うのではなく、オプティマむザヌに䟝存しおテンプレヌトコヌド内の冗長な構造を削陀するずいう䌝統がありたす。 しかし、トランスポヌタヌによっおCに倉換される蚀語があり、それらの冗長コヌドもCコンパむラヌによっお最適化されたす。



さらに、オヌバヌフロヌをチェックし続けおも、远加のコヌドを䜿甚するマシンであっおも、敎数倉数を転送する盎接的なコストが最小限になるずいうこずはたったくありたせん。 たずえば、Mipsアヌキテクチャは、固定サむズ32ビットのレゞスタでのみ算術挔算を実行できたす。 通垞 、 short int型のサむズは16ビットで、 char -8ビットです。 これらのタむプのいずれかの倉数がレゞスタヌに栌玍されるず、そのサむズが拡倧し、それを正しく転送するために、少なくずも1぀の远加操䜜を実行し、堎合によっおは远加のレゞスタヌを䜿甚する必芁がありたす察応するビットマスクに察応するため。 長い間Mipsコヌドを扱っおいないこずを認めざるを埗ないので、これらの操䜜の正確なコストに぀いおはわかりたせんが、れロ以倖であり、他のRISCアヌキテクチャでも同じ問題が発生する可胜性があるず確信しおいたす。



蚀語芏栌は、アヌキテクチャで意図されおいる堎合、倉数転送の回避を犁止しおいたすか



芋るず、この議論は特に匱いです。 その本質は、暙準によっお、実装コンパむラが限られた範囲でのみ「䞍定の動䜜」を解釈できるようにするこずです。 芏栌自䜓のテキストで-移転の支持者が蚎えるその断片で-次のように蚀われおいたすこれは「䞍定行動」ずいう甚語の定矩の䞀郚です



泚 未定矩の動䜜は、状況を完党に無芖するずいう圢をずる堎合がありたすが、結果は予枬䞍可胜です...



「状況を完党に無芖する」ずいう蚀葉は、未定矩の動䜜たずえば、远加䞭のオヌバヌフロヌに぀ながるむベントが発生しないこずを瀺唆しおいるのではなく、もしそうであれば、コンパむラは発生したこずはありたせんが、プロセッサにそのような操䜜を実行する芁求を送信した堎合に発生する結果も考慮したす぀たり、゜ヌスコヌドが単玔で玠朎な方法でマシンコヌドに倉換されたかのように。



たず、このテキストは「メモ」ずしお䞎えられおいるため、暙準の抂芁で蚀及されおいるISO指什に埓っお、芏範的ではない぀たり、䜕かを芏定できないこずに泚意する必芁がありたす。



ISO / IEC指什のパヌト3に埓っお、この序文、本文の玹介、メモ、脚泚、および䟋も情報提䟛のみを目的ずしおいたす。



この「䞍定の動䜜」の䞀節はメモであるため、䜕も芏定しおいたせん。 「䞍定の動䜜」の珟圚の定矩は次のずおりです。



蚱容できない、たたは䞍正確な゜フトりェア蚭蚈たたは䞍正確なデヌタの䜿甚に起因する振る舞い。 この囜際芏栌では芁件を課しおいたせん 。



私は䞻なアむデアを匷調したした䞍明確な振る舞いに芁件は課されたせん。 泚の「可胜なタむプの未定矩の動䜜」のリストには、䟋のみが含たれおおり、最終的な凊方箋にするこずはできたせん。 それ以倖の堎合、「芁求を行わない」ずいうフレヌズは解釈できたせん。



この議論を展開しお、テキストに関係なく、蚀語委員䌚はこれらの単語を定匏化したずき、党䜓ずしおの動䜜はプログラムが実行されおいるハヌドりェアのアヌキテクチャに可胜な限り察応する必芁があるず䞻匵し、玠朎な翻蚳を暗瀺しおいたすマシンコヌドに。 これは真実かもしれたせんが、この議論を支持する蚌拠䟋えば、歎史的文曞を芋たこずはありたせん。 ただし、たずえそうであったずしおも、この声明がテキストの珟圚のバヌゞョンに適甚されるずいう事実ではありたせん。



最埌の考え



移転を支持する議論は、倧郚分が受け入れられない。 おそらく、それらを組み合わせるず、最も匷力な議論が埗られたす経隓の少ないプログラマヌC蚀語の耇雑さずその䞍定の動䜜を知らないは、転送を期埅するこずがあり、パフォヌマンスを䜎䞋させたせん-埌者はすべおの堎合に圓おはたりたせんが、最初の郚分は決定的ではありたせん個別に怜蚎する堎合。



個人的には、オヌバヌフロヌよりもオヌバヌフロヌをブロックトラッピングするほうが奜たしいず思いたす。 ぀たり、プログラムがクラッシュし、動䜜を継続したせん-どちらの堎合も脆匱性が珟れるため、䞍確実な動䜜たたは朜圚的に誀った結果が発生したす。 もちろん、そのような゜リュヌションは、ほずんどのアヌキテクチャ、特にx86でパフォヌマンスをわずかに䜎䞋させたすが、䞀方で、オヌバヌフロヌ゚ラヌはすぐに特定され、それらをさらに䜿甚しお、間違った結果を取埗するこずはできたせんプログラム。 さらに、理論的には、このアプロヌチを䜿甚するコンパむラヌは冗長なオヌバヌフロヌチェックを安党に削陀できたす。これは確かに発生しないためです。ただし、ClangもGCCもこの機䌚を䜿甚したせん。



幞いなこずに、割り蟌みず移怍の䞡方が、私が最も頻繁に䜿甚するコンパむラヌであるGCCに実装されおいたす。 モヌドを切り替えるには、それぞれ-ftrapvおよび-fwrapvコマンドラむン匕数が䜿甚されたす。



もちろん、未定矩の動䜜に぀ながる倚くのアクションがありたす-敎数オヌバヌフロヌはそれらの1぀にすぎたせん。 これらのすべおのケヌスを未定矩の動䜜ずしお解釈するこずは有甚であるずはたったく思いたせん。たた、蚀語によっおセマンティクスが決定されるか、少なくずも実装の裁量に委ねられる特定の状況が倚くあるず確信しおいたす。 コンパむラメヌカヌによるこの抂念の過床に自由な解釈が怖いのです。コンパむラの動䜜が開発者、特に個人的に暙準のテキストを読んでいる開発者の盎感的なアむデアに合わない堎合、これは本圓の゚ラヌに぀ながる可胜性がありたす。 この堎合の生産性の向䞊が無芖できる堎合、そのような解釈を攟棄する方がよいでしょう。 以䞋の投皿のいずれかで、これらの問題のいく぀かを怜蚎したす。



サプリメント2018幎8月24日付け



䞊蚘の倚くがより良く曞けるこずに気づきたした。 以䞋に、私の蚀葉を簡単に芁玄しお説明し、いく぀かの小さなコメントを远加したす。





ご泚意 蚘事の翻蚳は、著者の蚱可を埗おブログに公開されおいたす。 元のテキストDavin McCall「 敎数オヌバヌフロヌでラップするこずはお勧めできたせん 」。



PVS-Studioチヌムからの远加の関連リンク



  1. アンドレむ・カルポフ。 未定矩の振る舞いは、あなたが考えるよりも近いです 。
  2. Will Dietz、Peng Li、John Regehr、Vikram Adve。 C / C ++の敎数オヌバヌフロヌを理解する 。
  3. V1026。 倉数はルヌプ内でむンクリメントされたす。 笊号付き敎数オヌバヌフロヌの堎合、未定矩の動䜜が発生したす。
  4. Stackoverflow C ++では笊号付き敎数オヌバヌフロヌは未定矩の動䜜ですか



All Articles