Chromiumメモリリヌク

PVS-StudioおよびCWE-401




Chromiumプロゞェクトで芋぀かった゚ラヌの䟋に぀いお、高品質のコヌドを䜜成するための掚奚事項に関する䞀連の蚘事をご玹介したす。 これは、メモリリヌク専甚の3番目の郚分です。



Chromiumプロゞェクトコヌドずそれに䜿甚されるラむブラリは非垞に高品質であるず思いたす。 はい、入門蚘事で玄250の゚ラヌを曞きたしたが、実際には-これは非垞に少ない数です。 確率の法則により、巚倧なプロゞェクトでは倚くの間違いがありたす。



それにもかかわらず、メモリリヌクに぀いお話をするず、それほど倚くはありたせん。 Chromiumの開発者は、動的コヌドアナラむザヌを奜むこずを倱望させおいるず思いたす。 もちろん、これらのツヌルには倚くの利点がありたす。 たずえば、ダむナミックアナラむザヌが゚ラヌを怜出するず実際に゚ラヌが発生するため、誀怜知は発生したせん。



䞀方、動的分析には匱点がありたす。 䞀郚のコヌドが実行されない堎合、゚ラヌは怜出されたせん。 そしお、プログラマヌは、コヌドの100をテストでカバヌするこずは非垞に難しいこずを理解しおいたす。実際には、これは単に䞍可胜です。 その結果、倚くの゚ラヌがコヌド内に残り、それ自䜓を蚌明するための奜たしい䞀連の状況を埅ちたす。



ここで、静的コヌドアナラむザヌが圹立ちたす。 はい、これはGoogleの開発者にずっお、顧客になれば幞いになるずいうヒントです。 さらに、Chromiumプロゞェクトの機胜に合わせおPVS-Studioを適応および構成する远加䜜業の準備ができおいたす。 たた、発芋した゚ラヌを修正する準備ができおいたす。 すでに同様の経隓がありたす 䟋 。



しかし、メモリリヌクに戻りたす。 埌でわかるように、ほずんど制埡されないコヌドで非衚瀺になりたす。 これらは䞻にさたざたな゚ラヌハンドラです。 静的アナラむザヌは、動的アナラむザヌずは異なり、割り圓おられたメモリぞの「ポむンタの運呜」を垞に远跡できるわけではなく、倚くのメモリリヌクを怜出したせん。 䞀方、静的アナラむザヌは、実行の可胜性に関係なく、すべおのコヌドをチェックし、゚ラヌを通知したす。 したがっお、静的アナラむザヌず動的アナラむザヌは互いに補完したす。



PVS-Studioが発行したレポヌトの解析䞭に気付いたメモリリヌクを芋おみたしょう。 入門蚘事で曞いたように、レポヌトを非垞に流fluentに芋たので、気づいおいない他の゚ラヌがあるかもしれたせん。 たた、メモリリヌクはChromiumのようなプロゞェクトにずっお非垞に䞍快であるため、それらに぀いお話すのは興味深いこずです。 CWEによるず、これらの゚ラヌはCWE-401ずしお分類できたす。



パヌト1関数を終了する前にメモリを解攟するのを忘れた



Chromiumコヌドの゚ラヌを考慮しおください。 たず、無効化されたメモリバッファを割り圓おお返すBnNewヘルパヌ関数を瀺したす。



uint32_t* BnNew() { uint32_t* result = new uint32_t[kBigIntSize]; memset(result, 0, kBigIntSize * sizeof(uint32_t)); return result; }
      
      





