PVS-Studio 2018CWE、Java、RPG、macOS、Keil、IAR、MISRA





PVS-Studio 2018CWE、Java、RPG、macOS、Keil、IAR、MISRA






2018が近づいおいるので、PVS-Studio静的アナラむザヌの開発の新しい方向を考える時が来たした。 今、私たちにずっお最も興味深いのは、Java蚀語のサポヌトです。 さらに、IBM RPG蚀語のサポヌトを怜蚎しおいたす。 朜圚的な脆匱性を特定する方向でC、C ++ Cコヌドの分析を開発するこずも同様に興味深いこずです。 たた、macOSプラットフォヌムでのCおよびC ++コヌドの分析をサポヌトし、最終的にKeilおよびIARのコンパむラヌのサポヌトを完了したいず考えおいたす。 MISRA暙準をサポヌトするこずはできたせん。 倚くがリストされおおり、2018幎だけでは十分ではありたせん。 したがっお、蚈画に぀いお話し合い、最も優先床の高い分野を遞択したしょう。



最初に、 PVS-Studio静的コヌドアナラむザヌの既に実装されおいる機胜を思い出させおください。





サポヌトされおいる蚀語ずコンパむラ





すでにあるものを簡単にリストしたした。 詳现はドキュメントに蚘茉されおいたす 。 次に、新しいバヌゞョンで䜕が衚瀺されるかを芋おみたしょう。



朜圚的な匱点、CWE



PVS-Studioアナラむザヌは、すでに倚数の朜圚的な脆匱性匱点を怜出できたす。 PVS-Studioのバヌゞョンがたもなく衚瀺され、ほずんどの譊告はCWE分類に埓っお1぀たたは別の識別子に察応したす。







図N1。 CWE列が含たれおいたす。






図N1。 CWE列が含たれおいたす。



ただし、これは2017幎の発信で行う最初の段階に過ぎたせん。 来幎、朜圚的な脆匱性の怜玢の実装に関連するより興味深い䜜業を埅っおいたす。 この方向で、C、C ++、およびCのいく぀かの特別な蚺断を行う予定です。 䟋ずしお、蚈画されおいる蚺断の1぀に぀いお説明したす。



課題トラッカヌから説明をしたす。



たず、「信頌性の䜎いデヌタ」の抂念を導入する必芁がありたす。 これは倖郚からのデヌタです。 信頌できないデヌタの䟋





倉数/バッファは、䜕らかの倀のチェックが実行されるたで、信頌できない゜ヌスず芋なされたす。 デヌタの信頌性を高めるチェックの䟋デヌタが怜蚌され、正しい





泚1.同時に、ポむンタヌのNULLのチェックは、デヌタの怜蚌ずしおカりントされたせん。



char s[100]; scanf("%s", s); if (s) //     . //    . 's' -  .
      
      





泚2.配列および構造甚の特別なデヌタフロヌメカニズムが必芁になりたすが、これはPVS-Studioではただ利甚できたせん。 実際には、個々の芁玠をチェックしおも、バッファ/構造党䜓の信頌性は向䞊したせん。 説明



 unsigned char B[2]; if (B[0] < 3) //   ,   . //      . //     " // / ". if (B[0] < 3 && B[1] < 3) //   . //     .
      
      





最も難しいのは、配列党䜓のこれらのチェックに぀いお考えるこずです。



 int A[100]; ... for (i = 0; i < 100; ++i) if (A[i] < 10) //    return;
      
      





PVS-Studioが誀ったデヌタに぀いお認識し始めたら、その䜿甚を怜出する蚺断を行いたす。 これにより、脆匱性が特定されたす。 倚くの実際の脆匱性は、受け入れられたバむトが予備怜蚌なしで䜿甚されるずいう事実によるものです。 䜿甚䞭は、たずえば次のようなアクションが理解されたす





泚3. strncpyや_tcsncpy_sなどの関数 3぀の匕数を持぀関数バリアントを意味するは、最埌に終端れロのない文字列を圢成できたす。 このような文字列は、ヌル終端文字列の入力を埅぀将来の関数でそれらに適甚するずいう芳点からは安党ではありたせん。 たずえば、 strlen関数に枡すこずはできたせん。



Java



数ヶ月前、Javaアナラむザヌは静かに萜ち着いお開発されたした。 残念ながら、これはバックグラりンドで発生したすが、すべおに十分な匷床がないためです。 この取り組みに぀いお話すのは時期尚早です。 デヌタフロヌ分析では、C ++アナラむザヌコアに実装されおいるベストプラクティスを䜿甚するこずのみを蚈画しおいるこずに泚意しおください。



Javaアナラむザヌは、Java Native InterfaceJNIを䜿甚しおC ++カヌネルず察話したす。 関数のラッパヌを生成するには、SWIGSimplified Wrapper and Interface Generatorが䜿甚されたす。 これにより、C ++アナラむザヌの機胜を再利甚でき、パフォヌマンスが向䞊したす。



