SwiftおよびObjective-Cの静的アナラむザヌ

たえがき



C / C ++ / C、Javaなどの静的アナラむザヌに関する蚘事が倚数ありたす。 MacOS / iOSでのネむティブ開発のためのさたざたな静的アナラむザヌの䜿甚に関する研究に぀いおは、あたり泚目されおいたせん。



ObjCおよびSwiftのさたざたなプロゞェクトで䜿甚される静的コヌドアナラむザヌの䜿甚の分析が提案されおいたす。 同時に、これはレビュヌではなく、メモリリヌクから脆匱性たで、コヌド内の䜕らかの゚ラヌを芋぀けるためのさたざたなツヌルの䜿甚に関する泚意事項です。 ただし、デヌタは、客芳性ず結論の完党性、および各機噚で埗られた結果の分析の深​​さを装っおいたせん。



゚ントリヌ



数幎前、ただiOSの初心者開発者でしたが、iOSアプリケヌション甚にObjCで蚘述されたコヌドの品質を怜蚌する問題に遭遇したした。 残念ながら、゚ラヌを芋぀けお、そのようなものがないために、より資栌のある同僚ずコヌドに぀いお議論するこずは垞に可胜ではありたせんでした。 最初の吊定的なレビュヌは建蚭的に認識されおいたしたが、それでも契玄を締結する前に開発者コヌドの䟋を評䟡したい顧客を倱いたした。 この結果、顧客にそれを実蚌する前に最倧のコヌド欠陥を識別するツヌルを䜿甚する必芁がありたした。 開発䞭の補品の朜圚的な問題を特定するためにすべおのコミットを行った埌、 継続的むンテグレヌションでコヌドの品質に関するレポヌトを䜜成するこずが垞に重芁であったこずに泚意しおください。



゜ロから分散プロゞェクトたで、さたざたな倧陞にチヌムを配眮しお、さたざたなチヌムで仕事をしなければなりたせんでした。 同僚のスキルレベルは、入門レベルから建築家にたで及びたした。 チヌムの構成も同様に絶えず倉化したした。これは、Swiftの新しいバヌゞョンが毎幎登堎し、ObjectiveC が止たったずいう事実にもかかわらずです。



これらのすべおの芁因により、゚ラヌの最倧数を特定し、コヌドの䞀貫性ず読みやすさを高めるツヌルの怜玢が促進されたした。



Clang静的アナラむザヌ



これは、Xcodeナヌザヌが遭遇する最初の組み蟌みアナラむザヌです。 アプリケヌションを起動するたびにコヌドを分析するには、 ここで説明する蚭定を行う必芁がありたす。 これらの掚奚事項は、各コミットの前にコヌドを怜蚌する最初のステップずしお、すべおのナヌザヌが䜿甚する必芁がありたす。



Swiftのサポヌトがないため、Swiftの範囲は倧幅に制限されたす。 もちろん、XcodeにはSwiftをサポヌトするアドレスアナラむザヌずスレッドサニタむザヌがありたすが、これらのツヌルは静的アナラむザヌではなく、アプリケヌションの起動時、぀たり実行時にのみ䜿甚できたす。

朜圚的なメモリリヌクずコヌド構造の゚ラヌのプロアクティブ怜玢に適しおいたす。



フェむパス



Faux Pas 間違ったステップ-Fr. は、GUIずCLIの䞡方を備えた最初のサヌドパヌティ補静的アナラむザヌです。 䜿甚開始埌、コヌドの品質は著しく高くなりたした。 ObjCプロゞェクトの20から50の隠れたバグを特定するのに圹立ちたした。 最も興味深いのは、最初の起動時にツヌルが顧客が指摘した゚ラヌを正確に明らかにしたこずです。 これが、実際、開発者の個人的な費甚でこのツヌルを賌入し、䌚瀟党䜓がサヌビスを開始するたで埅たないこずが決定された䞻な理由でした。



残念ながら、すべおの同僚がこのツヌルを積極的に受け入れたわけではありたせん-アナラむザヌは無料であるず信じおいる人もいれば、理解したくない倚くの蚭定に぀いお䞍満を蚀う人もいたす。



䞻な欠点は、Swiftのサポヌトがないこずですが、開発者はただサポヌトを玄束しおいたすが、ただ日付を発衚しおいたせん。



それほど重芁ではない問題は、 ワヌクスペヌスが盎接サポヌトされおいないこずです。コマンドラむンワヌクスペヌスチェックの構成を䜿甚しおチェックするか、各プロゞェクトを個別にチェックする必芁がありたす。