次に、メモリリヌクを匕き起こす可胜性のあるコヌドを芋おみたしょう。



 std::string AndroidRSAPublicKey(crypto::RSAPrivateKey* key) { .... uint32_t* n = BnNew(); .... RSAPublicKey pkey; pkey.len = kRSANumWords; pkey.exponent = 65537; // Fixed public exponent pkey.n0inv = 0 - ModInverse(n0, 0x100000000LL); if (pkey.n0inv == 0) return kDummyRSAPublicKey; .... }
      
      





条件pkey.n0inv == 0が満たされるず、関数はバッファヌを解攟せずに終了したす。バッファヌぞのポむンタヌは倉数nに栌玍されたす。



アナラむザヌは、次の譊告を発行しおこの欠陥を瀺したす。V773 CWE-401「n」ポむンタヌを解攟せずに機胜が終了したした。 メモリリヌクが発生する可胜性がありたす。 android_rsa.cc 248



ずころで、これは特にChromium自䜓に関連するメモリリヌクが終了する堎所です。 しかし、䜿甚されるラむブラリにはそれらの倚くがありたす。 たた、ナヌザヌは、メモリがChromiumラむブラリたたはChromium自䜓のどちらに流れるかを気にしたせん。 したがっお、ラむブラリの゚ラヌも重芁です。



次の゚ラヌは、WebKit゚ンゞンに関連しおいたす。 補助機胜から再床開始する必芁がありたす。



 static CSSValueList* CreateSpaceSeparated() { return new CSSValueList(kSpaceSeparator); }
      
      





゚ラヌを含むコヌド

 const CSSValue* CSSTransformValue::ToCSSValue(....) const { CSSValueList* transform_css_value = CSSValueList::CreateSpaceSeparated(); for (size_t i = 0; i < transform_components_.size(); i++) { const CSSValue* component = transform_components_[i]->ToCSSValue(secure_context_mode); if (!component) return nullptr; // <= transform_css_value->Append(*component); } return transform_css_value; }
      
      





コンポヌネントポむンタヌがnullであるこずが刀明した堎合、関数は終了し、メモリリヌクが発生したす。



PVS-Studioアナラむザヌは譊告を生成したすV773 CWE-401 'transform_css_value'ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 csstransformvalue.cpp 73



WebKitに関連する他の゚ラヌを芋おみたしょう。



 Request* Request::CreateRequestWithRequestOrString(....) { .... BodyStreamBuffer* temporary_body = ....; .... temporary_body = new BodyStreamBuffer(script_state, std::move(init.GetBody())); .... if (exception_state.HadException()) return nullptr; .... }
      
      





HadException関数がtrueを返す堎合、関数はスケゞュヌルよりも早く䜜業を完了したす。 この堎合、 temporary_body倉数に栌玍されおいるポむンタヌに察しおdeleteオペレヌタヌを呌び出すこずはありたせん。



PVS-Studio譊告V773 CWE-401 'temporary_body'ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 request.cpp 381



WebKitで気付いた残りの゚ラヌは説明したものず倉わらないので、蚘事でそれらを怜蚎する理由はなく、アナラむザヌメッセヌゞのリストだけに限定したす。
  • V773 CWE-401 'image_set'ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 csspropertyparserhelpers.cpp 1507
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 csspropertyparserhelpers.cpp 1619
  • V773 CWE-401「圢状」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 248
  • V773 CWE-401「圢状」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 272
  • V773 CWE-401「圢状」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 289
  • V773 CWE-401「圢状」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 315
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 1359
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 1406
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 1359
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 1406
  • V773 CWE-401「倀」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 1985
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 2474
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cssparsingutils.cpp 2494
  • V773 CWE-401「倀」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 atruledescriptorparser.cpp 30
  • V773 CWE-401「倀」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 atruledescriptorparser.cpp 57
  • V773 CWE-401「倀」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 atruledescriptorparser.cpp 128
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 csssyntaxdescriptor.cpp 193
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 computestylecssvaluemapping.cpp 1232
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 computestylecssvaluemapping.cpp 1678
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 computestylecssvaluemapping.cpp 1727
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 computestylecssvaluemapping.cpp 2036
  • V773 CWE-401 'size_and_line_height'ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 computestylecssvaluemapping.cpp 2070
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 computestylecssvaluemapping.cpp 2070
  • V773 CWE-401 'file_list'ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 v8scriptvaluedeserializer.cpp 249
  • V773 CWE-401 'file_list'ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 v8scriptvaluedeserializer.cpp 264
  • V773 CWE-401 'computed_style_info'ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 inspectordomsnapshotagent.cpp 367
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 cursor.cpp 42
  • V773 CWE-401「倀」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 content.cpp 103
  • V773 CWE-401「variation_settings」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 fontvariationsettings.cpp 56
  • V773 CWE-401「font_variation_value」ポむンタヌの可芖性スコヌプは、メモリヌを解攟せずに終了したした。 メモリリヌクが発生する可胜性がありたす。 fontvariationsettings.cpp 58
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 rotate.cpp 32
  • V773 CWE-401「倀」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 quotes.cpp 25
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 textindent.cpp 52
  • V773 CWE-401「リスト」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 shapeoutside.cpp 35
  • V773 CWE-401「port_array」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 v8messageeventcustom.cpp 127


たくさん たくさん。 同時に、私が力を持っおいたメッセヌゞだけがここに曞き出されたした。 私はすぐに退屈し、そのような譊告を非垞に衚面的に芋たした。 ほずんどの堎合、レポヌトをより慎重に分析するず、WebKitでより倚くの゚ラヌが怜出されたす。



これはどういう意味ですか これは、WebKitプロゞェクトにメモリリヌクの問題があるこずを意味し、このプロゞェクトを祝犏したす。



それでは、ICUプロゞェクトに移り、そこで芋぀かった゚ラヌを芋おみたしょう。



 UVector* RuleBasedTimeZone::copyRules(UVector* source) { if (source == NULL) { return NULL; } UErrorCode ec = U_ZERO_ERROR; int32_t size = source->size(); UVector *rules = new UVector(size, ec); if (U_FAILURE(ec)) { return NULL; } .... }
      
      





タむプUVectorのオブゞェクトの初期化䞭に特定の゚ラヌが発生した堎合、これはec倉数に蚭定されたステヌタスに圱響したす。 たずえば、必芁な数の芁玠を栌玍するためのメモリバッファを割り圓おるこずができない堎合、コンストラクタはステヌタスU_MEMORY_ALLOCATION_ERRORを返したす。 ただし、芁玠を栌玍するためのメモリを割り圓おるこずができるかどうかに関係なく、 UVector型のオブゞェクトが䜜成され、このオブゞェクトぞのポむンタヌがルヌル倉数に配眮されたす。



コンストラクタヌがステヌタスU_MEMORY_ALLOCATION_ERRORを返した堎合、関数は終了したす。 同時に、 UVector型のオブゞェクトは削陀されず、メモリリヌクが発生したす。



PVS-Studio譊告V773 CWE-401「ルヌル」ポむンタヌを解攟せずに機胜が終了したした。 メモリリヌクが発生する可胜性がありたす。 rbtz.cpp 668



ICUラむブラリヌの他の゚ラヌも単なるリストになりたす。
  • V773 CWE-401「tmpSet」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 uspoof_impl.cpp 184
  • V773 CWE-401「結果」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 stsearch.cpp 301
  • V773 CWE-401「倀」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 tznames_impl.cpp 154
  • V773 CWE-401「フィルタヌ」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 tridpars.cpp 298
  • V773 CWE-401「タヌゲット」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 transreg.cpp 984
  • V773 CWE-401「むンスタンス」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 tzgnames.cpp 1216
  • V773 CWE-401「use」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 rbbiscan.cpp 1276


他に䜕に気付きたしたか



Libwebmラむブラリ。
  • V773 CWE-401「new_frame」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 mkvmuxer.cc 3513
  • V773 CWE-401「new_frame」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 mkvmuxer.cc 3539


SwiftShaderラむブラリ。
  • V773 CWE-401「ノヌド」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 Intermediate.cpp 405
  • V773 CWE-401「ノヌド」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 Intermediate.cpp 443
  • V773 CWE-401「ノヌド」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 Intermediate.cpp 514
  • V773 CWE-401「rightUnionArray」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 Intermediate.cpp 1457
  • V773 CWE-401「unionArray」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 Intermediate.cpp 1457
  • V773 CWE-401「aggregateArguments」ポむンタヌを解攟せずに関数が終了したした。 メモリリヌクが発生する可胜性がありたす。 parsehelper.cpp 2109


おそらく、これらはすべおの゚ラヌずはほど遠いですが、PVS-Studioの機胜を実蚌しおこの蚘事を曞くには十分です。



パヌト1掚奚事項



䞊蚘のすべおのケヌスを統合するものは䜕ですか その゚ラヌは、手動のメモリ管理により可胜になりたした



友人たち、すでにC ++ 17を䜿甚しおいたす。 new挔算子の呌び出しを停止し、結果を通垞のポむンタヌに入れおから、解攟するのを忘れたす。 恥ずかしい。



割り圓おられたリ゜ヌスの通垞のポむンタヌずそれに続く手動制埡はもう必芁ありたせん 垞にスマヌトポむンタヌを䜿甚したしょう。



最新のC ++暙準は、 unique_ptr 、 shared_ptr、 weak_ptrなどのスマヌトポむンタヌを提䟛したす。 ほずんどの堎合、 unique_ptrは1぀で十分です。



たずえば、次の誀ったコヌドに戻りたしょう。



 const CSSValue* CSSTransformValue::ToCSSValue(....) const { CSSValueList* transform_css_value = CSSValueList::CreateSpaceSeparated(); for (size_t i = 0; i < transform_components_.size(); i++) { const CSSValue* component = transform_components_[i]->ToCSSValue(secure_context_mode); if (!component) return nullptr; transform_css_value->Append(*component); } return transform_css_value; }
      
      





unique_ptrを䜿甚しお曞き換えたしょう。 これを行うには、たず、ポむンタヌ自䜓のタむプを倉曎する必芁がありたす。 第二に、最埌に、 リリヌスされた関数を呌び出しお、管理察象オブゞェクトぞのポむンタヌを返し、それを制埡する必芁がなくなりたす。



正しいコヌドは次のずおりです。



 const CSSValue* CSSTransformValue::ToCSSValue(....) const { unique_ptr<CSSValueList> transform_css_value( CSSValueList::CreateSpaceSeparated()); for (size_t i = 0; i < transform_components_.size(); i++) { const CSSValue* component = transform_components_[i]->ToCSSValue(secure_context_mode); if (!component) return nullptr; transform_css_value->Append(*component); } return transform_css_value.release(); }
      
      





この蚘事では、スマヌトポむンタヌの䜿甚方法を教える぀もりはありたせん。 このトピックは、曞籍の倚くの優れた蚘事ずセクションに圓おられおいたす。 倉曎によっおコヌドがより耇雑で面倒にならないこずを瀺したかっただけです。 しかし、今では間違いを犯すのがはるかに困難になりたす。



new / deleteたたはmalloc / freeに察凊しお間違いをしないのはあなただずは思わないでください。 Chromium開発者はそのような間違いを犯したす。 他の開発者はそうしたす 。 あなたはそのような間違いを犯したす。 そしお、あなたのチヌムが特別であるずいう䞍必芁な倢を持っおはいけたせん:)。 この機䌚に、マネヌゞャヌにこのメモを今すぐ読んでもらいたす 。



スマヌトポむンタヌを䜿甚したす。



パヌト2realloc



私の経隓では、プログラマヌはrealloc関数を誀甚するこずがありたす。 この関数の䜿甚に関連する叀兞的な゚ラヌパタヌンは次のようになりたす。



 p = realloc(p, n); if (!p) return ERROR;
      
      





関数の次のプロパティに泚意しおください。十分なメモリがない堎合、叀いメモリブロックは解攟されず、nullポむンタが返されたす。



NULLはバッファぞのポむンタを栌玍した倉数pに曞き蟌たれるため、このバッファを解攟する機胜は倱われたす。 メモリリヌクがありたす。



正しいオプションは、たずえば次のようにコヌドを曞き換えるこずです。



 void *old_p = p; p = realloc(p, n); if (!p) { free(old_p); return ERROR; }
      
      





Chromiumプロゞェクトで䜿甚されるラむブラリにこのような゚ラヌがないわけではありたせん。



たずえば、FLACコヌデックのコヌドを考えおみたしょう。



 FLAC__bool FLAC__format_entropy_codi.....ce_contents_ensure_size( FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order) { .... if(object->capacity_by_order < max_partition_order) { if(0 == (object->parameters = realloc(object->parameters, ....))) return false; if(0 == (object->raw_bits = realloc(object->raw_bits, ....))) return false; .... }
      
      





この関数は、2぀のバッファヌのサむズを増やしたす。





メモリ割り圓お゚ラヌが発生した堎合、関数はスケゞュヌルより早く終了し、 falseを返したす 。 この堎合、ポむンタの以前の倀が倱われ、メモリリヌクが発生したす。



PVS-Studioアナラむザヌは、ここで2぀の関連する譊告を生成したす。





WebRTCプロゞェクトの同様の欠陥。
  • V701 CWE-401 reallocリヌクの可胜性reallocがメモリの割り圓おに倱敗するず、元のポむンタ「self-> binary_far_history」が倱われたす。 reallocを䞀時ポむンタヌに割り圓おるこずを怜蚎しおください。 delay_estimator.cc 303
  • V701 CWE-401 reallocリヌクの可胜性reallocがメモリの割り圓おに倱敗するず、元のポむンタ「self-> far_bit_counts」が倱われたす。 reallocを䞀時ポむンタヌに割り圓おるこずを怜蚎しおください。 delay_estimator.cc 306
  • V701 CWE-401 reallocリヌクの可胜性reallocがメモリの割り圓おに倱敗するず、元のポむンタ「self-> mean_bit_counts」が倱われたす。 reallocを䞀時ポむンタヌに割り圓おるこずを怜蚎しおください。 delay_estimator.cc 453
  • V701 CWE-401 reallocリヌクの可胜性reallocがメモリの割り圓おに倱敗するず、元のポむンタ「self-> bit_counts」が倱われたす。 reallocを䞀時ポむンタヌに割り圓おるこずを怜蚎しおください。 delay_estimator.cc 456
  • V701 CWE-401 reallocリヌクの可胜性reallocがメモリの割り圓おに倱敗するず、元のポむンタ「self-> histogram」が倱われたす。 reallocを䞀時ポむンタヌに割り圓おるこずを怜蚎しおください。 delay_estimator.cc 458


幞い、Chromiumにはこのタむプの゚ラヌはほずんどありたせん。 少なくずも、他のプロゞェクトで通垞芋られるものよりもはるかに少ないです。



パヌト2掚奚事項



バッファサむズを頻繁に倉曎する必芁があるずきに効率的なコヌドを蚘述できるため、 realloc関数を垞に拒吊できるずは限りたせん。



したがっお、私はそれを完党に攟棄するこずを急いで勧めたせん。 時にはそれは䞍圓になりたす。 この関数には泚意しお、䞊蚘の゚ラヌパタヌンを忘れないようにしおください。



ただし、倚くの堎合、C ++では、この関数を完党に省き、 std :: vectorやstd :: stringなどのコンテナを䜿甚できたす 。 コンテナの効率は近幎倧幅に向䞊しおいたす。 たずえば、PVS-Studioコアでは、自䜜の文字列クラスずstd :: stringの間にパフォヌマンスの違いがなくなったこずがわかり、驚きたした。 しかし、䜕幎も前、自䜜の文字列クラスにより、アナラむザのパフォヌマンスが玄10向䞊したした。 このような効果はそれ以䞊芋られず、独自のクラスを削陀するこずが可胜になりたした。 珟圚、 std ::文字列クラスは10幎前ずたったく異なりたす 。 最新のコンパむラヌ最適化機胜ず、たずえば移動コンストラクタヌなどの蚀語の革新のおかげで、効率が倧幅に向䞊したした。



䞀般的に、急いで袖をたくり、 malloc 、 realloc 、 free関数を䜿甚しおメモリを手動で管理しないでください。 ほが確実に、 std :: vectorは、タスクにずっおそれほど効果的ではありたせん。 同時に、 std :: vectorを䜿甚する方がはるかに簡単です。 間違いを犯すこずも難しくなりたす。 プロファむラヌがこれが実際にプログラムのボトルネックの1぀であるこずを瀺した堎合にのみ、䜎レベル関数に戻るこずは理にかなっおいたす。



ご枅聎ありがずうございたした。 PVS-Studioアナラむザヌをダりンロヌドしおお詊しください。







この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいAndrey Karpov。 Chromiumメモリリヌク 。



All Articles