2018幎のC ++プロゞェクトのトップ10゚ラヌ

2018幎が終わっおからすでに3か月が経過しおいたす。 倚くの人にずっお、それはほずんど気付かれずに飛びたしたが、PVS-Studioの開発者である私たちにずっおは、非垞に飜和しおいるこずが刀明したした。 私たちは、倧衆ぞの静的解析の進歩のために倧胆に戊い、倧胆に戊い、C、C ++、C、およびJavaで曞かれたオヌプン゜ヌスプロゞェクトの新しい゚ラヌを探したした。 この蚘事で収集した10個の最も興味深いものです















PVS-Studio静的コヌドアナラむザヌを䜿甚しお、興味深い堎所を怜玢したした。 䞊蚘の蚀語で蚘述されたコヌドの゚ラヌおよび朜圚的な脆匱性を怜出できたす。



自分で゚ラヌを探すこずに興味がある堎合は、い぀でも圓瀟のアナラむザヌをダりンロヌドしお詊すこずができたす。 孊生や熱心なプログラマヌ向けのアナラむザヌの無料版、オヌプン゜ヌスプロゞェクトの開発者向けの無料ラむセンス 、およびすべおすべおの詊甚版を提䟛しおいたす。 おそらく、来幎たでにトップ10を獲埗できるでしょうか :)



泚読者が自分で確認し、アナラむザヌの譊告を芋る前に、異垞を自分で特定するこずをお勧めしたす。 いく぀の間違いを芋぀けるこずができたすか



10䜍



出兞 そしお再び宇宙ぞナニコヌンステラリりムが蚪れた方法



この゚ラヌは、Stellarium仮想プラネタリりムの確認䞭に発芋されたした。



䞊蚘のコヌドスニペットは、小さなものですが、ややトリッキヌな゚ラヌを含んでいたす。



Plane::Plane(Vec3f &v1, Vec3f &v2, Vec3f &v3) : distance(0.0f), sDistance(0.0f) { Plane(v1, v2, v3, SPolygon::CCW); }
      
      





芋぀けた



PVS-Studio譊告 V603オブゞェクトは䜜成されたしたが、䜿甚されおいたせん。 コンストラクタを呌び出す堎合は、「this-> Plane :: Plane....」を䜿甚する必芁がありたす。 Plane.cpp 29



コヌドの䜜成者は、メむンコンストラクタヌに埋め蟌たれた別のコンストラクタヌを䜿甚しお、オブゞェクトのフィヌルドの䞀郚を初期化するこずを望んでいたした。 確かに、圌は可芖領域を離れたずきに砎壊される䞀時オブゞェクトのみを䜜成できたした。 したがっお、オブゞェクトのいく぀かのフィヌルドは初期化されたせん。



ネストされたコンストラクタヌ呌び出しの代わりに、C ++ 11で導入された委任コンストラクタヌを䜿甚する必芁がありたす。 たずえば、これを行うこずができたす



 Plane::Plane(Vec3f& v1, Vec3f& v2, Vec3f& v3) : Plane(v1, v2, v3, SPolygon::CCW) { distance = 0.0f; sDistance = 0.0f; }
      
      





その埌、すべおの必須フィヌルドが正しく初期化されたす。 それは玠晎らしいこずではありたせんか



9䜍



゜ヌス Perl 5マクロが゚ラヌを隠す方法



9番目は、Perl 5゜ヌスコヌドからの泚目すべきマクロです。



同僚のSvyatoslavは、蚘事を曞くための゚ラヌを収集しお、マクロの䜿甚に関しおアナラむザヌによっお発行された譊告に遭遇したした。 ここにありたす



 PP(pp_match) { .... MgBYTEPOS_set(mg, TARG, truebase, RXp_OFFS(prog)[0].end); .... }
      
      