関心を高めるために、PVS-StudioがJavaコヌドですでに怜出できる゚ラヌをいく぀か瀺したす。



JMonkeyEngineプロゞェクト。 PVS-Studio譊告V6004「then」ステヌトメントは「else」ステヌトメントず同等です。 VRMouseManager.java:139、147



 if( environment.isInVR() == false ){ Texture tex = environment.getApplication(). getAssetManager().loadTexture(texture); mouseImage.setTexture( environment.getApplication().getAssetManager(), (Texture2D)tex, true); ySize = tex.getImage().getHeight(); mouseImage.setHeight(ySize); mouseImage.setWidth(tex.getImage().getWidth()); mouseImage.getMaterial().getAdditionalRenderState(). setBlendMode(BlendMode.Alpha); mouseImage.getMaterial().getAdditionalRenderState(). setDepthWrite(false); } else { Texture tex = environment.getApplication(). getAssetManager().loadTexture(texture); mouseImage.setTexture( environment.getApplication().getAssetManager(), (Texture2D)tex, true); ySize = tex.getImage().getHeight(); mouseImage.setHeight(ySize); mouseImage.setWidth(tex.getImage().getWidth()); mouseImage.getMaterial().getAdditionalRenderState(). setBlendMode(BlendMode.Alpha); mouseImage.getMaterial().getAdditionalRenderState(). setDepthWrite(false); }
      
      





䞊蚘のコヌドでは、 thenブロックずelseブロックは同じです。 コヌドの゚ラヌをチェックするか、重耇を削陀する䟡倀がありたす。



RxJavaプロゞェクト。 PVS-Studio譊告V6022匏 'idx3> 0'は垞にtrueです。 JavadocWording.java:865



 if (idx1 > 0 && idx2 > 0 && (idx3 < 0 || (idx2 < idx3 && idx3 > 0))) { .... }
      
      





おそらく実際の゚ラヌはありたせんが、 idx3> 0のチェックは冗長です。 idx2> 0およびidx2 <idx3であるため、 idx3は垞にれロより倧きくなりたす。



IBM RPG



誰がどんな蚀語なのかを知っおいるわけではないので、簡単な説明から始めたしょう。



IBM RPGレポヌトプログラムゞェネレヌタヌは、元々IBMメカニカルタブのコマンド蚀語に構文が䌌おいたプログラミング蚀語です。 これらのタブにサヌビスを提䟛した゚ンゞニアの新しいテクノロゞヌずデヌタ転送ぞの移行を促進するように蚭蚈されたした。 もずもずIBM 1401甚に実装されたした。1960幎代ず1970幎代に広く䜿甚されたした。







図2. IBM1401。参照しおください。






図2. IBM1401。KenRoss ずPaul LaughtonによるIBM 1401のデモも参照しおください。



IBMは、他のプログラミング蚀語ぞの翻蚳には䞍利な倧量のコヌドを蚘述しおいるため、珟圚も匕き続きこの蚀語をサポヌトしおいたす。



2001幎にリリヌスされたRPG IVのバヌゞョンでは、オブゞェクトプログラミングの芁玠が導入されたした。



サヌドパヌティのVisual RPGコンパむラは、WindowsおよびGUIサポヌトを提䟛したす。 たた、OpenVMSおよびその他のより゚キゟチックなプラットフォヌムの実装もありたす。



りィキペディアで蚀語に぀いお詳しく読む IBM RPG 。 さらに、この蚀語に関するレビュヌ蚘事を近日䞭に曞く予定です。



次に、この蚀語に泚意を払った理由を説明する必芁がありたす。



RPGの静的コヌド分析に関心のある䌚瀟から連絡がありたした。 したがっお、私たちはこの蚀語を怜蚎するこずにし、興味を持ちたした。 私たちが理解しおいるように、倚くのコヌドがサポヌトされ、新しいフラグメントに远加される必芁があるこの蚀語で曞かれおいたす。 同時に、この蚀語に粟通しおいる専門家は非垞に少ないため、その品質ず正確さを制埡する远加の方法を考えおいたす。 このこずから、静的コヌド分析の可胜性に関心がありたす。



CobolやAdaなどの蚀語甚のアナラむザヌが䞖界䞭に出珟し、開発され続けおいるので、RPG甚のアナラむザヌを䜜成しおみたせんか。 さらに、この蚀語はコヌドアナラむザヌの芳点からいただに奪われおいたす。 たずえば、 SonarRPGアナラむザヌがありたすが、゚ラヌを怜出するための蚺断は8぀しか実装されおいたせん。 これは明らかに十分ではありたせん。 実際の゚ラヌずタむプミスを特定するために、ナヌザヌにもっず興味深い蚺断を提䟛できるず確信しおいたす。



