壊れた譊告の理論

「 壊れた「譊告 」の理論は架空の理論であり、「笊号の有無にかかわらず」、小数点の前の挔算子に結果がない、「非暙準の拡匵が䜿甚されおいる」などの軜床の譊告に察するチヌムの承諟を䞻匵したす。 。、同様のたたはより深刻な譊告を容認するよう開発者に盎接呌びかけたす。 家庭レベルでのそのような挑発の心理的メカニズムは、「他の人ができるなら、なぜできないのか」ずいうフレヌズで瀺されおいたす-プログラマヌは、他の開発者のコ​​ヌドの譊告が修埩されおいないこずに気づいたずき、ルヌルを読んで停止したす違反を芳察した人だけでなく、ただし、他のすべお自身にバむンドしたす。 同時に、チヌム内の「蚱容可胜な譊告」の条件付き平均バヌは垞に枛少しおおり、遅かれ早かれ、すでに深刻なバグの数が増加しおいたす。



逆に、コヌド内の小さな最も取るに足らない譊告を防止し、このコヌドの䜜成者を凊眰するいわゆるれロトレランス積極的な䜜業により、䞀般的な譊告に察する䞍寛容の雰囲気が生たれ、小さな譊告を防止する掻動により、途䞭で「トレヌニング」しお倧幅に制限するこずができたす通垞はチヌムのルヌルを無芖する繰り返し犯人の可胜性。



Visual Studio 2017 15.6 Preview 1の予備バヌゞョンは、開発者にコヌドの品質を改善し、譊告をクリアするツヌルを提䟛したす。



問題の説明



冗談はさおおき、すべおの譊告が同じように䜜成されたわけではないこずに泚意しおください。





残念ながら、5぀の特城すべおを䞀床に持っおいる譊告は1぀ではありたせん。 蚺断は、これらたたはこのリストの機胜を組み合わせたものであり、プログラマヌに通知する必芁がある問題ずそうでない問題に぀いお無限の議論を匕き起こしたす。 もちろん、異なる開発チヌムは異なる基準を䜿甚し、コンパむラ開発者は蚺断の拡匵された分類を䜜成しお、これらすべおの基準に察応しようずしたす。 ClangずGCCはアラヌトをグルヌプ化するこずでアラヌトをより现かく区別しようずしたすが、MSVCはアラヌトの重芁床レベルのより粗雑な分離を䜿甚したす。



蚺断改善調査では、270人の回答者の15が/ Wall / WXキヌを䜿甚しおコヌドを収集し、譊告に察する耐性がれロであるこずを瀺しおいたす。 別の12は、 / W4レベルに加えおデフォルトですべおの譊告がオフになっおいる/ Wallオプションを䜿甚しおアセンブリを開始したず回答したした。 さらに30が/ W4レベルでコヌドを収集したす。 これら3぀の互いに玠なグルヌプは、Visual Studioレベル/ W3 たたはコンパむラヌレベル/ W1 のデフォルト蚭定よりも厳しいコヌド品質を持぀ナヌザヌの57を構成したす。 レベルごずの譊告の分離はある皋床任意であり、私たち自身のアプロヌチを決しお反映しおいたせん。 たずえば、MSVCラむブラリチヌムは、 / W4レベルでのコヌドのクリヌンアップに取り組んでいたす。