問題が䜕であるかを知るために、スノィアトスラフはさらに掘り䞋げたした。 圌はマクロの定矩を開き、さらにいく぀かのネストされたマクロが含たれおいるこずを確認したしたが、その䞀郚にはネストされたマクロも含たれおいたした。 理解するのが非垞に困難であったため、前凊理枈みのファむルを䜿甚する必芁がありたした。 しかし、悲しいかな、これは圹に立ちたせんでした。 前のコヌド行の代わりに、Svyatoslavはこれを発芋したした。



 (((targ)->sv_flags & 0x00000400) && (!((targ)->sv_flags & 0x00200000) || S_sv_only_taint_gmagic(targ)) ? (mg)->mg_len = ((prog->offs)[0].end), (mg)->mg_flags |= 0x40 : ((mg)->mg_len = (((targ)->sv_flags & 0x20000000) && !__builtin_expect(((((PL_curcop)->cop_hints + 0) & 0x00000008) ? (_Bool)1 :(_Bool)0),(0))) ? (ssize_t)Perl_utf8_length( (U8 *)(truebase), (U8 *)(truebase)+((prog->offs)[0].end)) : (ssize_t)((prog->offs)[0].end), (mg)->mg_flags &= ~0x40));
      
      





è­Šå‘ŠPVS-Studio V502 「」挔算子は、予想ずは異なる方法で動䜜する可胜性がありたす。 「」挔算子の優先順䜍は、「&&」挔算子よりも䜎くなっおいたす。 pp_hot.c 3036



私の目でそのような゚ラヌを芋぀けるのは難しいず思いたす。 正盎なずころ、私たちはこのコヌドを長い間黙想し、実際にここに間違いはないずいう結論に達したした。 しかし、いずれにしおも、これは読みにくいコヌドのかなり面癜い䟋です。



マクロは悪であるず蚀われおいたす。 もちろん、それらが䞍可欠であるこずが刀明する堎合もありたすが、マクロを関数に眮き換えるこずができる堎合は、必ず実行する必芁がありたす。



ネストされたマクロは特に困りたす。 理解が難しいだけでなく、予枬できない結果をもたらす可胜性もありたす。 マクロの䜜成者が誀っおそのようなマクロを間違えた堎合、関数内で芋぀けるよりもはるかに困難になりたす。



8䜍



出兞 Chromiumその他の゚ラヌ



次の䟋は、Chromiumプロゞェクトの分析に関する䞀連の蚘事から匕甚したものです。 圌女はWebRTCラむブラリで自身をカバヌしたした。



 std::vector<SdpVideoFormat> StereoDecoderFactory::GetSupportedFormats() const { std::vector<SdpVideoFormat> formats = ....; for (const auto& format : formats) { if (cricket::CodecNamesEq(....)) { .... formats.push_back(stereo_format); } } return formats; }
      
      





PVS-Studio譊告 V789 CWE-672範囲ベヌスのforルヌプで䜿甚される「formats」コンテナのむテレヌタは、「push_back」関数の呌び出し時に無効になりたす。 stereocodecfactory.cc 89



゚ラヌは、範囲ベヌスのforルヌプ内でフォヌマットベクトルのサむズが倉化するこずです。 範囲ベヌスのルヌプはむテレヌタヌに基づいおいるため、このようなルヌプ内のコンテナヌのサむズを倉曎するず、これらのむテレヌタヌが無効になる可胜性がありたす。



明瀺的な反埩子を䜿甚しおルヌプを曞き換えるず、この゚ラヌが続きたす。 したがっお、明確にするために、次のコヌドを䜿甚できたす。



 for (auto format = begin(formats), __end = end(formats); format != __end; ++format) { if (cricket::CodecNamesEq(....)) { .... formats.push_back(stereo_format); } }
      
      





たずえば、 push_backメ゜ッドを䜿甚するず、ベクトルが解攟される堎合があり、むテレヌタは無効なメモリ領域を指したす。



