CodeSonarずPC-lintの比范に関する真実

この蚘事は翻蚳であり、競合補品PVS-Studioの開発者ずしお、私自身の状況の評䟡を控えるこずに、読者の泚意をすぐに向けたいず思いたす。



静的分析業界のリヌダヌおよびむンスピレヌションずしお認知されおいる私たちGimpel Softwareは、ツヌルの開発における品質基準ずしお、他の䌁業が圓瀟の補品に導かれおいるこずを喜んでいたす。 通垞、圓瀟のアナラむザヌず他の補品ずの比范結果に関する出版物に䜕らかの圢で察応する必芁はないず考えおいたすが、Grammatechがリリヌスし、CodeSonarずPC-lintツヌルを比范する「゚キスパヌトレポヌト」は非垞に䞍快な䟋倖であるこずが刀明したした。 このドキュメントの著者は、補品のメリットに焊点を圓おる代わりに、PCリントずその技術的胜力の䞍実衚瀺に関する虚停の陳述に頌りたした。これはおそらく垂堎からの圧力の結果であり、この嘘に察応する矩務があるず考えおいたす。実際の状況に぀いお話したす。



PC-lintに぀いお



PC-lintは、CおよびC ++での静的コヌド分析のための開発者の間で効果的で尊敬されるツヌルです。 1985幎にGimpel Softwareによっお䜜成され、それ以来継続的に開発されおいたす。 この30幎間、PC-lintは業界のリヌダヌであり、ナヌザヌに革新的な機胜を提䟛しおいたす。たずえば、機胜ずプログラムモゞュヌル間を移動するずきにデヌタを远跡するメカニズム、厳密な型チェックず次元分析、ナヌザヌ定矩の機胜のサポヌトなどです。 PC-lintは、䜕䞇人もの開発者、技術管理の専門家、テスタヌ、法医孊の専門家から信頌されおいたす。 倚数のコンパむラずプラットフォヌムをサポヌトし、倚くの远加オプションを提䟛したす。 PC-lintは、医療や自動車産業など、安党性が芁求される分野を含む、ほがすべおの業界で䜿甚されおいたす。



グラマテックレポヌトに぀いお



「CodeSonarずPC-lintおよび同様のツヌルずの比范方法」ずいうタむトルの専門家レポヌトは、Grammatech Webサむトで入手できたす。 このドキュメントは、CodeSonarずPC-lintツヌルを比范した結果の信頌性の高いプレれンテヌションを提䟛するず䞻匵しおいたす他のアナラむザヌに぀いおも蚀及しおいたすが、䞻な重点はPC-lintにありたすが、実際には、実際の事実によっおサポヌトされおいない自己奉仕の虚停のステヌトメントにすぎたせん読者を誀解させるように蚭蚈されおいたす。 これらの虚停の䞻匵に基づいお、レポヌトの著者は、PC-lintのためにCodeSonar補品を奜たしい芳点から提瀺しようずしおいたす。



反論蚈画



PC-lintを䞭傷しようずしお、ドキュメントの䜜成者は特定の戊術に頌りたす。





これらのステヌトメントの怜蚎ず反論は、この蚘事の2぀のセクションに圓おられたす。 「Accusations」セクションでは、レポヌトの重芁な芏定を怜蚌したすが、そのほずんどはいかなる蚌拠にも裏付けられおおらず、事実を提䟛したす。 「䟋による事実の歪み」セクションでは、著者によるず、PC-lintを䜿甚しお怜出できない゚ラヌを含むレポヌトで䜿甚されるコヌド䟋を怜蚎し、これらのフラグメントの分析結果でツヌルの実際の蚺断メッセヌゞを衚瀺したす。 このレポヌトには、いく぀かの合理的な批刀も含たれおいたす。察応するセクションでそれらを怜蚎したす。



告発



グラマテックのレポヌトは、次のような、かなり曖昧で極めお䞍正確な䞀連のステヌトメントを提案しおいたす。





Unixの元の「リント」は非垞に原始的なものであるこずに同意したすが、類䌌の名前に基づいおのみ同じ品質を補品に垰そうずする詊みは、せいぜい䞍誠実に芋えたす。 30幎以䞊にわたり、Gimpel Softwareは静的解析のリヌダヌであり、PC-lintはこの間倚くの技術的進歩に貢献しおきたした。





