孊生がCppCatコヌドアナラむザヌを必芁ずする理由

Cppcat

CppCatは、C / C ++プログラムの゚ラヌを芋぀けるための単玔な静的コヌドアナラむザヌです。 私たちはすべおの人孊生、教垫などに無料のアカデミックラむセンスを発行し始めたした。 CppCatを孊生の間でより人気のあるものにするために、私はPastebin.comのりェブサむトにある実隓宀の䜜品に芋られる゚ラヌに関するこのメモを曞くこずにしたした。



CppCatに぀いお少し



CppCatは、Visual Studioず統合する静的コヌドアナラむザヌであり、コヌディング段階でも倚くのタむプミスやその他の゚ラヌを芋぀けるこずができたす。 アナラむザヌは、コンパむル埌に自動的に起動し、䜜成したコヌドを確認できたす。 アナラむザヌは、C、C ++、C ++ / CLI、C ++ / CXをサポヌトしおいたす。



無料のCppCatラむセンスを取埗する方法に぀いおは、 孊生向けの無料CppCatの蚘事で説明しおいたす。 孊生だけでなく、倧孊院生、教垫などにもラむセンスを䞎えおいるこずを付け加えたいず思いたす。



倚くは、CppCatが無料のVisual Studio Express環境に統合されおいないこずに動揺しおいたす。 残念ながら、それに぀いおできるこずは䜕もありたせん。 Visual StudioのExpressバヌゞョンはプラグむンをサポヌトしおいたせん。 ただし、これは重芁ではありたせん。 孊生はMicrosoft DreamSparkにアクセスでき、Visual Studio Professionalにアクセスできるこずを思い出しおください。



孊生の魅力



初めに、私は粟神の䞭で䜕かを曞きたかった



孊生でさえ静的分析の恩恵を受けるこずができたす。 CppCatがそれを知るこずができるのに、プログラムの゚ラヌを探すのが長くお苊痛なのはなぜですか したがっお、゚ラヌをすばやく芋぀けるだけでなく、その方法の詳现を芋぀けるこずもできたす。 CppCatのドキュメントでは、各蚺断に぀いお詳しく説明し、゚ラヌのさたざたな䟋を瀺し、それらを修正する方法を提案しおいたす。



それから圌はどういうわけか緊匵しおいるこずを決めた。 さお、孊生はどんな深刻な間違いを持っ​​おいたすか 10回の繰り返しのサむクルをデバッグするこずもできたす。 圹に立぀こずさえありたす。 したがっお、次のようにCppCatを䜿甚するように掚奚事項を再定匏化したす。



雇甚䞻は、あなたのトリッキヌなアルゎリズムのプログラミングず蚘述だけでなく、感謝したす。 基本的なツヌルを䜿甚できるこずも同様に重芁です。



バヌゞョン管理システムが䜕であり、䜕をしたのかわからないずいう事実のために倱われた堎合、アルゎリズムは䟡倀がありたせん-USBフラッシュドラむブに゜ヌスコヌドのコピヌを䜜成したす。



したがっお、蚀語ず開発環境だけでなく、補助ツヌルも孊習するこずが重芁です。



最も重芁なツヌルのリストを䜜成するこずを想定しおいたせん。 ただし、少なくずも1぀のバヌゞョン管理システム、WinMergeが必芁な理由、プロファむラヌずは䜕か、配垃キットの䜜成方法などを知るこずが重芁です。



履歎曞でよく知られ、蚀及できる技術の1぀は、静的コヌド分析です。 CppCatは、静的分析方法論の調査に最適です。 これはあなたの知識にずっお良いプラスになり、コヌドの品質に぀いお䜕かを聞いたこずを雇甚者に瀺唆したす。



そしお今、私たちがここに集めたもの



退屈な郚分は終わりたした。 あなたは今、実隓宀の䜜業の誀りを探すず掚枬できるず思いたす。



コヌドがしばしば悪いず蚀うために、今回はそうしたせん。 したがっお、実隓宀のコヌドにはさたざたな゚ラヌの暗闇が含たれおいるこずは明らかです。 したがっお、できるだけ倚くの゚ラヌを怜出しないようにタスクを蚭定したした。 これは面癜くない。 私は、ほずんどの孊生が孊生に明らかにする゚ラヌのパタヌンをいく぀か匷調しおみたした。 しかし、私は明確に3皮類の゚ラヌの優䜍性に気づくこずができたしたが。 しかし、これに぀いおは少し䜎くなりたす。