ただし、Faux PasはApple Coding Guidelinesず矛盟する問題領域を芋぀けたした。 たずえば、initおよびdeallocでself.propetyを䜿甚するず、 Modern ObjC構文 、NSNotificationCenterオブザヌバヌデタッチメントの欠萜などの䜿甚を思い出させたす。 CIに簡単に統合できたす。



Jsonたたはplistで生成されたレポヌトをより読みやすいものに倉換するこずをお勧めしたす。 レポヌトには問題の詳现な説明が含たれ、ルヌルぞの倖郚リンクも提䟛したす。 時には、公匏ドキュメントぞのリンクではなく、stackoverflowぞのリンクが存圚するずいう事実にもかかわらず、これは倧きな欠点ではありたせん。



ツヌルの結果の䟋を以䞋に瀺したす。 Xcodeでアナラむザヌを実行しお、問題の察象を怜出するには、CLIを䜿甚できたす。







JSONで提瀺されたレポヌトを分析するために、FauxPas GUIに䌌たプレれンテヌションの各問題を遞択したレポヌトをExcelで生成する小さなアプリケヌションが䜜成されたした。



アナラむザヌの構成に関しお、ツヌルは次のように構成されたす。

GUI、CLI匕数、および構成ファむル。 独自のルヌルを䜜成する方法は芋぀かりたせんでした。



オクリント



このアナラむザヌは、ObjCで䜜成された倖囜䌁業の小芏暡だが長呜のプロゞェクトで初めお䌚った。 この䌚瀟の開発者は非垞に保守的で、この蚀語のすべおの新しいバヌゞョンぞの移行が耇雑であるため、Swiftに切り替えたくありたせんでした。



OCLintではScaffoldingを䜿甚しおルヌルを倉曎および远加できたすが、これには時間がかかりたす。 この䌚瀟の開発プロセスによるず、すべおのアナラむザヌの譊告が修正されるたで、コヌドはリポゞトリにコミットしたせん。 䞀郚の怜蚌ルヌルは、垞に正しく凊理されたせんでした。 アナラむザヌの譊告をすべお排陀するために、回避策クランチを䜿甚する必芁があり、チヌムは最終的にこのアナラむザヌのサポヌトを攟棄したした。



それでも、アナラむザヌでは次のこずを識別できたす。





小さなプロゞェクトの分析時間は非垞に長くClangアナラむザヌに比べお、このツヌルを以前にプロゞェクトで䜿甚したこずがない堎合、膚倧な数の譊告が生成される可胜性があり、初期分析が耇雑になりたす。 したがっお、コヌドベヌス党䜓をチェックしお倧量の譊告を受け取る必芁がない堎合は、コミット前に倉曎されたファむルのみをチェックする小さなスクリプトを䜜成できたす。これは、アナラむザヌに関連したす。



ビルドスクリプトによりXcodeに暙準的に統合 したす 。



このツヌルは非垞に柔軟ですが、それにもかかわらず、このツヌルは長い間存圚しおいたため、コヌドのより高床なヒュヌリスティック分析が必芁です。 珟圚、このアナラむザヌのXcodeプラグむンが必芁であり、その䜿甚が倧幅に簡玠化されたす。



コヌドビヌト



Codebeatクラりドアナラむザヌは、ObjCずSwiftの䞡方をサポヌトしおいたす。これは、特定のプロゞェクトで䜿甚するためにこの補品が遞択されたずきに重芁でした。 欠点の1぀は、プルリク゚ストの前にコミットがGitHubに到達した埌にのみチェックが実行されるこずでした。これにより、このケヌスでは開発プロセスがわずかに非構造化されたした。 この執筆の時点で、開発者は、このプロセスぞの開発者の参加を完党に最小限に抑えるために、自動レビュヌコヌドナヌティリティをリリヌスするこずを玄束したした。 これは、人間によるレビュヌがあるプロゞェクトの開発チヌムでの䞍芏則たたは䞍泚意なコヌドチェックのため、緊急のタスクです。



Swift + Obj-C、Python、Rubyをサポヌトしおおり、モバむル開発に非垞に䟿利です。



ObjCコヌドの分析は十分に機胜したせん。 これは、同瀟が䞻にSwiftコヌドの分析に重点を眮いおいるずいう事実によるものであり、ObjCずの連携が最近远加されおおり、さらなる改善が必芁です。



補品サポヌトに関しおは、䞀番䞊にありたす。 日䞭は垞にサポヌトに連絡する機䌚があり、週末でも必芁な支揎が提䟛されたした。



メトリックの構成に関しおは、独自のjsonファむルを䜜成し、怜蚌ルヌルを倉曎するこずでこれを実行できたす。 ただし、新しい怜蚌ルヌルを䜜成したり、既存の怜蚌ルヌルを倉曎したりする機胜はありたせん。 しかし、開発者が私に保蚌したように、そのような機䌚は将来蚈画されおいたす。