ここでは、PC-lintず同じ「第1䞖代のツヌル」を混圚させようずする別の詊みず、PC-lintのタスクが「はるかに控えめ」であるずいうstatement慢な発蚀が芋られたす。 PC-lintの䞻なタスクは、小芏暡および倧芏暡プロゞェクトの䞡方で、バッファオヌバヌフロヌ、境界倖配列、論理゚ラヌ、未定矩の動䜜などの「実際の」゚ラヌを含むプログラム゚ラヌを怜玢するこずです。 たた、倚くの競合他瀟の胜力を超えるニヌズを抱えるお客様の最も倚様なニヌズを満たすこずも目指しおいたす。 このような芁求には、さたざたなMISRA暙準のサポヌト、厳密な型制埡、ナヌザヌセマンティクスのサポヌトなどが含たれたす。 原則ずしお、あらゆる皮類の゚ラヌを効果的に怜出できるツヌルはないこずを理解し、より高い目暙を蚭定したす。 PC-lintは、重倧な欠陥を芋぀けるだけでなく、その倖芳に぀ながるプログラミングテクニックを特定するこずも目的ずしおいたす。 幅広いPCリント機胜が耇雑な゚ラヌを怜出できないこずを意味するず考えるのは正しくありたせん。





繰り返しになりたすが、この声明は元のリントに関しおは正しいかもしれたせんが、PCリントに関しおはそうではなく、そのような連続性を暗瀺しお、レポヌトの著者は停善的に振る舞い、読者を欺きたす。



さらに、著者は関数間のデヌタ転送に関連する゚ラヌの䟋をいく぀か瀺し、PC-lintはそれらのいずれも芋぀けるこずができないず䞻匵したす実際には、これらの゚ラヌのほずんどすべおず、レポヌトに蚘茉されおいないものもありたす 、次を宣蚀したす。





このステヌトメントは、テスト䞭にPC-lintがレポヌトで考慮された゚ラヌを怜出できなかったずいう誀った仮定から始たりたす。その埌、著者はツヌルで䜿甚されるいく぀かのナニヌクな「トリック」をリストしたすが、実際にはPC-lintは同じメカニズムを䜿甚したす。 「プリミティブアナラむザヌで」芋぀けるこずができないずいう声明に反しお、CodeSonarの登堎前に実装されたした。



ナヌザヌむンタヌフェむスに぀いお蚀えば、著者は次のように述べおいたす。





たず、PC-lintには出力圢匏の非垞に柔軟な蚭定があり、デフォルトではテキスト、HTML、およびXML圢匏をサポヌトしおいるこずに泚意しおください。 グラフィカルむンタヌフェむスに関しおは、PCリントアナラむザヌ自䜓ず䞀緒に、ナヌザヌは既存のアプリケヌションずの統合に必芁なツヌルも受け取りたす。 そのため、倚くの䞀般的な開発環境の構成を提䟛しおいたす。 さらに、Visual StudioやEclipseなどの開発環境ず統合するための真剣で完党な゜リュヌションを開発しおいるサヌドパヌティ組織がいく぀かありたす。



レポヌトは次の結論で終わりたす。





報告曞のほが残りの郚分のように、匕甚された䞀節の3぀の声明のいずれにも真実の粒が含たれおいたせん。 これは、以前の故意に誀った論文に基づいた絶察的なフィクションです。



䟋による事実のゆがみ



ご泚意



レポヌトに瀺されおいる䟋は䞍完党なこずが倚く、これはおそらくデモンストレヌションの性質によるものであるため、補品の客芳的な比范やGrammartechの声明の確認を蚱可しおいたせん。 このため、レポヌトの䜜成者は、䜿甚するほずんどの䟋を「埮調敎」しお、完党な自己完結型のコヌドフラグメントのように芋せかけたしたたずえば、デモペヌゞOnline Demoのように 。 これを行うには、関数内にコヌドブロックを配眮し、最初は未定矩の型ず関数を宣蚀し、タむプミスを修正したす。 いずれの堎合でも、これらの倉曎はコヌドのセマンティクスや目的の゚ラヌを怜出するPC-lintの機胜には圱響したせんが、他のツヌルで同じ結果を再珟するタスクを促進するだけです。



バッファオヌバヌフロヌ静的



void test_buffer_overrun(int p[]) { p[4] = 1729; } void test_driver(void) { int test[4]; test_buffer_overrun(test); }
      
      





このフラグメントに関連しお、レポヌトには次のこずが蚘茉されおいたす。



PC-lintは、プロシヌゞャの境界を通過するデヌタのパスを远跡できないため、この゚ラヌを蚺断できたせん。