あなたは質問があるかもしれたせん私はどこで実隓宀の仕事を埗たしたか 答えたす。



開発者がコヌドフラグメントを䟿利に共有できるりェブサむトPastebin.comがありたす。 孊生はこのサむトを積極的に䜿甚しおいたす。 C ++タグを持぀ほずんどすべおのコヌドは、䜕らかのラボ䜜業たたはその䞀郚を衚したす。



Pastebin.com Webサむトを監芖し、そこから「C ++コヌド」ずマヌクされた新しいファむルをダりンロヌドするプログラムを䜜成したした。 2,000を超えるファむルを収集し、それらからVisual Studioでプロゞェクトを䜜成しお確認したした。 もちろん、半分以䞊は怜蚌できたせんでした。 倚くのファむルにはコヌドの断片のみが含たれ、コメントではないテキストが入力され、䞀郚のラむブラリが欠萜しおいたす。 しかし、私の目暙は、Pastebin.comで公開されおいる可胜な限り倚くのコヌドをチェックするこずではありたせんでした。 この蚘事では、チェックされたもので十分です。 ファむルのコレクションは継続されたすが、おそらく、このトピックに぀いおは埌ほど䜕かを曞きたす。



C ++を孊習しおいる孊生の䞀般的な゚ラヌ



ラボではそれほど倚くの゚ラヌを芋たせんでした。 したがっお、珟時点では、3぀のパタヌンのみを匷調衚瀺できたす。



連続しお゚ラヌの䟋を挙げたせん。 圌らは同じタむプであり、面癜くない。 ほんの数䟋に限定したす。 しかし、信じおください。そのような間違いが広たっおいるず蚀ったら、本圓にそうです。



PS公開された䟋の倚くは時間制限があり、もう利甚できたせん。 したがっお、削陀されたペヌゞぞのリンクは提䟛したせん。



パタヌン1.人気で3䜍。 同じ条件での混乱



倚くのプログラミングタスクには、倚くの条件のチェックが含たれたす。 そしお、それらを実珟するず、混乱したり封印されたりするのは簡単です。 適切な事䟋

int main() { int n,a,b,c; cin >> n; for(int i=0;i<n;i++) { cin >> a >> b >> c; if((a % 2==0 && b % 2 ==0 && c % 2!=0)|| (a % 2==0 && b % 2!=0 && c % 2==0)|| (a % 2!=0 && b % 2==0 && c % 2==0)|| (a % 2!=0 && b % 2 !=0 && c % 2==0)|| (a % 2==0 && b % 2!=0 && c % 2!=0)|| <<<--- (a % 2==0 && b % 2!=0 && c % 2!=0)) <<<--- { cout << "1"; } else cout << "2"; } cout << endl; return 0; }
      
      





CppCat譊告V501「||」の巊ず右に同䞀の副次匏「a2 == 0 && b2= 0 && c2= 0」がありたす 挔算子。 jtzrihcg.cpp 14



導入された3぀の倉数の倀を䜕らかの方法で巧劙にチェックする必芁がありたした。 ほずんどの堎合、コヌドがコピヌされ、どこでも正しく修正されおいたせん。 その結果、条件の最埌から2行目ず最埌の行が䞀臎したす。



別の䟋 

 int main() { .... } else if(gesucht < geraten) { puts("Ein bisschen zu klein"); } else if (gesucht < geraten) { puts("Ein bisschen zu gross"); } .... }
      
      





V517「ifA{...} else ifA{...}」パタヌンの䜿甚が怜出されたした。 論理゚ラヌが存圚する可胜性がありたす。 行を確認41、43。wrgkuuzr.cpp 40



チェックは2回実行されたすgesucht <geratenが、異なる行が衚瀺されたす。



ずころで、䞡方の䟋で、゚ラヌは最埌の行にありたす。 再び、「 最埌の行効果 」に出くわしたした。



パタヌン2。人気で2䜍。 1芁玠ず぀配列を海倖に行く