このツヌルは、オヌプン゜ヌスプロゞェクトでは無料で、プラむベヌトリポゞトリでは䟡栌はそれほど高くありたせん。さらに、トラむアル期間は3か月間続き、非垞に民䞻的であるず芋なすこずができたす。



掚枬する



独自のコヌドアナラむザヌを開いた facebook補品は、iOSでのプロゞェクトの分析だけでなく、Android / Java開発にも適しおいたす。



テストプロゞェクトのコマンドラむンでこのアナラむザヌをすぐに実行するこずはできたせんでしたが、Githubでリク゚ストを䜜成した埌、その構成のいく぀かの埮劙さに専念したした。 「ビルドスクリプトの実行」を䜿甚しお、Xcodeに統合するこずさえできたした。



アナラむザヌを実行するために、远加のスキヌムが䜜成されたした-CLIを䜿甚しお他のアナラむザヌず同様に、Xcodeで掚論したす。 特定のケヌスでは、その䜿甚による倧きな利点は確認されおいたせん。 おそらく、このツヌルを他の倧芏暡なクロスプラットフォヌムの耇雑なプロゞェクトで䜿甚するのが理にかなっおいたす。



スりィフトリント



Swift開発者の間で非垞に人気のあるアナラむザヌで、Xcodeのプラグむンプラグむンがあり、非垞に䟿利です。



GitHubのSwift Style Guideが基本的なルヌルです。 正芏衚珟ベヌスのカスタム怜蚌ルヌルを䜜成するこずが可胜です。 特に、新しい機胜がツヌルクラスの拡匵に远加された堎合、リファクタリングに関するルヌルを䜜成するず非垞に䟿利です。たずえば、NSLocalizedString関数はクラスのNSStringたたはString拡匵のフィヌルドになりたす。



特定のケヌスでは、チヌムはリファクタリングされおいない分散ブランチに取り組みたした。 「自動修正」オプションを䜿甚するず、コヌドを単䞀のブランチにマヌゞするずきに、コヌドを簡単に単䞀のスタむルにするこずができたす。



SwiftLintは、ObjCコヌドずSwiftコヌドの䞡方を含む倧芏暡なハむブリッドプロゞェクトで䜿甚されたした。 残念ながら、プロゞェクトにそれを導入するずいうアむデアの著者は、「autocorrect」オプションを䜿甚した堎合の倉遷に関する蚘事を読んでおらず、Xcodeの「Run Script」にチェックを挿入したした。 もちろん、共通の同期ポむントを持たないチヌムを持぀倧芏暡なプロゞェクトでは、党員がこのツヌルをすぐにむンストヌルしたわけではありたせん。 同時に、Swift 3.0ぞの移行があり、間違いなく新しいコミットに混乱を加えたした。



バヌゞョン0.16.0以降、誀怜知のルヌルがいく぀かありたした。たずえば、 large_tupleプロゞェクトではビルドスクリプトによるコンパむルが停止しおいたした。 さらに、すべおのルヌルが正しく凊理されるわけではありたせん。これは倚くのアナラむザヌでよく芋られるこずであり、コヌドの品質に圱響を䞎える回避策を䜿甚せざるを埗たせん。 この問題により、各プロゞェクトの「ビルドフェヌズスクリプト」にSwiftLintを導入するこずに぀いお、より慎重になりたした。



このツヌルはJenkinsにも統合されおおり、プロゞェクトコヌドベヌスの制埡が明らかに改善されたした。



仕立お



Tailorは、Swift甚のクロスプラットフォヌムの静的アナラむザヌです。 非垞に珍しいのは、Windowsプラットフォヌムがサポヌトされおいるずいう事実です。



パむロットプロゞェクトでSwiftLintの代替ずしお䜿甚されたす。 ただし、この期間は、Swift 2のみをサポヌトしたす。Swift2は、珟代の芁件を少し満たしおいたせん。 ただし、Swift 3.0.1をサポヌトする゚ンチャントの問題がありたす。 The Swift Programming Language、GitHub、Ray Wenderlich、およびCourseraのコヌドスタむルルヌルをサポヌトしたす。



ポッドずワヌクスペヌスをサポヌトするには 、次の掚奚事項をお勧めしたす。



独自のルヌルを䜜成する機胜は芋぀かりたせんでしたが、存圚する可胜性がありたすが、これを泚意深く理解する必芁がありたす。



「ビルドスクリプト」を介しおXcodeに統合したす。 trailing-whitespaceなどの譊告を抑制するには、最初に䜿甚するずきにすぐに䞍䟿になりたす。

キヌが掚奚されたす



tailor --except=brace-style,trailing-whitespace
      
      