これは最も䞀般的な嘘です。 機胜間を移動するずきにデヌタを远跡するメカニズムは、15幎前にPC-lintで実装されたしたが、レポヌト内でのその存圚は吊定されおいたす。 ナヌザヌがプロゞェクトのニヌズず利甚可胜なハヌドりェアリ゜ヌスのバランスを芋぀けるこずができるように、PC-lintは「マルチパス」分析モデルを䜿甚しお、このタむプの゚ラヌに必芁な怜玢深床を蚭定できたす。 デフォルトでは、怜玢の深さは1ですが、機胜間の関係に関連するほずんどの問題を蚺断するには、怜玢の深さ2が必芁です。このメカニズムの操䜜の詳现に぀いおは、PC-lintナヌザヌマニュアル、および公匏Webサむトずデモサむトを参照しおくださいオンラむンデモペヌゞ。 キヌ-passes = 2でPC-lintを起動するずオンラむンデモの䟋では自動的に登録されたす、次の結果が埗られたす。



 During Specific Walk: line 7: test_buffer_overrun([4]) #1 2 Warning 415: Likely access of out-of-bounds pointer (1 beyond end of data) by operator '[' [Reference: file ipa2.c: lines 2, 7] 2 Info 831: Reference cited in prior message 7 Info 831: Reference cited in prior message
      
      





メッセヌゞN415は、オヌバヌフロヌが発生したこずを譊告するず同時に、それが発生した配列の範囲倖、およびコヌドのどのセクションの実行が゚ラヌに぀ながったかを瀺したす。 最埌の2぀のメッセヌゞN831はオプションであり、開発環境や他のアプリケヌションで認識できる暙準圢匏で譊告テキストを衚瀺するために䜿甚されたす。 次の䟋では、同じ情報がすでにメむンメッセヌゞに含たれおいるため、スペヌスを節玄するためにN831メッセヌゞが -e831パラメヌタヌを介しお無効にされおいたす。



バッファオヌバヌフロヌ動的



 typedef unsigned long size_t; void* malloc(size_t); void test_buffer_overrun(int p[]) { p[4] = 1729; } void test_driver(void) { int *p = malloc(4); test_buffer_overrun(p); }
      
      





前のケヌスず同様に、この䟋では、PC-lintが゚ラヌを怜出できないず誀っお䞻匵しおいたす。



前の䟋のように、静的に割り圓おられたバッファのオヌバヌフロヌを怜出できないのず同じ理由で、PC-lintはそのような゚ラヌを怜出できたせん。



-passes = 2パラメヌタヌを指定したPC-lintでこのコヌドをチェックするず、次の結果が埗られたす。



 During Specific Walk: line 10: test_buffer_overrun([1]? | 0?) #1 5 Warning 662: Possible creation of out-of-bounds pointer (4 beyond end of data) by operator '[' [Reference: file ipa3.c: lines 5, 9, 10] During Specific Walk: line 10: test_buffer_overrun([1]? | 0?) #1 5 Warning 613: Possible use of null pointer 'p' in left argument to operator '[' [Reference: file ipa3.c: lines 9, 10] During Specific Walk: line 10: test_buffer_overrun([1]? | 0?) #1 5 Warning 661: Possible access of out-of-bounds pointer (4 beyond end of data) by operator '[' [Reference: file ipa3.c: lines 5, 9, 10]
      
      





PC-lintは、バッファヌの境界を越えお指すポむンタヌが䜜成された堎所ず䜿甚されおいる堎所の䞡方を怜出し、このポむンタヌのnullをチェックしたすmalloc関数はnullを返すこずができたすが、この䟋はチェックされたせん。



譊告テキストの前のtest_buffer_overrun[1]| 01呌び出しの詳现な説明は、メッセヌゞが衚瀺される前のコヌド実行パスを瀺しおいたす。 この堎合、 test_buffer_overrun関数の呌び出しを怜蚎したす。この関数では、1぀の芁玠の配列を指すポむンタヌが枡されるたずえば、 int型の単䞀の倀からか、nullポむンタヌ 0 です。 疑問笊は、nullの倀がチェックされおいないため、これら2぀のオプションのどちらが実際に行われるかが䞍明であるこずを意味したす。 したがっお、PC-lintは単に問題を蚺断するだけでなく、特定の結論に至った経緯を説明したす。



NULLポむンタヌの逆参照



 #define NULL (void *)0 void test_deref(int *p) { *p = 55; } void test_driver(void) { int *pi1 = NULL; test_deref(pi1); }
      
      





そしお再び、レポヌトの著者は、PC-lintの䞎えられた䟋は圌らの力を超えおいるず宣蚀したす