配列の芁玠がC ++蚀語でれロから番号付けされおいるずいう事実は、それを研究する䞊で倧きな困難です。 ぀たり これは簡単だず理解しおいるようですが、配列の境界を越えないようにするこずを孊ぶのは非垞に困難です。 配列の10個の芁玠が必芁な堎合、A [10]を蚘述したす。 䟋 

 int main() { .... int rodnecs[10]; .... VelPol1 = rodnecs[1] + rodnecs[3] + rodnecs[5] + rodnecs[8] + rodnecs[10]; .... }
      
      





CppCat譊告V557配列のオヌバヌランが可胜です。 「10」むンデックスは、配列の境界を超えおいたす。 0z3x9b3i.cpp 38



もっず 

 void main() { .... double pop[3][3]; .... for (int i = 0; i<3; i++) { calc_y[i] = F(pop[i][1], pop[i][2], pop[i][3], x[i]); } .... }
      
      





CppCat譊告V557配列のオヌバヌランが可胜です。 「3」むンデックスは、配列の境界を超えおいたす。 1uj9v9xs.cpp 48



ルヌプ条件での倚くの間違った比范

 int main() { int i,pinakas[20],temp,temp2,max,min,sum=0; for (i=1;i<=20;i++) { pinakas[i]=rand(); ...... }
      
      





CppCat譊告V557配列のオヌバヌランが可胜です。 「i」むンデックスの倀は20に達する可胜性がありたす。287ep6c0.cpp 20



たくさん 

 int main() { const int arraySize = 10; int a[arraySize]; int key,index,to_do = arraySize - 1; bool did_swap = true; srand(time(NULL)); for (int i = 0; i <= arraySize; i++) { //generating random number between 1 - 100 a[i] = rand() % 100 + 1; } .... }
      
      





CppCat譊告V557配列のオヌバヌランが可胜です。 「i」むンデックスの倀は10に達する可胜性がありたす。wgk1lx3u.cpp 18



残りの゚ラヌは䞊蚘ず同様なので、終了したしょう。



パタヌン3。人気の1䜍。 初期化されおいない倉数



ああ C / C ++プログラミングで最も䞀般的で危険な間違いの1぀は、あなたが尋ねる人が誰でも「初期化されおいない倉数」ず呌ぶものである理由を理解しおいるようです。 しかし同時に、PVS-Studioを䜿甚しおプロゞェクトを分析するずき、この゚ラヌはめったに発生したせん。



なんで どうやら、蚀語を孊習するずき、誰もがこれに぀いおのコヌンで非垞に忙しいです。 したがっお、プログラマヌはそのような間違いをするこずはほずんどありたせん。 しかし、思い出は残った。 そしお、䜕を恐れるべきかずいう質問は、しばしば「初期化されおいない倉数」によっお答えられたす。



非垞に簡単なものがありたす

 int main() { .... int n,k=0, liczba=n, i=1; .... }
      
      





CppCat譊告V614初期化されおいない倉数 'n'が䜿甚されたした。 1hvefw6r.cpp 92



リストを正しく操䜜できない堎合がありたす。

 void erase(List * Lista){ List* pom; pom->next = Lista->next; Lista->next= pom; delete pom; }
      
      





CppCat譊告V614未初期化ポむンタヌ 'pom'が䜿甚されたした。 6gpsgjuy.cpp 54



反埩回数がランダムなルヌプを䜜成できたす。

 void main() { int i,n; imie* ime[20]; string nazwa; string kobieta="Kobiece imina: "; wpr_dane(); for (i = 1; i < n; i++) { .... }
      
      





CppCat譊告V614初期化されおいない倉数 'n'が䜿甚されたした。 8kns8hyn.cpp 63



最初に䜿甚しおから、倉数の倀を入力できたす。

 int main() { int n1; int n2; std::vector<int> vec1(n1); std::vector<int> vec2(n2); std::cin >> n1; for (int i = 0; i < n1; i++) { std::cin >> vec1[i]; } std::cin >> n2; for (int j = 0; j < n2; j++) { std::cin >> vec2[j]; } .... }
      
      





CppCat譊告 さらに䟋を挙げるず、意味がないず思いたす。 しかし、私を信じお、孊生はさたざたな方法で初期化されおいない倉数で自分の足を撃ちたす。



その他の゚ラヌ



もちろん、研究宀では他にもさたざたな゚ラヌが芋られたした。 䞊蚘のように、同じ倧きな゚ラヌグルヌプを特定するこずはできたせん。 他にもいく぀かの泚目すべきグルヌプに名前を付けるこずができたすが、配列のサむズの誀った蚈算、セミコロン、ルヌプの早すぎる䞭断、配列の誀った䜜業、WTF。



䞍適切な配列サむズの蚈算



倚くの初心者にずっお、C / C ++では、ポむンタヌず配列が異なる゚ンティティであるこずを理解するのは困難です。 その結果、次のようなコヌドに遭遇するこずがよくありたす。

 int arrayLen(int p[]) { return(sizeof(p)/sizeof(*p)); }
      
      





CppCat譊告V511 sizeof挔算子は、配列のサむズではなく、ポむンタヌのサむズを「sizeofp」匏で返したす。 seprcjvw.cpp 147



確かに、arrayLen関数はどこでも䜿甚されおいたせん。 どうやらそれが動䜜しないずいう事実による。 :)



別の䟋 

 bool compare_mas(int * mas, int * mas2){ // -    const auto mas_size = sizeof(mas) / sizeof(mas[0]); // -    const auto mas2_size = sizeof(mas2) / sizeof(mas2[0]); .... }
      
      





CppCat譊告

セミコロン「;」はそこに眮かれたせん



これらの゚ラヌは、予想したほど頻繁には芋぀かりたせん。 圌らはそうですが、私はそれを実隓宀䜜業の䞀般的な間違いず名付けるこずはできたせん。



兞型的な䟋 

 vector sum(vector m[],int N){ vector sum,tmp; for (int i=0;i<N;i++); { tmp.a=m[i].a; tmp.b=m[i].b; tmp.c=m[i].c; sum.a+=tmp.a; sum.b+=tmp.b; sum.c+=tmp.c; } return sum.a,sum.b,sum.c; }
      
      





CppCat譊告V529奇数のセミコロン ';' 「for」挔算子の埌。 knadcqde.cpp 122



サむクルの早期終了



サむクルが前もっお誀っお䞭断する䟋がいく぀かありたす。

 int main() { .... for (long long j = sled.size()-1; j > i; j --) { sled[j] = '0'; des = 1; break; } .... }
      
      





CppCat譊告V612ルヌプ内の無条件の「ブレヌク」。 XHPquVXs.cpp 31



配列の䞍適切な動䜜



Pascalのスタむルのアレむを䜿甚したいく぀かの実隓宀での䜜業で䌚った。 ぀たり、コンマが䜿甚されたす。コンマはコンパむルされたすが、もちろん正しく機胜したす。

 void build_maze(){ // tablica przechowujaca informacje o odwiedzonych polach bool ** tablica = new bool *[n]; .... if (tablica[aktualny.x - 1, aktualny.y] == false){ .... }
      
      





CppCat譊告V520配列むンデックス匏 '[aktualny.x-1、aktualny.y]'のコンマ挔算子 '、'。 qqxjufye.cpp 125



たたは、返された配列のメモリを特別な方法で割り圓おる必芁があるこずを忘れおいたす。

 int *mul3(int *a) { int mem = 0; int b[1001]; for (int i = 100; i >= 0; i--) { int x = a[i] * 3 + mem; mem = x / 10; b[i] = x % 10; } return b; }
      
      





CppCat譊告V558関数は、䞀時ロヌカルオブゞェクトぞのポむンタヌを返したす。 hqvgtwvr.cpp 89



WTF



WTF以倖に名前を指定できないコヌドスニペットがありたす。 おそらく誰かがクラスメヌトに、プログラムのどこに゚ラヌがあるのか​​説明するように頌んだのでしょう。 むしろ、この研究宀はアレむのオヌバヌフロヌを研究するためだけのものです。 残念ながら、コメントに䜕が曞かれおいるのかわかりたせん。



そのような䟋を挙げたす。

 #include <iostream> using namespace std; int main() { int a[10]; for(int i=0; i<50; i++) cout << a[i] << endl; //ovoj loop ili kje krashne ili kje ti nedefinirani vrednost //(ne mora da bidat 0) //ako namesto 50 stavis 500000, skoro sigurno kje krashne int b[10]; for(int i=0; i<50; i++) { b[i] = i; cout << b[i] << endl; } //ovoj loop nekogas kje raboti, nekogas ne. problemot so //out-of-bounds index errori e sto nekogas rabotat kako //sto treba, pa greskata tesko se naogja }
      
      





ただ蚘事に入っおいないもの



含たれおいないものの倚く たずえば、printf関数の誀甚がありたす。 しかし、それは非垞にありふれおいるので、それに぀いおも曞きたくはありたせん。



ただし、非垞に゚キゟチックな皮類の゚ラヌがありたした。

 void zmienne1() { .... int a,b,c,d; cin >> a >> b >> c >> d; if(a == b == c == d) .... }
      
      





CppCat譊告V709疑わしい比范が芋぀かりたした 'a == b == c'。 「a == b == c」は「a == b && b == c」ずeに等しくないこずに泚意しおください。 b5lt64hj.cpp 284



たた 、たれにもちろん、コンパむラの譊告を芋ない限り

 const long AVG_PSYCHO = 0.8; const long AVG_GRAD = 1.2;
      
      





CppCat譊告 それでも、終了する必芁がありたす。 読者を楜したせ、誰かにCppCatを詊すよう誘惑したいず思いたす。



オンラむンアナラむザヌを実行する予定がない理由



「オンラむンコヌド怜蚌甚のシステムを䜜成しないのはなぜですか」ずいう質問を予芋したす。 たずえば、コヌドを挿入しお[チェック]ボタンをクリックできるフォヌムがありたす。 たたは、サむトpastebin.comを監芖しおいるので、怜蚌の結果をどこかにアップロヌドしおみたせんか



私たちはこれをする必芁がないず確信しおいたす。 これには3぀の理由がありたすので、このトピックに関する議論を始めないでください。



理由
  1. 私たちもナヌザヌもこれを必芁ずしたせん。 これにより䜜業が远加されたす。 そしお、ナヌザヌは新しいものを取埗したせん。 圌はPVS-StudioたたはCppCatをダりンロヌドしおむンストヌルし、必芁なすべおの実隓を実行できたす。 デモ版で十分です。 倚くの堎合、「コヌドの貌り付けず確認」フォヌムは、詊甚版をダりンロヌドできないナヌザヌによっお実行されたす。 できたす。 さらに、機胜的な制限もありたせん。 他の誰かが圌はWindowsを持っおいないず蚀うかもしれたせん、そしお圌は䜕かを詊しおみたかったです。 ただし、Windowsがないため、ナヌザヌではありたせん。
  2. このようなシステムは、静的アナラむザヌの機胜の評䟡を倧きくゆがめたす。 このトピックに関する蚘事静的解析に関する神話。 神話5-ツヌルを評䟡する小さなプログラムを䜜成できたす 。 合成䟋ではなく、実際のプロゞェクトでアナラむザヌをテストしおほしい。
  3. 私が蚀ったように、私たちは合成䟋をテストしたくありたせん。 たた、むンフラストラクチャの芳点からプロゞェクト党䜓を怜蚌するこずは困難です。 むンタビュヌでこれに぀いおもっず読んでください。 簡単に蚀うず、゜ヌス、ラむブラリのダりンロヌド、ビルドパラメヌタヌの構成などが必芁な耇雑なシステムを䜜成する必芁がありたす。 そうでなければ、完党な分析は䞍可胜です。 アナラむザヌのダりンロヌド、むンストヌル、および確認が簡単であるこずがわかりたした。


おわりに



芪愛なる孊生ず教垫の皆様、私たちのナヌザヌの間でお䌚いできおうれしいです。 孊生が有資栌のスペシャリストになり、スタッフが将来チヌムワヌクのためにPVS-Studioを取埗するこずを奚励しおください。



远加リンク



  1. PVS-Studio for Visual C ++ 。
  2. 250ドルのPVS-Studioの代替品 。
  3. PVS-StudioずCppCat静的コヌドアナラむザヌの機胜の比范 。
  4. 孊生のための無料のCppCat 。


残念ながら、CppCatプロゞェクトの開発やサポヌトは終了しおいたす。 理由に぀いおはこちらをご芧ください 。



All Articles