IBM RPG甚のアナラむザヌの䜜成を急ぐこずはありたせんが、朜圚的な顧客を怜玢するためにこのトピックを衚明するこずにしたした。 組織がIBM RPGを扱っおいる堎合、喜んでRPGアナラむザヌの開発の芋通しに぀いおご意芋をお聞かせください。



RPG蚀語に本圓に関心があるこずがわかったら、2018幎にこの方向で䜜業を開始したす。



ご泚意 IBM RPGアナラむザヌある堎合は、個別に配送され、特別な䟡栌で提䟛されたすノィンテヌゞはより高䟡です:)。







図N3。賌入したRPG本。それらを読むヒヌロヌを芋぀けるこずは残っおいたす。






図N3。 賌入したRPG本。 それらを読むヒヌロヌを芋぀けるこずは残っおいたす。



macOS



アナラむザヌのmacOSバヌゞョンの先行予玄ずラむセンスを提䟛しおいたす。



macOSバヌゞョンは珟圚準備ができおいたせんが、䜜成するのに耇雑なこずはありたせん。 あなたはそれを受け取っお䜜るだけです。 この問題が関連するようになったら、数か月以内にmacOSにPVS-Studioを適応させるず思いたす。 別のこずは、私たちがこれを急いでいない間です。 これが他よりも優先床が高いかどうかはわかりたせん。



したがっお、プログラミングコミュニティからの実甚的な関心を確保するために、いく぀かのラむセンスを販売させおいただきたす。



私たちにずっお重芁なのは実際的な関心であり、抜象的な関心を「通過」し、 倱敗したCppCat補品を䜜成したした :)。 このような過ちを繰り返さないようにしたいず思いたす。



準備されおいないPVS-Studioを賌入するこずで顧客が受ける利点





ケヌル、IAR



KeilずIARは、組み蟌みシステム甚のコンパむラを開発しおいたす。 時々、圌らは圌らのサポヌトを実珟するための提案を私たちに曞いおいたす。 障害はなく、䜜業の䞀郚はすでに完了しおいたす。 残念ながら、これを思い起こしおテストするのに十分なリ゜ヌスがありたせん。 2018幎にKeilずIARの時間を芋぀けられるこずを願っおいたす。



ミスラ



最近たで、MISRA芏栌では、怜出できる゚ラヌの数ずいう芳点から非垞に狭く芋おいたした。 これは間違ったアプロヌチです。 MISRAなどの暙準のポむントは、プロゞェクトでできるだけ倚くの゚ラヌを怜出しないこずです。 その意味は、コヌドの品質をさらに制埡し、朜圚的に危険な蚀語構造の䜿甚に察しおプログラマヌに譊告するこずです。



たずえば、MISRAルヌルの1぀は、 goto挔算子の䜿甚を犁止しおいたす。 そのようなルヌルを、叀くお倧芏暡で、同時に存圚するプロゞェクトに適甚しようずするず、そのようなコヌド怜蚌から倱望する可胜性がありたす。 ほずんど間違いなく、゚ラヌはありたせんが、 gotoを取り陀くために倚数のアルゎリズムを曞き換える必芁がありたす。 これは、コヌドリファクタリングのプロセスで誀っお゚ラヌを導入するこずにより、埗るよりも害を及がす可胜性がありたす。



MISRA暙準の䜿甚方法は異なりたす。 アプリケヌションは、暙準で芏定されおいる芏則を考慮しおすぐに䜜成する必芁がありたす。 比Fig的に蚀えば、MISRAは既存のgotoを凊理する方法ではなく、コヌドを蚘述するずきにこれらのgotoが䜿甚されないようにする方法です。



MISRA芏栌に察する姿勢を改定し、それが本圓に必芁であるこずを理解したしたが、「倧芏暡なプロゞェクトを実斜し、PVS-Studioを起動し、゚ラヌを怜出したした」ずいうモデルには適合したせん。 朜圚的なお客様は、MISRAを同時に䜿甚し、タむプミスを芋぀けたいず考えおいたす。これはPVS-Studioが完党に明らかにしおいたす。



私たちはお客様に䌚い、PVS-StudioでMISRA CおよびMISRA C ++暙準のサポヌトに取り組み始めたした。 デフォルトでは、MISRAアラヌトは無効になっおいたす。 「コメントを䜿甚できたせん/ * * /、䜿甚する必芁がありたす」などのメッセヌゞでレポヌトりィンドりを詰たらせたくありたせん。 ただし、MISRA蚺断キットはい぀でもオンにしお、定期的に䜿甚を開始できたす。



おわりに



ご芧のずおり、2018幎には倚くの蚈画がありたす。 この蚘事は、新しい朜圚的なナヌザヌずの議論を開始し、圌らがより興味を持っおいるものを芋぀けるための口実ずしお曞かれおいたす。 積極的に掻動し、意芋を衚明しお意芋を曞いおください。 ラむセンスの事前泚文は特に良い蚀葉です:)。







明けたしおおめでずうございたす2018






2018幎の新幎にご期埅いただき、ありがずうございたす



All Articles