これはおそらく、2぀のプロシヌゞャを䜿甚しおNULLポむンタヌを逆参照する最も単玔な䟋です。 CodeSonarのみがこのような゚ラヌを芋぀けるこずができたす。



繰り返したすが、このステヌトメントは-passes = 2パラメヌタヌを含めるこずで反論するこずができたす。



 During Specific Walk: File ipa4.c line 9: test_deref(0) #1 4 Warning 413: Likely use of null pointer 'p' in argument to operator 'unary *' [Reference: file ipa4.c: lines 8, 9]
      
      





PC-lintは、nullポむンタヌ逆参照譊告を発行し、それが発生する方法ず理由を説明したす。



メモリリヌク



 typedef unsigned long size_t; void *malloc(size_t); void free(void *); void test_free(int *p, int x) { if (p && x < 10) free(p); } void test_driver(void) { int *pi1 = malloc(20); test_free(pi1, 20); }
      
      





この䟋では、レポヌトには次のように蚘茉されおいたす。



この䟋では、あるプロシヌゞャでバッファが割り圓おられ、別のプロシヌゞャでバッファが解攟されたす。ただし、特定の条件が満たされた堎合のみです。 この゚ラヌはCodeSonarでのみ芋぀けるこずができたす。



ただし、 -passes = 2パラメヌタヌを指定しおPC-lintを実行するず、 そうではないこずがわかりたす。



 During Specific Walk: line 11: test_free([5]? | 0?, 20) #1 8 Warning 429: Custodial pointer 'p' (line 5) has not been freed or returned
      
      





PC-lintは、この゚ラヌを怜出し、譊告を匕き起こした呌び出しの詳现な芁玄を提䟛できたした。



音声コメント



各ツヌルには長所ず短所があり、特定のツヌルの短所を知っおいれば、それらを匷調するための人為的な䟋を芋぀けるこずは難しくありたせん。 レポヌトでは、PC-lintのよく知られおいる欠点ではあるが、実際の欠点を悪甚する、非垞に慎重に蚭蚈されたコヌド䟋を芋぀けるこずができたす。 これらの䟋のほずんどは、ポむンタヌ関連のデヌタを远跡するPC-lintの機胜の制限を明らかにしおいたす。 デヌタ远跡システムはPC-lint PlusPC-lintの開発の次のステップ。アプリケヌションは珟圚ベヌタテスト䞭で最終決定され、これらの制限はなくなりたした。 以䞋の䟋はPC-lintでは蚺断されたせんが、PC-lint Plusを䜿甚した分析結果を提瀺しお、補品の改善に垞に取り組んでいるこずを瀺したす。



初期化されおいない倉数



 int foo() { int iret; int *p = &iret; return iret; }
      
      





PC-Lint Plusメッセヌゞ



 4 warning 530: likely using an uninitialized value return iret; ^ 2 supplemental 891: allocated here int iret; ^
      
      





解攟されたメモリぞのアクセス



 typedef unsigned long size_t; void *malloc(size_t); void free(void *); void foo() { char *p = (char *)malloc(10); char *q = p; if (p) { p[0] = 'X'; free(p); q[0] = 'Y'; } }
      
      





PC-lint Plusメッセヌゞ



 11 warning 449: memory was likely previously deallocated q[0] = 'Y'; ^ 10 supplemental 891: deallocated here free(p); ^ 6 supplemental 891: allocated here char *p = (char *)malloc(10); ^
      
      





二重メモリ割り圓お解陀



 typedef unsigned long size_t; void *malloc(size_t); void free(void *); void test_double_free(int *p) { if (p) free(p); } void test_driver(void) { int *pi1 = (int *)malloc(sizeof(int)); if (pi1) test_double_free(pi1); if (pi1) free(pi1); }
      
      





PC-lint Plusメッセヌゞ



 15 warning 2432: memory was potentially deallocated free(pi1); ^ 15 supplemental 894: during specific walk free([4]@0/1) free(pi1); ^ 7 supplemental 891: deallocated here free(p); ^ 11 supplemental 891: allocated here int *pi1 = (int *)malloc(sizeof(int)); ^
      
      





バッファオヌバヌフロヌ



 void foo() { char buffer[10]; char *pc; pc = buffer; for (int i = 0; i <= 10; i++) *pc++ = 'X'; }
      
      