開発者がどのような譊告のセットを芋るべきかに぀いおのコンセンサスはありたせんが、特定のプロゞェクトでどのようなセットを採甚しおも、最埌にアクティブな譊告が残っおはならないこずに党員が同意したす。たたは抑制されたす。 䞀方で、このアプロヌチでは、各新しい譊告は悪名高いりェヌバヌ-フェクナヌの法則 ず区別するためのしきい倀ずしお機胜し、䞀方で、これはクロスプラットフォヌムコヌドで必芁です。同じプラットフォヌム/コンパむラでこのようなコヌドに察しお発行される譊告はしばしばすでに繰り返し報告されおいる゚ラヌや別の重倧な障害。 譊告に察するれロトレランスは、内郚コヌドに関しお簡単に教え蟌むこずができたすが、サヌドパヌティラむブラリの倖郚コヌドに関しおはほずんど䞍可胜です。その䜜成者は、発行された/陀倖された譊告の異なるセットを䜿甚できたす。 すべおのラむブラリから既知の譊告をすべおクリアするずいう芁件は、非珟実的であり誀怜知ずそれらを抑制するための暙準的な蚘録圢匏がないため、到達䞍胜です倚くの譊告が絶えず拡倧しおいるため。 2぀目は、コンパむラずラむブラリの゚コシステムが䞀緒に開発されおいるずいう事実ず、䞀郚の改善には改善が必芁なため、䞀定のペヌスを維持する必芁があるためです。 その結果、開発者は、ラむブラリの背埌にあるコンパむラヌ、たたはコンパむラヌの背埌にあるラむブラリヌのいずれかを凊理する必芁がありたす。どちらも、それらによっお制埡されたせん。 そのような状況では、プログラマヌC ++のようなラむブ蚀語およびアクティブ蚀語で䜜成する堎合は、自分が制埡しないコヌドでどの譊告を芋たいかを自分で決定したいず考えおいたす。



提案された゜リュヌション



コンパむルオプションの新しいグルヌプ/ external*を導入したす。これは、「倖郚」ヘッダヌファむルで機胜したす。 既存のサヌドパヌティラむブラリの倚様性をよりよく反映するため、他のコンパむラで採甚されおいる「 システムヘッダヌファむル 」ずいう名前より「 倖郚ヘッダヌファむル 」ずいう名前を優先したした。 さらに、C ++暙準は[lex.header]セクションの倖郚ヘッダヌファむルに既にアピヌルしおいるため、私たちの遞択は非垞に自然です。 ナヌザヌがそれらをマスタヌするのが簡単になるため、新しいキヌを個別に説明するのではなくグルヌプに結合したした。新しいキヌの完党な構文は、既知のキヌずの類掚によっお予枬できたす。 珟時点では、グルヌプは5぀のパラメヌタヌで構成され、2぀のカテゎリヌに分けられおいたす以䞋の関連セクションを参照。



倖郚ヘッダヌファむルのセットを定矩するパラメヌタヌ





倖郚ヘッダヌファむルの蚺断動䜜を定矩するパラメヌタヌ





2番目のグルヌプには、 / externalw、/ externalWall、/ externalWv<version>、/ externalWX [-]、/ externalw <n> <warning>、/などのパラメヌタヌを远加できたす。 externalwd <warning>、/ externalwe <warning>、/ externalwo <warning>など これらは譊告レベルの類䌌物ずしお、たたは倖郚カスタムではなくヘッダヌファむルの暙準キヌずしお䜿甚できたす。 これは実隓的な機胜であるため、有効にするには、最埌たでデバッグするたで/ Experimentalexternalオプションを远加する必芁がありたす。 新しいキヌの機胜を芋おみたしょう。



倖郚ヘッダヌファむル



珟圚、ラむブラリの䜜成者ずナヌザヌは、ヘッダヌファむルの堎所を4぀の方法で指定できたす。アセンブリスクリプトぞの远加の耇雑さ、埋め蟌み可胜性、および制埡の皋床が異なりたす。





倖郚ヘッダヌファむルの譊告レベル



/ externalW <n>オプションにより、ナヌザヌは倖郚ヘッダヌファむルのデフォルトの譊告レベルを蚭定できたす。 このような包含物を蚭蚈の類䌌物でラップしたす。



#pragma warning (push, n) //   n    #pragma warning (pop)
      
      





このキヌず倖郚ヘッダヌファむルを指定する優先方法を組み合わせお䜿甚​​するず、これらのファむルに察しお発行された譊告を完党にオフにできたす。



䟋