必芁に応じお、レポヌトをHTML、JSON、たたはXcode圢匏で出力できたす。これは、Webサヌバヌで結果を公開するずきにCIで䜿甚するのに十分䟿利です。



Swiftスタむルでの曞匏蚭定



アナラむザヌに぀いお蚀えば、特定のスタむルガむドのコヌドの「フォヌマッタヌ」に蚀及するしかありたせん。

静的コヌドアナラむザヌではなく、コヌドをSwift Styleにフォヌマットしたすが、それでも、プログラマヌがコヌドをよりよく理解できるようにコヌドを単䞀のスタむルにするこずにより、゚ラヌを怜出するずいう同じ目的を果たしたす。コヌドのセクション。



スむフトフォヌマット



特定のチヌムのコヌドスタむルを満たす独自のルヌルを䜜成できるずいう点で䟿利です。 蚭定はCLIを介しお行われたすが、すべおの人にずっお魅力的ではありたせん。 ただし、Xcodeのプラグむンずしおむンストヌルできたす。



スりィマット



このツヌルは、CLIずXcode拡匵の䞡方で䜿甚できたす。 これは確かに優れたツヌルですが、Xcodeを䜿甚するずクラッシュする重倧なバグがいく぀か含たれおいたす。 ただし、開発者はすぐにそれらを削陀したす。 独自の怜蚌ルヌルを远加する機胜がありたす。



特定のケヌスでは、小さなプロゞェクトのコヌドをフォヌマットするために䜿甚され、利䟿性ず結果の点で最高であるこずが蚌明されたした。



どちらのフォヌマッタもXcodeの拡匵機胜ずしお䜿いやすく、珟圚サポヌトおよび改善されおいたす。



チェックマルクス



実際には、補品の安党性を重芖する顧客からのプロゞェクトが時々ありたす。 このようなプロゞェクトでは、Checkmarxの静的アプリケヌションセキュリティテストSAST゜ヌスコヌド監査゜リュヌションを䜿甚するこずをお勧めしたす。



このクラりド゜リュヌション、぀たりツヌルは、ロヌカル開発サヌバヌたたはCheckmarxサヌバヌに配眮できたす。 独自の特蚱技術を䜿甚したかなり高床な分析装眮。 以前に米囜囜防総省ず緊密に連携しおいたCheckmarxは、あらゆる皮類の脆匱性の研究に関しお倚くの興味深い進展を遂げおいたす。 Swiftをサポヌトしおいたすが、特定のケヌスでは、ObjCプロゞェクトが分析されたした。 残念ながら、Xcodeの拡匵プラグむンはありたせん。



報告システムは非垞に有益であり、芋やすくなっおいたす。 ペヌゞの1぀は以䞋です。







有益なレポヌトには、プロゞェクトに応じお10〜300ペヌゞを含めるこずができたす。 レポヌトでは、問題の修正方法に぀いおも説明し、䟋を瀺しおいたす。 分析されたすべおのプロゞェクトの䞀般的な間違いは、「サヌドパヌティキヌボヌド察応」でした。これは、iOS甚のサヌドパヌティキヌボヌドをむンストヌルする際の脆匱性に関連しおいたしたただし、分析されたアプリケヌションの1぀にキヌボヌド入力フィヌルドが含たれおいたせんでした。



あずがき



Sonarのような、実際の静的コヌド分析のいく぀かのツヌルに぀いお知りたいず思っおいたす。 ただし、補品のコストが高く、むンストヌルが耇雑であるため、このような機䌚はただありたせん。 同時に、䞀郚のプロゞェクトでは、アプリケヌションのセキュリティが心配なお客様のコヌドの脆匱性を探すためにSolar inCodeを詊すこずは興味深いです。 残念ながら、この補品はデモ版でも入手できたせんでした。



䞊蚘のツヌルの倚くは、コヌドのさたざたな脆匱性に察する補品の安定性ず耐性を高めるのに圹立ちたした。 原則ずしお、アナラむザヌは偏芋のない裁刀官であり、あなたのこずを気にせず、圌に察する個人的な苊情もありたせん。



それにもかかわらず、理想的なツヌルが存圚しないこずは明らかであり、既存のすべおのコヌド分析ツヌルを䜿甚しおも䞇胜薬ではありたせん。 アナラむザヌの芁件を満たすために回避策を䜿甚する必芁がある堎合、誀ったアラヌムのケヌスは蚀うたでもありたせん。 この点で、少なくずも、drugStateやcacheDataの代わりにdragStateなどのセマンティック゚ラヌを怜出するために、人間のレビュヌは垞に関連性がありたすauto-replace ...を構成できたすが。



䟿利なリンク






All Articles