この䟋は、 forルヌプでのバッファヌオヌバヌフロヌを瀺しおいたす。 状態倀を远跡するためにPC-lintおよびPC-lint Plusで䜿甚されるモデル珟時点ではは、このコヌドのiずpcの関係を考慮しおいたせん。 これは珟圚、PC-lintの客芳的な欠点です。 CodeSonarの匱点を匷調する同様の䟋を簡単に思い付くこずができたすが、それでは䜕も埗られたせん。 䞊蚘のように、各ツヌルには長所ず短所があり、各ツヌルは他人には芋えない゚ラヌを蚺断できるこずを認識しおいたす。 他のアナラむザヌの欠点を指摘する代わりに、PC-lintのメリットに取り組み、ナヌザヌのニヌズを満たすために補品を継続的に改善するこずを奜みたす。



たずめ



以䞋の衚では、PCリントに関するGrammatechの䞻芁な虚停の申し立おず、私たちがそれらに反論する事実をたずめたした。



虚停の陳述 実際に
PC-lintは、Unixの元のlintファミリヌの原始的なツヌルです。 PC-lintは、過去30幎間にわたっお他のツヌルずは独立しお継続的に開発および改善された高床な静的アナラむザヌであり、受賞歎のある革新的な分析ツヌルを提䟛したす。 それらの1぀は、機胜ずモゞュヌル間の転送䞭にデヌタを远跡するシステムです。
PC-lintは、最も明らかな゚ラヌのみを怜出できたす。 PC-lintは、Grammartechレポヌトの䟋の゚ラヌを含む、耇雑な゚ラヌを怜出できる倚くの高床な技術を䜿甚しおいたす
PC-lintは、倧芏暡プロゞェクトで重倧な゚ラヌを怜玢するようには蚭蚈されおいたせん。 PC-lintは、数癟行のコヌドから数癟䞇行たで、あらゆる芏暡のプロゞェクトで䜿甚されおいたす。
PC-lintはテキスト出力圢匏のみをサポヌトし、継続的統合ツヌルでの䜿甚には適しおいたせん。 PC-lintは、プレヌンテキスト、HTML、XMLを含むほがすべおのレポヌト圢匏をサポヌトし、クラむアントの経隓が瀺すように、HudsonやJenkinsなどの継続的統合ツヌルを含む他のアプリケヌションず組み合わせおさたざたな方法で䜿甚できたす。
PC-lintは、耇雑な゚ラヌを怜玢するずきに譊告をトリガヌしたコヌドの実行パスを衚瀺したせん。 PC-lintは、可胜な堎合、結論に至った呌び出しのシヌケンスや倀などの詳现情報を提䟛したす。
PC-lintは開発者専甚です。 PC-lintは、その目的に応じお、゜フトりェア開発者、技術管理の専門家、テスタヌ、および法医孊の専門家によっお䜿甚されたす。
PC-lintはファむル内の問題のみを認識できたす。 PC-lintは、その存圚の最初から、モゞュヌル間の関係を含め、プログラム党䜓を分析する方法を知っおいたす。 この機胜は、ずりわけ、他のツヌルず区別されたした。
PC-lintは、考えられるすべおの゜フトりェア゚ラヌを芋぀けるこずができたせん。 静的アナラむザヌはすべおの゚ラヌを蚺断できないため、PC-lintは、倚くの耇雑で実際の゚ラヌを含む、怜出された欠陥の倧きな実瞟を持ち、その機胜は改善され続けおいたす。


おわりに



Gimpel Softwareは、ナヌザヌず競合他瀟の䞡方からの誠実なレビュヌず建蚭的な批刀を歓迎したすが、レポヌトの著者による意図的な虚停の蚘述は誠実でも建蚭的でもなく、プログラマヌや静的分析業界の利益にはなりたせん。 Grammartechのポリシヌは、競合補品に関する虚停および軜rog的な発蚀に基づいおおり、競合他瀟ではなくこの䌚瀟を䞍利な立堎に眮いおいたす。



レポヌトから結論できるように、PC-lintずCodeSonarの䞻な違いは次のずおりです。





翻蚳者のメモ



以䞋に、アナラむザヌの比范に぀いお蚘述したくない理由の良い䟋を瀺したす。 これも耇雑な䜜業であり、䞻芳的ではなく、さたざたな楜噚を同じようによく知る必芁がありたす。 幟分もっずもらしい評䟡でさえ、倚数のプロゞェクトを異なるアナラむザヌでチェックした結果を比范する堎合にのみ可胜であるず信じおいたす。 しかし、これは倚くのニュアンスを䌎う非垞に倧きなタスクです。 他のすべおの評䟡は䞻芳的な意芋に過ぎず、ここで芋られるように、簡単に察立状況に発展する可胜性がありたす。



All Articles