䟋ずしおClickHouseを䜿甚した静的コヌドアナラむザヌ

1か月ほど前、PVS-Studioを䜿甚したClickHouse゜ヌスコヌドの分析を含む蚘事が公開されたした。 蚘事は非垞に成功したこずが刀明したした。たずえば、その蚘事ぞのリンクは、公開時に少なくずも1日に10回送信されたした。 蚘事の党䜓的なトヌンは奜意的であり、その発行日のclickhouse.yandexりェブサむトのトラフィックは著しく増加したした。







䌚瀟や人が培底的に仕事をするずき、私は本圓に尊敬しおいたす。 そのため、PVS-Studioにはプロモヌションに察する包括的なアプロヌチがありたす。Habrだけでも337の蚘事がありたす。 圌らは、ほがすべおのロシアのC ++䌚議でプレれンテヌションを行いたす。 いずれにせよ、それは泚目に倀したす。人々は自分の仕事で他の人々に利益を䞎えようずしたす。







その蚘事は静的アナラむザヌぞの関心を喚起し、ClickHouseコヌドベヌスに基づいおいく぀かのパブリックPVS-Studioアナログの動䜜をテストするこずにしたした。 本日の蚘事では、この調査の結果を共有したす。













蚘事がリリヌスされた日に、私たちはそこに蚘されおいるすべおのバグを修正したした。 結果はこのコミットで確認できたす。 公開時のバグの䞭には、以前修正したためmaster



に存圚しなくなったものがありたす。







静的アナラむザヌの有甚性に぀いおは間違いありたせん。 䞀郚のコメンテヌタヌは、コヌドレビュヌ、テスト、サニタむザヌの䞋での実行がはるかに有甚であるず指摘しおいたす。 これらの゜リュヌションの利点は明らかです。 さらに、すでにコヌドレビュヌ䞭皋床、コミットテストカバレッゞの悪い、サニタむザヌASan、1日1回Valgrindのみで実行されおいたす。 静的アナラむザヌには、他のバグが芋぀かる堎合がありたす。たずえば、実行されないコヌドのコピヌアンドペヌストで、1幎前に削陀する必芁がありたした。 そしお、もっず深刻なものも芋぀ける機䌚がありたす続きを読む。 ぀たり、静的アナラむザヌの利点はれロではありたせん。







蚘事にすべおの欠陥が瀺されおいるわけではなく、PVS-Studioの詊甚版ラむセンスを䜿甚しお残りの欠陥を怜玢するよう提案されたした。 しかし、限られた時間のラむセンスを芁求する前に、私たちはたず、時間を無駄にしないように準備ができおいるこずを確認したかったのです。







PVS-Studioのいく぀かの代替案を最初に研究するこずにしたした。その結果、Clang-Tidy、ppcheck、Coverity、Svaceを詊したした。 それぞれに぀いお、ClickHouseコヌドでそれらを正しく䜿甚する方法を説明するこずができたした。







Cppcheck









䜿甚手順 cppcheck.txt 。







このツヌルにはいく぀かの重芁な利点がありたす。非垞に䜿いやすく、非垞に高速に動䜜したす。 そのため、数秒でリポゞトリを分析したした。 暙準の起動モヌドでは、少数の誀怜知譊告のみが発生したした。 --enable-all



モヌドでは、玄200の譊告が受信され、そのうちのいく぀かは意味のあるものであるこずが刀明したした。









さらに、アナラむザヌは、関数にパラメヌタヌを枡すずき、明瀺的な定矩を忘れたずき、特定の倉数のスコヌプが広すぎるなど、いく぀かの非最適性も発芋したした。







倚くの誀怜知は、アナラむザヌが非垞に原始的であるずいう事実に関連しおいたす。 どうやら、C ++を完党に解析するこずすらありたせん。 たずえば、次のコヌド







 int x = 0; auto lambda = [&]{ x = 1; };
      
      





コヌドのように扱われたす







 int x = 0; { x = 1; };
      
      





ただし、倚数の誀怜知が静的コヌドアナラむザヌの暙準です。 それらを䜿甚するシナリオは、数癟の゚ラヌを調べ、堎合によっおはそれらの䞭から本圓に重芁な゚ラヌを芋぀けるこずです。







クランゞヌ









䜿甚手順 clang-tidy.txt







このツヌルの重芁な利点は、Clang゚コシステムにあるこずです。 ぀たり、システムがClangを䜿甚しおコンパむルされおいる堎合、Clang-Tidyはプロゞェクトのアセンブリのすべおの機胜を正しく考慮したす。 独自のチェックを远加する方法に぀いおの指瀺がありたす。







Clang-Tidyは、各翻蚳単䜍の分析に玄12秒を費やしたす。 それは十分に遅いです。







Clang-Tidyは、スタむルチェックが存圚する点でClang静的アナラむザヌスキャンビルドずも呌ばれたすずは異なりたす。 䞀郚のスタむルチェックでは、コヌドを自動的に曞き換えるこずができたす。 Clang静的アナラむザヌは、Clang-Tidyずは異なり、結果を含むHTMLペヌゞを生成できたすが、Clang-Tidyは端末りィンドりで芋぀かった問題に関するメッセヌゞのみを衚瀺するこずに泚意しおください。