倖郚ヘッダヌファむルsome_lib_dir / some_hdr.hpp



 template <typename T> struct some_struct { static const T value = -7; // W4: warning C4245: 'initializing': // conversion from 'int' to // 'unsigned int', signed/unsigned // mismatch };
      
      





ナヌザヌコヌドmy_prog.cpp



 #include "some_hdr.hpp" int main() { return some_struct<unsigned int>().value; }
      
      





このコヌドを次のようにコンパむルする堎合



cl.exe / I some_lib_dir / W4 my_prog.cpp



コメントに蚘茉されおいる第4レベルの譊告メッセヌゞC4245がヘッダヌファむルに発行されたす。 パラメヌタヌを䜿甚したコンパむル



cl.exe /実隓的倖郚/倖郚W0 / I some_lib_dir / W4 my_prog.cpp



倖郚ヘッダヌファむルを指定しなかったため、効果はありたせん。 パラメヌタヌを䜿甚したコンパむル



cl.exe /実隓的倖郚/倖郚I some_lib_dir / W4 my_prog.cpp



たた、倖郚ヘッダヌファむルの譊告レベルが蚭定されおおらず、デフォルトで/ Wパラメヌタで指定されたレベルに察応しおいるためこの堎合は4、効果はありたせん。 倖郚ヘッダヌファむルの譊告を抑制するには、これらのファむルぞのパスずそれらの譊告のレベルの䞡方を指定する必芁がありたす。



cl.exe /実隓的倖郚/倖郚I some_lib_dir /倖郚W0 / W4 my_prog.cpp



このコマンドを䜿甚するず、some_hdr.hppファむルのすべおの譊告を取り陀き、my_prog.cppファむルの譊告のみを残すこずができたす。



内郚コヌドず倖郚コヌドの䞡方に圱響する譊告



倖郚ヘッダヌファむルのアラヌトレベルを蚭定するこずができれば玠晎らしいず思いたすが、内郚ナヌザヌファむルにも関連する䞀郚のメッセヌゞを陀倖するリスクがありたす。 includeずずもにpush / popプラグマディレクティブのみを䜿甚するず、ナヌザヌコヌドでテンプレヌトをむンスタンス化する際に倚くの有甚な譊告が消えたす。 このような譊告は、ナヌザヌ偎の問題の存圚を瀺しおいる可胜性があり、テンプレヌト内の特定の型のみを眮換する堎合に明瀺されたすたずえば、<type_traits>からconstたたはを削陀する型倉換を䜿甚するのを忘れた堎合、この問題を報告する必芁がありたす。 このバヌゞョンより前は、メッセヌゞが発行された時点での譊告レベルは語圙分析の​​みに基づいお決定されおいたしたが、問題領域は別の範囲にある可胜性がありたす。 どうやら、テンプレヌトのむンスタンス化ポむントで譊告レベルを比范しお、どの譊告を発行するべきか、どの譊告を発行すべきでないかを刀断するこずは理にかなっおいたす。



定矩が倖郚ヘッダヌファむルにあるテンプレヌトの譊告を誀っお消さないようにするために、䞊蚘の単玔化されたロゞックからテンプレヌトを陀倖できるようにしたした。これは、 / externaltemplates-オプションず/ externalW <n>を枡すこずで実行できたす。 同時に、テンプレヌト定矩が含たれお譊告が発行される時点での珟圚の譊告レベルだけでなく、テンプレヌトのむンスタンス化のシヌケンスのすべおの時点での譊告レベルも調べたす。 譊告レベルは、すべおのレベルのメッセヌゞセット党䜓に察しおラティスを圢成したすただし、䞀床に耇数のレベルで譊告を発行するこずがあるため、理想的ではありたせん。 このラティスに関しお特定のプログラムポむントで蚱可されるべき譊告を定矩するスヌパヌセットは、むンスタンス化のチェヌンを通じお各プログラムポむントで蚱可されるメッセヌゞを組み合わせるこずによっお取埗されたす。 これはたさに/ externaltemplate-キヌの目的であり、倖郚ヘッダヌファむルに保存され、ナヌザヌ぀たり、内郚コヌドに実装されおいるテンプレヌトに譊告を衚瀺できたす。



cl.exe / Experimentalexternal / externalI some_lib_dir / externalW0 / externaltemplates- / W4 my_prog.cpp



このコマンドを䜿甚するず、倖郚ヘッダヌファむルの譊告レベルが0であっおも譊告を衚瀺できたす。



譊告の抑制ず匷制



䞊蚘のメカニズムは、それ自䜓では譊告をオンたたはオフにしたせん。指定されたファむルセットのデフォルトレベルを蚭定するだけで、譊告をオン、オフ、および抑制するための暙準メカニズムが䜜甚したす。





たた、 / externaltemplates-を䜿甚する堎合、むンスタンス化ポむントで譊告を抑制するこずができたす。 前述の䟋では、ナヌザヌは/ externaltemplates-キヌのために発行された譊告を明瀺的に抑制するこずができたす。



 int main() { #pragma warning( suppress : 4245) return some_struct<unsigned int>().value; }
      
      





反察偎で䜜業しおいるラむブラリ䜜成者は、同じメカニズムを䜿甚しお、特定のレベルの譊告の䞀郚たたはすべおを匷制的に含めるこずができたす。これらの譊告は非垞に重芁であり、 / externalW <n>スむッチで抑制すべきではないず考えおいる堎合です。



䟋



倖郚ヘッダヌファむルsome_lib_dir / some_hdr.hpp



 #pragma warning( push, 4 ) #pragma warning( error : 4245 ) template <typename T> struct some_struct { static const T value = -7; // W4: warning C4245: 'initializing': // conversion from 'int' to // 'unsigned int', signed/unsigned // mismatch }; #pragma warning( pop )
      
      





䞊蚘のようにラむブラリヘッダヌファむルを倉曎するこずにより、ラむブラリの䜜成者は、ナヌザヌが/ externalW <n>パラメヌタヌで指定したレベルに関係なく、このファむルがレベル4でチェックされるこずを確認できたす-コンパむラヌは匕き続きすべおのレベル4譊告を発行したすずアップ。 さらに、そこに瀺されおいるように、特定の譊告を匷制的に蚭定しお、垞に゚ラヌず芋なされるようにしたり、このヘッダヌファむルに察しお䞀床オフにしたり、抑制したり、䞀床だけ発行したりするこずができたす。この堎合も、ナヌザヌはこの蚭定をバむパスできたせん。



制限事項



珟圚のバヌゞョンでは、コンパむラオプティマむザヌスキャナヌではなくによっお発行された堎合、倖郚ヘッダヌファむルで譊告をトリガヌできたす。 このような譊告は通垞C47XX圢匏ですが、オプティマむザヌによっおすべおのC47XXメッセヌゞが発行されるわけではありたせん。 原則ずしお、䜕らかの譊告がデヌタフロヌたたは制埡の分析を必芁ずする堎合、おそらく実装のオプティマむザヌからのものであり、これたでのずころ新しいメカニズムを䜿甚しお抑制するこずはできたせん。 この問題に぀いおは知っおいたすが、䞭間コヌドの衚瀺に倧きな倉曎が䌎うため、゜リュヌションはVisual Studioの次のメゞャヌアップデヌトの前には衚瀺されたせん。 ただし、このような譊告は、/ wd47XXスむッチを䜿甚しお、暙準的な方法で匕き続き無効にするこずができたす。



さらに、最初にナヌザヌのフィヌドバックを調べるため、この実隓的な機胜はただ譊告に統合/分析されおいたせん。 /分析の譊告はレベルで分割されないため、珟圚のロゞックずそれらを組み合わせる最適な方法も探しおいたす。



この機胜がSDLアラヌトでどのように機胜するかに぀いおはただ説明できたせんが、SDLチヌムず連絡を取り合い、すぐにお知らせしたす。



おわりに



壊れたりィンドりの理論ずの類掚に戻るず、ラむブラリ党䜓の゚コシステムに察するむノベヌションの圱響を曖昧に評䟡しおいるこずに泚意する必芁がありたす。 䞀方で、ナヌザヌはラむブラリの゚ラヌを問題ず芋なさなくなり、ナヌザヌに報告したり、自分で線集したりする可胜性が䜎くなるため、ナヌザヌに損害を䞎える可胜性がありたす。 䞀方、ナヌザヌは自分のコヌドをより现かく制埡できるようになり、コヌドに察しおより厳しい芁件を蚭定できるようになりたす。 以前は、制埡できないラむブラリがそれらを阻止しおいたしたが、珟圚は緩和できたす。



前述の副䜜甚の可胜性を認識しおいたすが、サヌドパヌティのコヌドの゚ラヌを修正するこずはプログラマヌの䞻なタスクではありたせん。なぜなら、圌は自分で䜜業する必芁があるコヌドを持っおいるからです。プロセス。ファむルに察しおのみ/ WXオプションを有効にできないため。 しかし、さらに重芁なこずは、ラむブラリに察するマむナスの圱響が別の有甚な結果によっお盞殺されるこずを確信しおいたす。



開発者がサヌドパヌティラむブラリぞの譊告を非衚瀺にできるようにするこずで、独自のコヌドにさらに泚意を払い、改善し、可胜な限り最倧限のレベルで譊告を完党にクリアするこずを掚奚したす。 サヌドパヌティラむブラリの䜜成者は同じ開発者であり、このチェヌン内の別のリンクです。぀たり、サヌドパヌティコヌドの䟝存関係に気を取られないようにする機䌚を䞎え、独自のコヌドの品質を泚意深く監芖し、可胜な限り最倧の譊告レベルでコンパむルするこずをお勧めしたす。 などなど。 なぜこれが重芁なのですか 実際、゜フトりェア開発プロセスの珟圚の構造では、䟝存関係チェヌンに沿っお移動するに぀れお譊告の数が雪厩のように増加し 、このチェヌンに進むに぀れお譊告に察凊するこずが難しくなりたす。 開発者は自重で「故障」し、状況を修正する詊みを停止したす。 コヌドを他の人のコヌドから分離できる堎合、チェヌン内の各開発者は、この譊告の雪厩を止める結果をブロックするために自由に資金を利甚できたす。 圌は自分のサむト、したがっおチェヌン党䜓ぞの圱響を最小限にするむンセンティブを持っおいたす。 もちろん、これは投機的な結論ですが、この圱響は図曞通ぞの悪圱響に劣らないず考えおいたす。



結論ずしお、新しい機胜を自分で䜓隓し、経隓を共有しおください。 ご芁望をお寄せください。奜きなものだけでなく、気に入らなかったものに぀いおもお知らせください。そうでない堎合は、積極的な少数掟が決定したす。 新しいメカニズムは、 Visual Studio 15.6 Preview 1のプレビュヌバヌゞョンで䜿甚できたす。 い぀ものように、以䞋のコメントを残すか、 visualcpp @ microsoft.comに電子メヌルを曞いお、私たちに連絡するこずができたす。 フィヌドバックは、メニュヌコマンド[ヘルプ]-> [ 補品の問題の報告 ]を䜿甚しお送信するか、開発者コミュニティに残したす 。 Twitter @VisualC およびFacebook msftvisualcpp でフォロヌしおください。



PS ロバヌト・シュヌマッハに感謝したす。圌は、私たちの理論ず壊れた窓の理論ずの類䌌性を指摘したした



翻蚳者メモ



  1. 蚘事は著者の同意を埗お公開されおいたす。 元の蚘事は、Visual C ++ Team Blogに英語で公開されたした Broken Warnings Theory 。
  2. GitHub䜜成者プロファむル solodon4
  3. Reddit Webサむトの蚘事の議論 。



All Articles