このような゚ラヌを回避するには、ルヌルを順守する必芁がありたす。ルヌプ内でコンテナのサむズを倉曎しないでください。条件はこのコンテナに関連付けられおいたす。 これは、範囲ベヌスのルヌプおよび反埩子を䜿甚するルヌプに適甚されたす。 StackOverflowのディスカッションで、どの操䜜がむテレヌタの無効化に぀ながるかに぀いお読むこずができたす。



7䜍



出兞 Godot静的コヌドアナラむザヌの定期的な䜿甚



ビデオゲヌム業界の最初の䟋は、Godotゲヌム゚ンゞンで発芋したコヌドのスニペットです。 あなたの目で゚ラヌを発芋するために汗をかかなければならないかもしれたせんが、私たちの掗緎された読者はそれを凊理できるず確信しおいたす



 void AnimationNodeBlendSpace1D::add_blend_point( const Ref<AnimationRootNode> &p_node, float p_position, int p_at_index) { ERR_FAIL_COND(blend_points_used >= MAX_BLEND_POINTS); ERR_FAIL_COND(p_node.is_null()); ERR_FAIL_COND(p_at_index < -1 || p_at_index > blend_points_used); if (p_at_index == -1 || p_at_index == blend_points_used) { p_at_index = blend_points_used; } else { for (int i = blend_points_used - 1; i > p_at_index; i++) { blend_points[i] = blend_points[i - 1]; } } .... }
      
      





PVS-Studio譊告 V621 CWE-835 「for」挔算子の怜査を怜蚎しおください。 ルヌプが誀っお実行されるか、たったく実行されない可胜性がありたす。 animation_blend_space_1d.cpp 113



サむクルの状態をさらに詳しく考えおみたしょう。 カりンタヌ倉数は、倀blend_points_used-1で初期化されたす。 同時に、前の2぀のチェック ERR_FAIL_CONDおよびif に基づいお、ルヌプの実行時に、 blend_points_usedが垞にp_at_indexよりも倧きいこずが明らかになりたす。 したがっお、ルヌプ条件が垞に真になるか、ルヌプがたったく実行されたせん。



blend_points_usedが1 == p_at_indexの堎合、ルヌプは実行されたせん。



他のすべおの堎合、カりンタiはルヌプの各反埩で増加するため、チェックi> p_at_indexは垞にtrueです。



サむクルは氞遠に続くように芋えるかもしれたせんが、そうではありたせん。



たず、倉数iの敎数オヌバヌフロヌが発生したすが、これは未定矩の動䜜です。 したがっお、これに頌る䟡倀はありたせん。



iがunsigned int型であった堎合、カりンタヌが可胜な最倧倀に達した埌、 i ++挔算子はそれを0に倉換したす 。 この動䜜は暙準で定矩されおおり、「眲名なしラッピング」ず呌ばれたす。 ただし、このようなメカニズムを䜿甚するこずも良い考えではないこずに泚意する必芁がありたす。



そもそもそれは最初の堎所でしたが、結局はただ2぀目がありたす 実際には、敎数オヌバヌフロヌに達するこずさえありたせん。 アレむが海倖に行く前。 これは、アレむに割り圓おられたブロック倖のメモリ領域にアクセスしようずするこずを意味したす。 そしお、これも挠然ずした行動です。 叀兞的な䟋:)



このような゚ラヌを簡単に回避できるようにするため、いく぀かの掚奚事項のみを瀺したす。



  1. よりシンプルで盎感的なコヌドを曞く
  2. より培底的なコヌドレビュヌを行い、新たに蚘述されたコヌドに察しおより倚くのテストを蚘述したす
  3. 静的アナラむザヌを䜿甚したす;












6䜍



゜ヌス Amazon LumberyardThe Cry of the Soul



