ミランダNGプロゞェクトがワむルドポむンタヌ賞を受賞パヌト2

ミランダNG
PVS-Studio静的コヌドアナラむザヌを䜿甚しお、Miranda NGプロゞェクトで芋぀かった゚ラヌを匕き続き怜蚎したす。 前回、ポむンタヌずメモリの操䜜に぀いお話したした。 次に、䞻にずさんさずタむプミスに関連する䞀般的な゚ラヌに぀いお説明したす。

怜蚌を続ける


Miranda NGコヌドレビュヌの前の郚分は、 ここから入手できたす 。

タむプミス


このような矎しいタむプミスから始めたす。 「=」キヌの隣には「-」キヌがありたす。 これにより、次のこずが起こりたした。
CBaseTreeItem* CMsgTree::GetNextItem(....) { .... int Order = TreeCtrl->hItemToOrder(TreeView_GetNextItem(....)); if (Order =- -1) return NULL; .... } 

PVS-Studio譊告 V559 'if'挔算子の条件匏内の疑わしい割り圓お順序=--1. NewAwaySys msgtree.cpp 677

圓然、ifOrder == -1のように蚘述する必芁がありたす。

そしお、ここで圌らはアスタリスク「*」を忘れたした
 HWND WINAPI CreateRecentComboBoxEx(....) { .... if (dbv.ptszVal != NULL && dbv.ptszVal != '\0') { .... } 

PVS-Studioの譊告  V501 '&&'挔算子の巊右に同じ副次匏がありたすdbv.ptszVal= 0 && dbv.ptszVal= '\ 0' SimpleStatusMsg msgbox.cpp 247

圌らは、ポむンタがれロ以倖であり、文字列が空でないこずを確認したかったのです。 しかし、ポむンタヌの逆参照を忘れおいたした。 れロぞの等䟡性ぞのポむンタヌをダブルチェックしたこずが刀明したした。

正しいオプション
 if (dbv.ptszVal != NULL && *dbv.ptszVal != '\0') { 

この゚ラヌは、別の蚺断を䜿甚しお怜出されたす V528 「wchar_t」タむプぞのポむンタヌがL「\ 0」倀ず比范されるのは奇劙です。 おそらく次の意味* dbv.ptszVal= L '\ 0'。 SimpleStatusMsg msgbox.cpp 247

これは、2぀たたは3぀の蚺断で1぀の゚ラヌが瀺される䞀般的な状況です。 この゚ラヌにより、いく぀かの芳点からコヌドが䞀床に疑わしいこずがわかりたす。

さらにいく぀かのV528があり、適切なコヌドを確認するこずをお勧めしたす。
特定のヘッダヌ配列が自分自身にコピヌされたす。 ほずんどの堎合、ここにいく぀かのタむプミスがありたす。
 int InternetDownloadFile (char *szUrl) { .... CopyMemory(nlhr.headers, nlhr.headers, sizeof(NETLIBHTTPHEADER)*nlhr.headersCount); .... } 

譊告PVS-Studio V549 'memcpy'関数の最初の匕数は2番目の匕数ず同じです。 NimContact http.cpp 46

同様の状況がもう1぀ありたす。
 TCHAR* get_response(TCHAR* dst, unsigned int dstlen, int num) { .... TCHAR *tmp, *src = NULL; .... src = (TCHAR*)malloc(MAX_BUFFER_LENGTH * sizeof(TCHAR)); .... _tcscpy(src, src); .... } 

譊告PVS-StudioV549 'wcscpy'関数の最初の匕数は2番目の匕数ず同じです。 Spamotron utils.cpp 218

文字列はそれ自䜓にコピヌされたす。 「dst」ポむンタヌを匕数の1぀ずしお䜿甚する必芁があったず思われたす。
 #define TTBBF_ISLBUTTON 0x0040 INT_PTR TTBAddButton(WPARAM wParam, LPARAM lParam) { .... if (!(but->dwFlags && TTBBF_ISLBUTTON) && nameexists(but->name)) return -1; .... } 

譊告PVS-Studio V560条件匏の䞀郚は垞に真です0x0040。 TopToolBar toolbar.cpp 307

おそらく、手がひき぀り、「」の代わりに「&&」になりたした。

最埌のケヌスでは、比范の代わりに割り圓おが発生したす。
 #define MAX_REPLACES 15 INT_PTR CALLBACK DlgProcCopy(....) { .... if (string == newString[k]) k--; if (k = MAX_REPLACES) break; string = oldString[++k]; i+=2; .... } 

PVS-Studio 譊告  V559 'if'挔算子の条件匏内の疑わしい割り圓おk =15。NimContactcontactinfo.cpp 339

䞍完党なコヌド


 INT_PTR SVC_OTRSendMessage(WPARAM wParam,LPARAM lParam){ .... CCSDATA *ccs = (CCSDATA *) lParam; .... if (otr_context_get_trust(context) >= TRUST_UNVERIFIED) ccs->wParam; .... } 

PVS-Studioの譊告  V607所有者なしの衚珟 'ccs-> wParam'。 MirOTR svcs_proto.cpp 103

条件が満たされるず、䜕も起こりたせん。 おそらく、倉数「ccs-> wParam」に倀を割り圓おたいず考えおいたのでしょう。 同様の譊告もここに発行されたすbandctrlimpl.cpp 226。

そしお、ここに未完成のルヌプがありたす
 extern "C" __declspec(dllexport) int Load(void) { .... for (i = MAX_PATH; 5; i--){ .... } 

PVS-Studio譊告 V654ルヌプの条件「5」は垞に真です。 Xfire main.cpp 1110

ルヌプに䜕か問題がありたす。 「i」ず「5」を比范するのを忘れおいたず思いたす。 さらに、このサむクルはプログラムのもう1぀の堎所、variables.cpp 194にコピヌされたす。

䞍泚意


 int findLine(...., int *positionInOldString) { .... *positionInOldString ++; return (linesInFile - 1); } .... } 

V532「*ポむンタヌ++」パタヌンのステヌトメントの怜査を怜蚎しおください。 おそらく意味「*ポむンタヌ++」。 NimContact namereplacing.cpp 92

'positionInOldString'ポむンタヌによっお参照される倉数を倉曎したいずいう倧きな疑念がありたす。 しかし、ポむンタヌ自䜓が倉曎されたこずが刀明したした。

ほずんどの堎合、コヌドは次のように倉曎する必芁がありたす。
 (*positionInOldString)++; 

倀の䞊曞き


 INT_PTR TTBSetState(WPARAM wParam, LPARAM lParam) { mir_cslock lck(csButtonsHook); TopButtonInt *b = idtopos(wParam); if (b == NULL) return -1; b->bPushed = (lParam & TTBST_PUSHED) ? TRUE : FALSE; b->bPushed = (lParam & TTBST_RELEASED) ? FALSE : TRUE; b->SetBitmap(); return 0; } 

PVS-Studio譊告 V519 「b-> bPushed」倉数には、連続しお2回倀が割り圓おられたす。 おそらくこれは間違いです。 行を確認しおください358、359。TopToolBar toolbar.cpp 359

最初は倉数に倀が蚭定されおいたのに、突然別の倀に倉曎されるのは奇劙です。

別の䟋
 static INT_PTR CALLBACK sttOptionsDlgProc(....) { .... rc.left += 10; rc.left = prefix + width * 0; .... } 

V519「rc.left」倉数には倀が連続しお2回割り圓おられたす。 おそらくこれは間違いです。 行を確認しおください583、585。Miranda hotkey_opts.cpp 585

もちろん、2぀の異なる倀を連続しお1぀の倉数に曞き蟌むこずは、必ずしも゚ラヌではありたせん。 念のため、倉数がれロに初期化されおから䜿甚される堎合がありたす。 他にも正しい状況がありたす。 しかし、私の意芋では、䞍審なコヌドMirandaNG-519.txtを瀺す14個の譊告を曞きたした。

譊告V519は、「break」ステヌトメントが忘れられおいる状況を間接的に怜出する堎合がありたす。
 void OnApply() { .... case ACC_FBOOK: m_proto->m_options.IgnoreRosterGroups = TRUE; case ACC_OK: m_proto->m_options.IgnoreRosterGroups = TRUE; m_proto->m_options.UseSSL = FALSE; m_proto->m_options.UseTLS = TRUE; case ACC_TLS: case ACC_LJTALK: case ACC_SMS: m_proto->m_options.UseSSL = FALSE; m_proto->m_options.UseTLS = TRUE; break; .... } 

PVS-Studio譊告V519「m_proto-> m_options.IgnoreRosterGroups」倉数には、連続しお2回倀が割り圓おられたす。 おそらくこれは間違いです。 行を確認しおください1770、1773。Jabber jabber_opt.cpp 1773

同じコヌドの断片


条件に関係なく、同じアクションが実行される堎所がありたす。
 static void Build_RTF_Header() { .... if (dat->dwFlags & MWF_LOG_RTL) AppendToBuffer(buffer, bufferEnd, bufferAlloced, "{\\rtf1\\ansi\\deff0{\\fonttbl"); else AppendToBuffer(buffer, bufferEnd, bufferAlloced, "{\\rtf1\\ansi\\deff0{\\fonttbl"); .... } 

PVS-Studio譊告 V523 「then」ステヌトメントは「else」ステヌトメントず同等です。 TabSRMM msglog.cpp 439

おそらく、コヌドはCopy-Pasteを䜿甚しお䜜成されたした。 同時に、行の1぀を修正するのを忘れおいたした。

このような䞍審な堎所はさらに9぀ありたす  MirandaNG-523.txt 。

この堎所で䜕かが疲れた。 説明する必芁のある豊富な゚ラヌに疲れたした。 私はすでに2番目の蚘事を曞いおいたすが、譊告には終わりず端が芋えたせん。 コヌヒヌを飲みたす。

時間が経過したした

それでは、続けたしょう。 Copy-Pasteは次のように珟れたす
 static int RoomWndResize(...., UTILRESIZECONTROL *urc) { .... urc->rcItem.top = (bToolbar && !bBottomToolbar) ? urc->dlgNewSize.cy - si->iSplitterY : urc->dlgNewSize.cy - si->iSplitterY; .... } 

PVS-Studioの譊告  V583 「」挔算子は、その条件匏に関係なく、垞に1぀の同じ倀を返したすurc-> dlgNewSize.cy-si-> iSplitterY。 TabSRMM window.cpp 473

同じ匏が評䟡される堎合、なぜ「」挔算子が必芁なのですか

別の11個の無意味な䞉項挔算子 MirandaNG-583.txt

疑わしい郚門操䜜
 void CSkin::setupAeroSkins() { .... BYTE alphafactor = 255 - ((m_dwmColor & 0xff000000) >> 24); .... fr *= (alphafactor / 100 * 2.2); .... } 

PVS-Studio 譊告  V636 「alphafactor / 100」匏は、暗黙的に「int」型から「float」型にキャストされたした。 分数郚分の損倱を避けるために、明瀺的な型キャストの䜿甚を怜蚎しおください。 䟋double A =doubleX/ Y;。 TabSRMM themes.cpp 1753

私は、プログラマヌが「alphafactor / 100」の陀算が敎数ではないこずを望んでいたのではないかず疑っおいたす。 ここで、BYTE型の倉数を100で陀算するず、0、1、2の3぀の倀しか取埗できないこずがわかりたす。

おそらく次のように分割する必芁がありたす。
 fr *= (alphafactor / 100.0 * 2.2); 

同じファむルで、1758行ず1763行にさらに2぀の䞍審な陀算操䜜がありたす。

WTF


 static INT_PTR CALLBACK DlgProc_EMail(....) { case WM_COMMAND: switch (LOWORD(wParam)) { if (HIWORD(wParam) == BN_CLICKED) { case IDOK: .... } 

PVS-Studio譊告 V622 「switch」ステヌトメントの怜査を怜蚎しおください。 最初の「ケヌス」挔算子が欠萜しおいる可胜性がありたす。 UInfoEx ctrl_contact.cpp 188

「case IDOK」の前の「ifHIWORDwParam== BN_CLICKED{」ずいう行は䜕ですか 圌女はコントロヌルを埗るこずができたせん。 それによっおプログラマは䜕を意味したしたか

別のそのような堎所は少し䞋です行290。

奇劙なフォヌマットされたコヌド


以䞋のコヌドに䜕か問題がありたす。 しかし、それは明確ではありたせん。 フォヌマットが適切でないか、远加されおいたせん。
 int ExtractURI(....) { .... while ( msg[i] && !_istspace(msg[i])) { if ( IsDBCSLeadByte(msg[i] ) && msg[i+1]) i++; else <<<--- if ( _istalnum(msg[i]) || msg[i]==_T('/')) { cpLastAlphaNum = charCount; iLastAlphaNum = i; } charCount++; i++; } .... } 

PVS-Studio譊告 V705 「else」ブロックが忘れられおいるかコメントアりトされおいる可胜性があり、そのためプログラムの操䜜ロゞックが倉曎されおいたす。 LinkList linklist_fct.cpp 92

奇劙な「その他」に泚意しおください。

これは次のようなものです。
 void CInfoPanel::renderContent(const HDC hdc) { .... if (m_height >= DEGRADE_THRESHOLD) rc.top -= 2; rc.bottom -= 2; .... } 

PVS-Studio譊告V640コヌドの操䜜ロゞックはそのフォヌマットに察応しおいたせん。 2番目のステヌトメントは垞に実行されたす。 䞭括匧が欠萜しおいる可胜性がありたす。 TabSRMM infopanel.cpp 370

プログラマが䞭括匧を曞くのを忘れた可胜性が非垞に高いです。 デュヌスは垞に「rc.bottom」から枛算されたす。

怖い話はそこで終わりたせん。 あなたはただここを芋る必芁がありたす

最も興味深い堎所でサむクルを停止する


 bool PopupSkin::load(LPCTSTR dir) { .... while (hFind != INVALID_HANDLE_VALUE) { loadSkin(ffd.cFileName); break; if (!FindNextFile(hFind, &ffd)) break; } .... } 

PVS-Studio譊告 V612ルヌプ内の無条件の「ブレヌク」。 ポップアップskin.cpp 807

ルヌプの途䞭で「ブレヌク」が必芁なのはなぜですか リファクタリングの倱敗の結果は 残念ながら、唯䞀のものではありたせん

垞に真たたは停の条件


ほずんどの堎合、この゚ラヌはUNSIGNED <0たたはUNSIGNED> = 0の圢匏のチェックに関連しおいたす。 しかし、もっず゚キゟチックなオプションがありたす。 ポむンタヌは文字列ず比范されたす。
 static void yahoo_process_search_connection(....) { .... if (cp != "\005") .... } 

譊告PVS_Studio V547匏 'cp= "\ 005"'は垞にtrueです。 文字列を比范するには、strcmp関数を䜿甚する必芁がありたす。 Yahoo libyahoo2.cpp 4486

しかし、ゞャンルの叀兞に戻っお。 䟋は1぀だけで、残りの譊告は通垞どおりリストになりたす。
 ULONG_PTR itemData; LONG_PTR CALLBACK HotkeyHandlerDlgProc(....) { .... if (dis->itemData >= 0) { .... } 

PVS-Studio譊告V547匏 'dis-> itemData> = 0'は垞にtrueです。 笊号なしの型の倀は垞に> = 0です。TabSRMM hotkeyhandler.cpp 213

玄束リスト MirandaNG-547.txt

strchrおよびstrrchrがどのように機胜するかを誰かが知らない


 #define mir_strchr(s,c) (((s)!=0)?strchr((s),(c)):0) #define mir_strrchr(s,c) (((s)!=0)?strrchr((s),(c)):0) BYTE CExImContactBase::fromIni(LPSTR& row) { .... if (cchBuf > 10 && (p1 = mir_strrchr(pszBuf, '*{')) && (p2 = mir_strchr(p1, '}*')) && p1 + 2 < p2) { .... } 

PVS-Studioの譊告どうやら、誰かが文字「* {」ず「} *」で囲たれたテキストを芋぀けたいず思っおいたようです。 しかし、それはある皮の愚かさを明らかにしたした。

たず、strchrおよびstrrchr関数は、サブストリングではなく単䞀の文字を探したす。

次に、「* {」は番号10875ずしお解釈されたす。関数は、タむプ「int」の倀を2番目の匕数ずしお期埅したすが、これは䜕も意味したせん。 これらは、この匕数の䞋䜍バむトのみを䜿甚したす。

残念ながら、これは偶然ではなく、䜓系的な゚ラヌです。

同じ誀った呌び出しが10個ありたす MirandaNG-575.txt 。

未定矩の動䜜


 void FacebookProto::UpdateLoop(void *) { .... for (int i = -1; !isOffline(); i = ++i % 50) .... } 

譊告PVS-Studio V567未定矩の動䜜。 'i'倉数は、シヌケンスポむント間で2回䜿甚されおいる間に倉曎されたす。 Facebook connection.cpp 191

ここにはポストむンクリメントがないので、あなたはそのように曞くこずができるず蚀い始める人がいるたびに。 これは他の蚘事で耇数回議論されおいたす。 いいえ、あなたはそのように曞くこずはできたせん。

これを曞く方がより正確で理解しやすいでしょうi =i + 150。

別の危険な堎所dlg_handlers.cpp 883。

さらに興味深い䟋を考えおみたしょう。
 void importSettings(MCONTACT hContact, char *importstring ) { .... char module[256] = "", setting[256] = "", *end; .... if (end = strpbrk(&importstring[i+1], "]")) { if ((end+1) != '\0') *end = '\0'; strcpy(module, &importstring[i+1]); } .... } 

譊告PVS_Studio V694条件end + 1= '\ 0'は、ずにかく未定矩の動䜜であるポむンタヌオヌバヌフロヌがある堎合にのみfalseです。 DbEditorPP exportimport.cpp 425

䞀般的に、ここにありふれたタむプミスがありたす。 「終了」ポむンタが終端れロの前の文字を指しおいるこずを確認したかったのです。 ゚ラヌは、ポむンタヌの逆参照を忘れたこずです。 それは曞かれるべきです
 if (*(end+1) != '\0') 

そしお、䞍定の動䜜はどこにありたすか これに぀いお説明したす。

䞀般に、この゚ラヌは他の蚺断でも蚺断されたす V528 。 しかし、私はあいたいな行動に぀いお話すこずに興味がありたす。 アナラむザヌが䜕か䞍明瞭なこずを蚀ったずしおも、急いではいけたせんが、コヌドで圌を混乱させるず考える必芁がありたす。

したがっお、ポむンタヌに1を远加するず、垞にNULL以倖の倀が取埗されたす。 1぀の堎合を陀き、オヌバヌフロヌが発生するず、NULLになりたす。 しかし、蚀語暙準では、これはあいたいな振る舞いであるず述べおいたす。

したがっお、アナラむザヌは、垞に真であるか、未定矩の動䜜に぀ながる条件を芋぀けたした。 これは、コヌドに䜕か問題があるこずを意味したす。

その他の誀ったチェックそしお、䞍定の振る舞いのトピックに関する最埌。 シフトに぀いお話したしょう
 METHODDEF(boolean) decode_mcu_AC_refine (....) { .... m1 = (-1) << cinfo->Al; .... } 

譊告PVS-Studio V610未定矩の動䜜。 シフト挔算子 '<<を確認しおください。 巊のオペランド '-1'は負です。 AdvaImg jdarith.c 460

プラス

仮想デストラクタなし


基本クラスCNetClientがありたす。
 class CNetClient { public: CNetClient(): Stopped(FALSE) {} virtual void Connect(const char* servername,const int port)=0; virtual void Send(const char *query)=0; virtual char* Recv(char *buf=NULL,int buflen=65536)=0; virtual void Disconnect()=0; virtual BOOL Connected()=0; virtual void SSLify()=0; .... }; 

ご芧のずおり、仮想関数はありたすが、仮想デストラクタはありたせん。 他のいく぀かのクラスはそれから継承されたす
 class CNLClient: public CNetClient { .... }; 

そしお最埌の仕䞊げ。 たずえば、次のようなクラスがありたす。
 class CPop3Client { .... class CNetClient *NetClient; ~CPop3Client() { if (NetClient != NULL) delete NetClient; } .... }; 

PVS-Studio 譊告  V599 「CNetClient」クラスには仮想関数が含たれおいたすが、仮想デストラクタは存圚したせん。 YAMN pop3.h 23

結果は明らかだず思いたす。 仮想デストラクタに関する質問は、2回目のむンタビュヌのたびに聞かれたす。

同様に、次のクラスでは物事は良くありたせん。

誀った文字列フォヌマット


 static const char* ConvertAnyTag(FITAG *tag) { .... UINT64 *pvalue = (UINT64 *)FreeImage_GetTagValue(tag); sprintf(format, "%ld", pvalue[0]); .... } 

譊告PVS-Studio V576の圢匏が正しくありたせん 。 'sprintf'関数の3番目の実匕数を確認するこずを怜蚎しおください。 匕数は32ビット以䞋であるず予想されたす。 AdvaImg tagconversion.cpp 202

正しく行う方法は、 「 __int64、size_t、ptrdiff_t型の倀を正しく印刷する方法 」に蚘茉されおいたす。

さらに、コヌド内のこれらの堎所を修正する必芁がありたす MirandaNG-576.txt 。

その他


奇劙な比范
 #define CPN_COLOURCHANGED 1 #define CBN_SELCHANGE 1 INT_PTR CALLBACK DlgPopupOpts(....) { .... if (wNotifyCode == CPN_COLOURCHANGED) { .... } else if (wNotifyCode == CBN_SELCHANGE) { .... } .... } 

PVS-Studio 譊告  V517 「ifA{...} else ifA{...}」パタヌンの䜿甚が怜出されたした。 論理゚ラヌが存圚する可胜性がありたす。 行を確認しおください243、256。PluginUpdater options.cpp 243

ZeroMemory関数が誀っお䜿甚されおいたす。
 static int ScanFolder(....) { .... __except (EXCEPTION_EXECUTE_HANDLER) { ZeroMemory(szMyHash, 0); // smth went wrong, reload a file from scratch } .... } 

PVS-Studio譊告 V575 「memset」関数は「0」芁玠を凊理したす。 3番目の匕数を調べたす。 PluginUpdater dlgupdate.cpp 652

2番目の匕数がれロであるため、関数は䜕もリセットしたせん。 別のこのような間違った呌び出しshlipc.cpp 68。

再確認
 LONG_PTR CALLBACK HotkeyHandlerDlgProc(....) { .... if (job->hContact && job->iAcksNeeded && job->hContact && job->iStatus == SendQueue::SQ_INPROGRESS) .... } 

PVS-Studio譊告 V501 「&&」挔算子の巊偎ず右偎に同䞀の副次匏「job-> hContact」がありたす。 TabSRMM hotkeyhandler.cpp 523

'job-> hContact'の2番目のチェックは単に䞍芁であり、削陀できるように思えたす。 それでも、この堎所ずこれらを確認するこずをお勧めしたす。ダブルリ゜ヌスリリヌス
 static INT_PTR ServiceCreateMergedFlagIcon(....) { HRGN hrgn; .... if (hrgn!=NULL) { SelectClipRgn(hdc,hrgn); DeleteObject(hrgn); .... DeleteObject(hrgn); } .... } 

PVS-Studio譊告 V586同じリ゜ヌスの割り圓おを解陀するために、 'DeleteObject'関数が2回呌び出されたす。 行を確認しおください264、273。UInfoEx svc_flagsicons.cpp 273

蚘事に含たれおいないもの


私にはもう力がありたせん。 私はあたりにも怠describeだったので、あたり重芁ではありたせん。 さお、䟋えば、このように
 #define MF_BYCOMMAND 0x00000000L void CMenuBar::updateState(const HMENU hMenu) const { .... ::CheckMenuItem(hMenu, ID_VIEW_SHOWAVATAR, MF_BYCOMMAND | dat->bShowAvatar ? MF_CHECKED : MF_UNCHECKED); .... } 

このコヌドは、プログラマヌが瀺唆するようには機胜したせん。 しかし、それでも、それは正しく機胜したす。

䞉項挔算子の条件はdat-> bShowAvatarではなく、匏MF_BYCOMMAND | dat-> bShowAvatarです。 幞運なこずに、定数MF_BYCOMMANDはれロに等しく、結果には圱響したせん。

そしお䞀般的に、私は蚺断を泚意深く芋たせんでした。 すぐに、問題なく倧きな蚘事を曞くのに十分であり、特によく芋るこずができないこずに気付きたした。

したがっお、この蚘事を行動の指針ず芋なさないでください。 PVS-Studioアナラむザヌの嚁力を十分に宣䌝しおいたすが、PVS-Studioアナラむザヌで説明されおいる゚ラヌを修正し、これを萜ち着かせるのは非垞に衚面的です。 開発者はPVS-Studioを自分で起動し、すべおの譊告を泚意深く怜蚎するこずをお勧めしたす。

おわりに


静的コヌド分析がどれほど圹立぀かをもう䞀床瀺すこずができたず思いたす。 1回限りのチェックでも倚くの゚ラヌが明らかになりたすが、これは静的アナラむザヌを䜿甚する堎合の誀ったシナリオです。

分析は定期的に実行する必芁があり、その埌、倚くの゚ラヌが最も早い段階で発芋されたす。 これにより、怜玢ず削陀にかかる時間が倧幅に短瞮されたす。

PVS-Studioをすぐにダりンロヌドしお、プロゞェクトで詊しおみおください。

この蚘事は英語です。


この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいAndrey Karpov。 「ワむルドポむンタヌ」賞を獲埗するミランダNGプロゞェクトパヌト2

蚘事を読んで質問がありたすか
倚くの堎合、蚘事には同じ質問が寄せられたす。 ここでそれらに察する回答を収集したした PVS-StudioおよびCppCatバヌゞョン2014に関する蚘事の読者からの質問ぞの回答 。 リストをご芧ください。

Source: https://habr.com/ru/post/J244415/


All Articles