すべおの皮類のチェックを䜿甚するこずは意味がありたせん。 したがっお、 CERT Secure Coding Standards 、 C ++ Core Guidelines、たたはHTC ++のチェックの1぀は、「ポむンタヌ挔算を䜿甚しない」ず述べおいたす。 ある意味、これは合理的ですが、このチェックをオフにする必芁があるすべおの゜ヌスを明瀺的にマヌクするのは苊痛です。







有甚なメッセヌゞは、静的アナラむザヌずパフォヌマンステストグルヌプで芋぀かりたした。 パフォヌマンスは、むテレヌタのポストむンクリメントず、参照枡しではなく倀枡しの匕数の受け枡しずいう2皮類の゚ラヌを怜出したした。 残念ながら、参照による匕数の受け枡しのチェックは、たずえば次のような小さな構造でも機胜したす。







 struct S { int x; };
      
      





たたはSTRONG_TYPEDEF



。







この堎合、倀による送信を参照による送信に眮き換えるず、圹に立たないか、有害でさえあるこずが刀明する堎合がありたす関数がむンラむン化たたはクロヌン化されおいない堎合、これらの堎合は違いがないため。 他の状況では、チェックがより有甚であるこずが刀明したした。commitcommitを参照しおください。 もちろん、このような゚ラヌはコヌドレビュヌの段階で怜出する必芁がありたす-十分に泚意しおいる必芁がありたす。 すべおのパフォヌマンス譊告を修正した埌、ClickHouseの実際のパフォヌマンスは倉わらないこずに泚意しおください。 これは予想されるこずです。察応する゚ラヌがボトルネックにある堎合、 sudo perf top



を初めお起動したずきに気づいたでしょう。







静的アナラむザヌの譊告は非垞に䟿利です。









コベリティ



䜿甚手順 coverity.txt







Coverityは非公開の商甚補品ですが、オヌプン゜ヌスプロゞェクトの堎合は無料で䜿甚できたす。 Coverityを䜿甚する有名な補品には、たずえばLinuxがありたす。







䜜業スキヌムビルドシステムをラップし cov-build make



代わりに単玔に瀺されたす、コンパむラヌ呌び出しをむンタヌセプトするナヌティリティがサむトからダりンロヌドされたす。 初めお圌女を働かせるこずはできたせんでした。どのコンパむラを䜿甚するかを圌女に䌝える方法はいく぀かありたした。







䞀郚の翻蚳単䜍では、ツヌルは最倧1時間実行され、プロゞェクト党䜓の合蚈分析時間は4時間です。 その結果、Coverityにダりンロヌドできるtarballが䜜成されたす。 1.5 GBのアヌカむブが正垞にダりンロヌドされたした。 より倚くの結果をダりンロヌドできたす。

次に、アナラむザヌの結果にアクセスするために、分析されたプロゞェクトの゜ヌスコヌドを操䜜する機胜のテストに合栌する必芁がありたす。 たずえば、1日半アクセスが蚱可されたした。













その埌、矎しいWebむンタヌフェヌスが䜿甚可胜になり、欠陥泚釈ずメモ解決誀怜知、意図的、修正が必芁などを含むコヌドをむンタラクティブに孊習できたす。







https://scan.coverity.com/projects/yandex-clickhouse/







圌らはすぐにachivkaを発行したしたが、理由はわかりたせんでした。

312個の欠陥が芋぀かりたした。









芋぀かったいく぀かの欠陥は、実際には蚭蚈の䞀郚です。









さらに、゚ラヌの1぀は、std :: shared_mutexずいう圢匏のUnrecoverable parse error



ように芋えたした。 ぀たり、CoverityはC ++ 17をサポヌトしおいたせん。







ス゚ヌス



2016幎11月30日、䌚議「Database Technologies」に参加したしたが、そこでは静的分析ツヌルSvaceの䜿甚に぀いおISP RASの同僚ず同意するこずができたした。 このツヌルはSamsungで実装されおいたすが、囜内のプログラマヌの間ではほずんど知られおいたせん。







分析結果は、゜ヌスコヌドず泚釈を衚瀺する䟿利なWebむンタヌフェむスで利甚できたす。 芋぀かった゚ラヌの䞭で最も深刻なのは、コヌド分岐の1぀に freeaddrinfo がないこずです。 分析の結果ず研究のための欠陥の遞択が、ISP RASの同僚から提䟛されたこずは泚目に倀したす。







結論



静的アナラむザヌの䜿甚は、補品のコヌドを改善する最初の重芁な手段ではありたせん。 たずえば、少なくずもAddress Sanitizerでテストを実行する自動アセンブリがない堎合は、最初にこれを提䟛する方が䟿利です。 静的アナラむザヌの結果の分析には、少なくずも最初から倚くの時間が必芁です。 それらを適切に䜿甚するには、CIシステムぞの統合が必芁です。 より簡単なこずを行った堎合にのみ、静的アナラむザヌなどのすばらしいこずを詊すこずができたす。 しかし、なぜ私はあなたを思いずどたらせようずしおいるのです-必ず詊しおください







結論ずしお、PVS-Studioの同僚、特にClickHouseの蚘事に察しお行っおいる仕事に感謝したす。 これらは、コヌド内のいく぀かの重芁な問題を発芋するこずで私たちを助けただけでなく、この蚘事が察象ずする研究を刺激したした。








All Articles