gamedev業界の別の䟋、぀たりAmazon Lumberyard AAA゚ンゞンの゜ヌスコヌドから。



 void TranslateVariableNameByOperandType(....) { // Igor: yet another Qualcomm's special case // GLSL compiler thinks that -2147483648 is // an integer overflow which is not if (*((int*)(&psOperand->afImmediates[0])) == 2147483648) { bformata(glsl, "-2147483647-1"); } else { // Igor: this is expected to fix // paranoid compiler checks such as Qualcomm's if (*((unsigned int*)(&psOperand->afImmediates[0])) >= 2147483648) { bformata(glsl, "%d", *((int*)(&psOperand->afImmediates[0]))); } else { bformata(glsl, "%d", *((int*)(&psOperand->afImmediates[0]))); } } bcatcstr(glsl, ")"); .... }
      
      





PVS-Studio譊告 V523 「then」ステヌトメントは「else」ステヌトメントず同等です。 toglsloperand.c 700



Amazon Lumberyardは、クロスプラットフォヌム゚ンゞンずしお開発されおいたす。 したがっお、開発者はできるだけ倚くのコンパむラをサポヌトしようずしおいたす。 プログラマヌIgorは、コメントで䌝えられおいるように、Qualcommコンパむラヌに遭遇したした。



むゎヌルがタスクを完了し、コンパむラの「偏執狂的な」チェックに察凊できたかどうかはわかりたせんが、非垞に奇劙なコヌドを残したした。 ifステヌトメントの thenブランチずelseブランチの䞡方にたったく同じコヌドが含たれおいるのは奇劙です。 ほずんどの堎合、このような゚ラヌは、粗雑なコピヌペヌストの結果ずしお発生したものです。



ここで䜕がアドバむスできるかさえわかりたせん。 そのため、Amazon Lumberyard開発者がバグの修正に成功し、プログラマヌのむゎヌルに幞運を祈りたす



5䜍



出兞 繰り返しになりたすが、PVS-Studioアナラむザヌは人間よりも泚意深いこずが刀明したした



次の䟋で興味深い話が起こりたした。 私の同僚のAndrei Karpovは、Qtフレヌムワヌクの次のテストに関する蚘事を準備しおいたした。 泚目に倀する゚ラヌを曞く過皋で、圌はアナラむザヌからの譊告に遭遇したしたが、それは間違っおいるず考えたした。 関連するコヌドスニペットず譊告を次に瀺したす。



 QWindowsCursor::CursorState QWindowsCursor::cursorState() { enum { cursorShowing = 0x1, cursorSuppressed = 0x2 }; CURSORINFO cursorInfo; cursorInfo.cbSize = sizeof(CURSORINFO); if (GetCursorInfo(&cursorInfo)) { if (cursorInfo.flags & CursorShowing) // <= V616 .... }
      
      





PVS-Studio譊告 V616 CWE-480倀が0の「CursorShowing」ずいう名前の定数は、ビット単䜍の操䜜で䜿甚されたす。 qwindowscursor.cpp 669



぀たり、PVS-Studioは、明らかに゚ラヌがなかった堎所で誓いたした CursorShowing定数が0であるこずはできたせん。文字通り、その䞊の2、3行は1に初期化されるからです。



怜蚌に䞍安定なバヌゞョンのアナラむザヌが䜿甚されたため、Andreiは譊告の正確さを疑っおいたした。 圌はこのコヌドのセクションを数回泚意深く調べたしたが、それでも゚ラヌは芋぀かりたせんでした。 その結果、他の同僚が状況を修正できるように、圌はこの誀怜知をバグトラッカヌに曞きたした。



そしお、詳现な分析によっおのみ、PVS-Studioが再び人間よりも泚意深いこずが明らかになりたした。 倀0x1は名前付き定数cursorShowingに割り圓おられ、ビット定数挔算「and」には名前付き定数CursorShowingが含たれたす。 最初は小文字で始たり、2番目は倧文字で始たるため、これらは完党に異なる定数です。



QWindowsCursorクラスには実際にその名前の定数が含たれおいるため、コヌドは正垞にコンパむルされたす。 圌女の定矩は次のずおりです。



 class QWindowsCursor : public QPlatformCursor { public: enum CursorState { CursorShowing, CursorHidden, CursorSuppressed }; .... }
      
      





名前付き列挙型定数を明瀺的に割り圓おない堎合、デフォルトで初期化されたす。 CursorShowingは列挙の最初の芁玠であるため、 0に蚭定されたす 。



このような間違いを防ぐために、゚ンティティにあたりにも䌌た名前を付けないでください。 これらの゚ンティティが同じタむプであるか、暗黙的に盞互にキャストできる堎合は、特にこのルヌルに埓う必芁がありたす。 実際、このような堎合、目で゚ラヌを怜出するこずは事実䞊䞍可胜であり、正しくないコヌドは正垞にコンパむルされ、プロゞェクト内で問題なく動䜜したす。



4䜍



゜ヌス 入力デヌタを凊理しお、足で撮圱したす



トップ3のファむナリストに近づいおいたすが、FreeSWITCHプロゞェクトの゚ラヌは次々に発生したす。



 static const char *basic_gets(int *cnt) { .... int c = getchar(); if (c < 0) { if (fgets(command_buf, sizeof(command_buf) - 1, stdin) != command_buf) { break; } command_buf[strlen(command_buf)-1] = '\0'; /* remove endline */ break; } .... }
      
      





PVS-Studio譊告 V1010 CWE-20未チェックの汚染デヌタがむンデックスで䜿甚されおいたす 'strlencommand_buf'。



アナラむザヌは、匏strlencommand_buf-1が未怜蚌デヌタを䜿甚するこずを譊告したす。 そしお実際C蚀語文字列単䞀の文字-'\ 0'を含むの芳点からcommand_bufが空であるこずが刀明した堎合、 strlencommand_bufは0を返したす 。 この堎合、 command_buf [-1]が呌び出され 、未定矩の動䜜を衚したす。 トラブル



この間違いの正䜓は、それがなぜ起こるかでさえなく、 どのように起こるかです。 この゚ラヌは、自分で「タッチ」しお再珟できる楜しい䟋の1぀です。 FreeSwitchを起動し、䞊蚘のコヌドセクションの実行に぀ながるアクションを実行し、プログラムに入力甚の空行を枡すこずができたす。



その結果、手銖を軜くたたくず、動䜜䞭のプログラムが動䜜しないプログラムになりたすいいえ、 ゚レガントではありたせん。 この゚ラヌを再珟する方法の詳现は、䞊蚘のリンクの゜ヌス蚘事に蚘茉されおいたすが、今のずころは明確な結果を瀺したす。







入力は䜕でも構いたせんので、垞に確認する必芁がありたす。 そうすれば、アナラむザヌは誓わず、プログラムの信頌性が高たりたす。



勝者に察凊する時が来たした決勝戊に移りたす















3䜍



出兞 NCBI Genome Workbench絶滅危Research研究



3人の受賞者は、NCBI Genome Workbenchプロゞェクトのコヌド遺䌝デヌタの研究ず分析のためのツヌルセットによっお開かれたす。 ここで間違いを芋぀けるために遺䌝子組み換えスヌパヌマンである必芁はありたせんが、かなりの数がこの可胜性を認識しおいたす。



 /** * Crypt a given password using schema required for NTLMv1 authentication * @param passwd clear text domain password * @param challenge challenge data given by server * @param flags NTLM flags from server side * @param answer buffer where to store crypted password */ void tds_answer_challenge(....) { .... if (ntlm_v == 1) { .... /* with security is best be pedantic */ memset(hash, 0, sizeof(hash)); memset(passwd_buf, 0, sizeof(passwd_buf)); ... } else { .... } }
      
      





PVS-Studioの譊告





なんずか間違いを芋぀けたしたか もしそうなら、あなたは-よくやった..たあ、たたはただ遺䌝子組み換えスヌパヌマン。



実際、珟代の最適化コンパむラは、アセンブルされたプログラムをより高速に動䜜させるために倚くのこずを行うこずができたす。 特に、コンパむラは、 memsetに枡されたバッファが他のどこでも䜿甚されおいないこずを远跡できたす。



この堎合、「䞍必芁な」 memset呌び出しを削陀し、削陀するすべおの暩利を埗るこずができたす。 次に、重芁なデヌタを保存するバッファをメモリに残しお、攻撃者を喜ばせたす。



このような背景に察しお、文孊的解説「安党性を身に付けお、぀たらない」はさらに面癜く芋えたす。 このプロゞェクトのために発行された譊告の数が非垞に少ないこずから刀断するず、開発者は泚意を払っお安党なコヌドを曞くために非垞に懞呜に努力したした。 ただし、ご芧のずおり、このセキュリティの欠陥をスキップするこずは非垞に簡単です。 Common Weakness Enumerationによるず、欠陥はCWE-14に分類されたすバッファをクリアするコヌドのコンパむラ削陀。



メモリを安党にクリアするには、 memset_s関数を䜿甚したす。 memsetよりも安党であるだけでなく、コンパむラによっお「無芖」するこずもできたせん。



2䜍



出兞 PVS-Studioがどのように3人半のプログラマヌよりも泚意を払ったのか



このトップの銀メダリストがお客様から送られおきたした。 圌は、アナラむザヌが誀った譊告を発したこずを確信しおいたした。



ナヌゞヌンは手玙を受け取り、簡単にスキャンしおスノィアトスラフに送った。 Svyatoslavは、クラむアントから送信されたコヌドの䞀郚を思慮深く芋お、「アナラむザヌはあからさたに間違っおいるのではないか」ず考えたした。 したがっお、圌はアンドレむず盞談に行きたした。 圌はたた、サむトをチェックしお決定したした。実際、アナラむザヌは停陜性を出したす。



あなたは䜕をするこずができたす、あなたはそれを修正する必芁がありたす。 そしお、Svyatoslavがタスクをバグトラッカヌずしお圢匏化するための合成䟋を䜜成し始めたずきのみ、圌は䜕が起こっおいるのかを理解したした。



実際、コヌドにぱラヌが存圚しおいたしたが、プログラマヌが゚ラヌを怜出するこずはできたせんでした。 正盎なずころ、この蚘事の著者も成功したせんでした。



そしおこれは、分析装眮が間違った堎所に察しお明確に譊告を発したずいう事実にもかかわらずです



そのようなcraftな間違いを芋぀けるこずができたすか 譊戒ず泚意力を確認しおください。













PVS-Studio譊告

あなたが成功した堎合-あなたは私の敬意を保持したせん



゚ラヌは、論理吊定挔算子が条件党䜓に適甚されず、その最初の郚分匏にのみ適甚されるずいう事実にありたす。



 !((ch >= 0x0FF10) && (ch <= 0x0FF19))
      
      





この条件が満たされる堎合、倉数chの倀は間隔[0x0FF10 ... 0x0FF19]にありたす。 したがっお、さらに4぀の比范は意味がありたせん。垞に真たたは停のいずれかになりたす。



このような゚ラヌを回避するには、いく぀かのルヌルに埓う䟡倀がありたす。 たず、コヌドをテヌブルに合わせるのは非垞に䟿利で明確です。 第二に、括匧で匏をオヌバヌロヌドしないでください。 たずえば、このコヌドは次のように曞き換えるこずができたす。



 const bool isLetterOrDigit = (ch >= 0x0FF10 && ch <= 0x0FF19) // 0..9 || (ch >= 0x0FF21 && ch <= 0x0FF3A) // A..Z || (ch >= 0x0FF41 && ch <= 0x0FF5A); // a..z if (!isLetterOrDigit)
      
      





それから、第䞀に、ブラケットの数がはるかに少なくなり、第二に、目が犯した間違いを「キャッチ」する確率が高くなりたす。



そしお今-チェリヌ最初の堎所に移動したす



䞀䜍



出兞 ショック状態のシステム䌝説的なシステムショックの゜ヌスコヌドの興味深い゚ラヌ



したがっお、今日のトップのファむナリストは、䌝説的なシステムショックの間違いです 1994幎にリリヌスされたこのゲヌムは、Dead Space、BioShock、Deus Exなどの象城的なゲヌムの先駆者であり、刺激を受けたした。



しかし、最初に、私は䜕かを認めなければなりたせん。 これから説明する内容には、゚ラヌは含たれおいたせん。 抂しお、それはコヌドの䞀郚でさえありたせんが、私はこれをあなたず共有しないこずを拒みたせんでした



実際、ゲヌムの゜ヌスコヌドを分析する過皋で、同僚のビクトリアは倚くの興味深いコメントを芋぀けたした。 あちこちで、突然、遊び心ず皮肉な発蚀、さらには詩がありたした



 // I'll give you fish, I'll give you candy, // I'll give you, everything I have in my hand // that kid from the wrong side came over my house again, // decapitated all my dolls // and if you bore me, you lose your soul to me // - "Gepetto", Belly, _Star_ // And here, ladies and gentlemen, // is a celebration of C and C++ and their untamed passion... // ================== TerrainData terrain_info; // Now the actual stuff... // ======================= // this is all outrageously horrible, as we dont know what // we really need to deal with here // And if you thought the hack for papers was bad, // wait until you see the one for datas... - X // Returns whether or not in the humble opinion of the // sound system, the sample should be politely obliterated // out of existence // it's a wonderful world, with a lot of strange men // who are standing around, and they all wearing towels
      
      





ロシア語を話す読者のために、おおよその無料翻蚳を䜜成したした。

 //    ,    , //    ,       //      //      //     //     ,      // - "Gepetto", Belly, _Star_ //  ,   , //    C  C++     // ================== TerrainData terrain_info; //    ... // ======================= //    ,     , //         //    ,          //      ,      ... - X //       , //         //   ,     //   ,    
      
      





これらのコメントは、90幎代前半にゲヌムの開発者によっお残されたした...ずころで、システムショックのチヌフデザむナヌであるダグチャヌチもコヌドを曞いおいたした。 これらのコメントのいずれかが圌によっお個人的に曞かれたのかもしれたせん。 タオルを着た男性に぀いお-これは圌の䜜品ではないこずを願っおいたす:)



おわりに



結論ずしお、新しい゚ラヌを探し、それらに぀いおの蚘事を曞いおくれた同僚に感謝したいず思いたす。みんなありがずうあなたがいなければ、この蚘事はそれほど面癜くなかったでしょう。



たた、私たちの業瞟に぀いおも少しお話したいず思いたす。なぜなら、1幎間、私たちは単なるミスを探す以䞊のこずに取り組んできたからです。たた、アナラむザヌを開発および改善し、その結果、倧幅な倉曎が行われたした。



たずえば、いく぀かの新しいコンパむラのサポヌトを远加し、蚺断ルヌルのリストを拡匵したした。たた、MISRA CおよびMISRA C ++暙準の初期サポヌトも提䟛したした。最も重芁で時間のかかるむノベヌションは、新しい蚀語のサポヌトでした。はい、Javaコヌドを分析できるようになりたしたそしお、アむコンを曎新したした :)



読者にも感謝したい。蚘事を読んで曞いおくれおありがずうあなたのフィヌドバックは非垞に心地よく、私たちにずっお重芁です。



これにより、2018幎の䞊䜍10個のC ++゚ラヌが終了したした。䞀番奜きだった堎所ずその理由は2018幎に興味深い䟋に出䌚いたしたかコメントでそれを教えおください



次回たで











この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいGeorge Gribkov。2018幎に芋぀かったC ++プロゞェクトの䞊䜍10個のバグ



All Articles