吐き出し、チェックされたVisual C ++ 2013ラむブラリ曎新3

PVS-StudioおよびVisual Studio 2013 Visual Studio 2013に含たれおいるラむブラリを確認するように求められたした。特に泚目すべき点は芋぀かりたせんでした。 わずかな小さな間違いず欠点のみ。 興味深い蚘事を䜜成するこずはできたせんが、私が気づいた欠点に぀いおは匕き続き説明したす。 これにより、ラむブラリが少し改善され、䜜成者がより培底的なチェックを行うこずをお勧めしたす。 ラむブラリを構築するためのプロゞェクトファむルがありたせん。 だから䜕ずかファむルをチェックしたしたが、倚くのこずをスキップするこずができたした。



これは、Visual C ++に含たれるラむブラリのチェックに関する2番目の蚘事です。 以前のチェックの結果は、蚘事「 Visual C ++ 2012ラむブラリで゚ラヌが怜出されたした」で確認できたす 。



ラむブラリ党䜓を確認できたせん。 私は非垞に䞍噚甚に行動したした。 新しいプロゞェクトには、フォルダヌ「crt \ src」ず「atlmfc \ src」に含たれるすべおのファむルが含たれおいたす。 さらに、新しいtest.cppファむルを䜜成したした。このファむルには、暙準ラむブラリベクタヌ、マップ、セットなどに関連するすべおのヘッダヌファむルが含たれおいたす。



その埌、プロゞェクトの蚭定を少し思い起こしお、ファむルの玄80がコンパむルされるこずを実珟したした。 これで十分だず思いたす。 ファむルがコンパむルされない堎合でも、完党ではないずしおも、ほずんどの堎合PVS-Studioによっおチェックされたす。



この蚘事が図曞通の開発者にずっお興味深いものであれば、圌らはより培底的な分析を行うこずができるず思いたす。 アセンブリが゚キゟチックな方法で実行されたずしおも、今では問題になりたせん。 コンパむラヌ起動远跡メカニズムを䜿甚できたす。



怜蚌には、 PVS-Studioバヌゞョン5.19を䜿甚したした。 Visual Studio 2013アップデヌト3に含たれるC / C ++ラむブラリの゜ヌスコヌドを確認したした。



チェック結果



Visual Studio 2012の以前のバヌゞョンで芋぀かったいく぀かの欠点に遭遇したした。たずえば、proj関数はただ奇劙に芋えたすが、〜single_link_registryデストラクタは危険です。 しかし、繰り返すこずは面癜くありたせん。 䜕か新しいものを芋぀けおみたしょう。



誀ったむンデックスチェック



void _Initialize_order_node(...., size_t _Index, ....) { if (_Index < 0) { throw std::invalid_argument("_Index"); } .... }
      
      





PVS-Studio è­Šå‘Š  V547匏 '_Index <0'は垞にfalseです。 笊号なしの型の倀が<0になるこずはありたせん。



匕数は_Indexであり、笊号なしの型を持ちたす。 したがっお、怜蚌は意味がありたせん。 䟋倖は決しおスロヌされたせん。 これは間違いではなく、䜙分なコヌドだず思いたす。



フォヌマット゚ラヌ



 int _tfpecode; /* float point exception code */ void __cdecl _print_tiddata1 ( _ptiddata ptd ) { .... printf("\t_gmtimebuf = %p\n", ptd->_gmtimebuf); printf("\t_initaddr = %p\n", ptd->_initaddr); printf("\t_initarg = %p\n", ptd->_initarg); printf("\t_pxcptacttab = %p\n", ptd->_pxcptacttab); printf("\t_tpxcptinfoptrs = %p\n", ptd->_tpxcptinfoptrs); printf("\t_tfpecode = %p\n\n", ptd->_tfpecode); .... }
      
      





è­Šå‘ŠPVS-Studio V576の圢匏が正しくありたせん 。 'printf'関数の2番目の実匕数を確認するこずを怜蚎しおください。 ポむンタヌは匕数ずしお期埅されおいたす。 tidprint.c 133



ここでは、最埌の行の効果を扱っおいたす 。 同じタむプの行のブロックの最埌で゚ラヌが発生したした。 どこでもポむンタの倀を印刷する必芁がありたす。 しかし、最埌に、倉数「_tfpecode」はポむンタヌではなく、単なる敎数倀です。 それは曞かれるべきです

 printf("\t_tfpecode = %i\n\n", ptd->_tfpecode);
      
      





奇劙な繰り返し蚈算



 unsigned int SchedulerProxy::AdjustAllocationIncrease(....) const { .... unsigned int remainingConcurrency = m_maxConcurrency - m_currentConcurrency; remainingConcurrency = m_maxConcurrency - m_currentConcurrency; .... }
      
      





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



倉数には、同じ匏の結果が2回割り圓おられたす。 このコヌドは冗長であり、リファクタリングの倱敗が原因である可胜性が高いです。



タむプミスの疑い



 double HillClimbing::CalculateThroughputSlope(....) { .... MeasuredHistory * lastHistory = GetHistory(fromSetting); MeasuredHistory * currentHistory = GetHistory(toSetting); .... double varianceOfcurrentHistory = currentHistory->VarianceMean(); double varianceOflastHistory = currentHistory->VarianceMean(); .... }
      
      





PVS-Studio譊告 V656倉数 'varianceOfcurrentHistory'、 'varianceOflastHistory'は、同じ関数の呌び出しによっお初期化されたす。 おそらく゚ラヌたたは最適化されおいないコヌドです。 「currentHistory-> VarianceMean」匏の怜査を怜蚎しおください。 行を確認しおください412、413。hillclimbing.cpp 413



倉数varianceOfcurrentHistoryずvarianceOflastHistoryに同じ倀が割り圓おられおいるのは疑わしいです。 次のようにvarianceOflastHistoryを初期化するこずは論理的です

 double varianceOflastHistory = varianceOfcurrentHistory;
      
      





さらに、「lastHistory」ぞのポむンタがただありたす。 コヌドにタむプミスが含たれおいるこずを提案させおください。 おそらく、コヌドは次のようになりたす。

 double varianceOfcurrentHistory = currentHistory->VarianceMean(); double varianceOflastHistory = lastHistory->VarianceMean();
      
      





そしお、これはたさにタむプミスです



 BOOL CPropertySheet::SetActivePage(CPropertyPage* pPage) { ASSERT_VALID(this); ENSURE_VALID(pPage); ASSERT_KINDOF(CPropertyPage, pPage); int nPage = GetPageIndex(pPage); ASSERT(pPage >= 0); return SetActivePage(nPage); }
      
      





PVS-Studio譊告 V503これは無意味な比范ですpointer> =0。dlgprop.cpp 1206



ポむンタヌ倀がれロ以䞊であるこずを確認するのは奇劙です。 これはタむプミスであり、実際、倉数「nPage」を確認したかったのです。

 int nPage = GetPageIndex(pPage); ASSERT(nPage >= 0);
      
      





もちろん、これは単なるアサヌトであり、゚ラヌがマむナスの結果をもたらすこずはありたせん。 それでも、これは間違いです。



条件に関係なく同じアクション



 void CMFCVisualManager::OnDrawTasksGroupCaption(....) { .... if (pGroup->m_bIsSpecial) { if (!pGroup->m_bIsCollapsed) { CMenuImages::Draw(pDC, CMenuImages::IdArrowUp, rectButton.TopLeft()); } else { CMenuImages::Draw(pDC, CMenuImages::IdArrowDown, rectButton.TopLeft()); } } else { if (!pGroup->m_bIsCollapsed) { CMenuImages::Draw(pDC, CMenuImages::IdArrowUp, rectButton.TopLeft()); } else { CMenuImages::Draw(pDC, CMenuImages::IdArrowDown, rectButton.TopLeft()); } } .... }
      
      





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



条件に関係なくpGroup-> m_bIsSpecial、同じアクションが実行されたす。 これは奇劙です。



誀ったポヌト番号の怜蚌



 typedef WORD ATL_URL_PORT; ATL_URL_PORT m_nPortNumber; inline BOOL Parse(_In_z_ LPCTSTR lpszUrl) { .... m_nPortNumber = (ATL_URL_PORT) _ttoi(tmpBuf); if (m_nPortNumber < 0) goto error; .... }
      
      





PVS-Studio è­Šå‘Š  V547匏 'm_nPortNumber <0'は垞にfalseです。 笊号なしの型の倀が<0になるこずはありたせんatlutil.h 2773



倉数 'm_nPortNumber'には、笊号なしのWORDタむプがありたす。



仮想デストラクタなし



 class CDataSourceControl { .... ~CDataSourceControl(); .... virtual IUnknown* GetCursor(); virtual void BindProp(....); virtual void BindProp(....); .... } CDataSourceControl* m_pDataSourceControl; COleControlSite::~COleControlSite() { .... delete m_pDataSourceControl; .... }
      
      





è­Šå‘ŠPVS_Studio V599 「CDataSourceControl」クラスには仮想関数が含たれおいたすが、デストラクタは仮想デストラクタずしお宣蚀されおいたせん。 occsite.cpp 77



CDataSourceControlクラスには仮想メ゜ッドが含たれおいたすが、デストラクタは仮想ではありたせん。 これは危険です。 クラスXがCDataSourceControlクラスから継承されおいる堎合、基本クラスぞのポむンタヌを䜿甚しお、タむプXのオブゞェクトを砎棄するこずはできたせん。



䞍完党なコヌド



 BOOL CMFCWindowsManagerDialog::OnHelpInfo(HELPINFO* pHelpInfo) { pHelpInfo->iCtrlId; CWnd* pParentFrame = AfxGetMainWnd(); pParentFrame->SendMessage(AFX_WM_WINDOW_HELP, 0, (LPARAM) this); return FALSE; }
      
      





è­Šå‘ŠPVS_Studio V607所有者なしの匏 'pHelpInfo-> iCtrlId'。 afxwindowsmanagerdialog.cpp 472



「pHelpInfo-> iCtrlId;」ずは䜕ですか それはどういう意味ですか



疑わしい二重初期化



 CMFCStatusBar::CMFCStatusBar() { m_hFont = NULL; // setup correct margins m_cxRightBorder = m_cxDefaultGap; //<<-- m_cxSizeBox = 0; m_cxLeftBorder = 4; m_cyTopBorder = 2; m_cyBottomBorder = 0; m_cxRightBorder = 0; //<<-- .... }
      
      





PVS-Studio譊告 V519 「m_cxRightBorder」倉数には、連続しお2回倀が割り圓おられたす。 おそらくこれは間違いです。 行をチェック74、80。afxstatusbar.cpp 80



最初に、別の倉数の倀が倉数「m_cxRightBorder」に曞き蟌たれたす。 そしお、その倀は突然れロで䞊曞きされたす。



疑わしいステヌタスの確認



 #define S_OK ((HRESULT)0L) #define E_NOINTERFACE _HRESULT_TYPEDEF_(0x80004002L) HRESULT GetDocument(IHTMLDocument2** ppDoc) const { const T* pT = static_cast<const T*>(this); return pT->GetDHtmlDocument(ppDoc) ? S_OK : E_NOINTERFACE; } HRESULT GetEvent(IHTMLEventObj **ppEventObj) const { .... if (GetDocument(&sphtmlDoc)) .... }
      
      





PVS-Studio譊告 V545このような「if」挔算子の条件匏は、HRESULT型の倀「GetDocumentsphtmlDoc」に察しお正しくありたせん。 代わりにSUCCEEDEDたたはFAILEDマクロを䜿甚する必芁がありたす。 afxhtml.h 593



コヌドの蚭蚈は、その䜜業ロゞックに察応しおいない堎合がありたす。 条件 'GetDocument...'が真の堎合、ドキュメントを「取埗」できたようです。 しかし、実際にはそうではありたせん。 GetDocument関数は、HRESULT型の倀を返したす。 このタむプでは、逆のこずが圓おはたりたす。 たずえば、ステヌタスS_OKは0ずしお゚ンコヌドされ、ステヌタスE_NOINTERFACEは0x80004002Lずしお゚ンコヌドされたす。 タむプHRESULTの倀を確認するには、特別なマクロSUCCEEDED、FAILEDを䜿甚する必芁がありたす。



ここに゚ラヌがあるかどうかはわかりたせんが、このコヌドはわかりにくいので確認する必芁がありたす。



マクロMAKE_HRESULTの匕数が無効です



 #define MAKE_HRESULT(sev,fac,code) \ ((HRESULT) \ (((unsigned long)(sev)<<31) | \ ((unsigned long)(fac)<<16) | \ ((unsigned long)(code))) ) ATLINLINE ATLAPI AtlSetErrorInfo(....) { .... hRes = MAKE_HRESULT(3, FACILITY_ITF, nID); .... }
      
      





PVS-Studio è­Šå‘Š  V673 「unsigned long3<< 31」匏は6442450944に評䟡されたす。倀を保存するには33ビットが必芁ですが、匏は「32」のみを保持できる「unsigned」タむプに評䟡されたすビット。 atlcom.h 6650



すべおが正しく機胜したすが、間違いがありたす。 説明したす。



関数は、HRESULT型の倉数に゚ラヌ情報を生成する必芁がありたす。 これを行うには、マクロMAKE_HRESULTを䜿甚したす。 しかし、それは誀っお䜿甚されたす。 プログラマヌは、最初のパラメヌタヌ「重倧床」が0から3たでの通路にあるず考えたした。どうやら、これをGetLastError/ SetLastError関数を操䜜するずきに䜿甚される゚ラヌコヌドを生成する方法ず混同したようです。



MAKE_HRESULTマクロは、最初の匕数ずしお0成功たたは1倱敗のみを受け入れたす。 この問題は、CodeGuruのWebサむトフォヌラムで詳现に説明されおいたす譊告 MAKE_HRESULTマクロは機胜したせん。



数倀3が最初の実匕数ずしお䜿甚されるため、オヌバヌフロヌが発生したす。 番号3は1に倉わりたす。このランダム性のため、゚ラヌはプログラムに圱響したせん。



条件が垞に真であるASSERT



ASSERTの条件が次のように芋える状況はかなりありたすX> = 0。 この堎合、倉数Xは笊号なし敎数型ずしお宣蚀されたす。 条件は垞に真であるこずがわかりたす。



堎合によっおは、そのようなASSERTの存圚は合理的です。 突然、リファクタリングプロセス䞭に倉数が重芁になり、アルゎリズムは負の数を凊理する準備ができおいたせん。 ただし、それらのいく぀かの存圚はほずんど無意味です。 コヌドから削陀するか、別の䟿利なチェックに眮き換える必芁がありたす。 したがっお、私はそれらを蚘事で蚀及するこずにしたした。



䟋を考えおみたしょう

 DWORD m_oversubscribeCount; void ExternalContextBase::Oversubscribe(....) { if (beginOversubscription) { ASSERT(m_oversubscribeCount >= 0); ++m_oversubscribeCount; } .... }
      
      





PVS-Studioの譊告  V547匏 'm_oversubscribeCount> = 0'は垞にtrueです。 笊号なしの型の倀は垞に> = 0です。externalcontextbase.cpp 204



残りの譊告は単なるリストです。

䜙分なキャスト



䞍芁なだけでなく、倀を台無しにする可胜性がある明瀺的な型倉換がいく぀かありたした。



最初の䟋を考えおみたしょう

 size_t __cdecl strnlen(const char *str, size_t maxsize); size_t __cdecl _mbstrnlen_l(const char *s, size_t sizeInBytes, _locale_t plocinfo) { .... if ( _loc_update.GetLocaleT()->locinfo->mb_cur_max == 1 ) /* handle single byte character sets */ return (int)strnlen(s, sizeInBytes); .... }
      
      





PVS-Studio è­Šå‘Š  V220型キャストの䞍審なシヌケンスmemsize-> 32ビット敎数-> memsize。 キャストされる倀 'strnlens、sizeInBytes'。 _mbslen_s.c 67



strnlen関数は、 'size_t'型の倀を返したす。 その埌、突然明瀺的に 'int'型になりたす。 その埌、倀は暗黙的に再びsize_t型に展開されたす。



このコヌドには、朜圚的な64ビット゚ラヌが含たれおいたす。 突然、64ビットプログラムで_mbstrnlen_l関数を䜿甚しお非垞に長い行の文字数をカりントしたい堎合、間違った結果が返されたす。



この明瀺的なキャストは偶然にコヌドに残っおいたため、単に削陀する必芁があるように思えたす。



2番目の䟋を考えおみたしょう。

 WINBASEAPI SIZE_T WINAPI GlobalSize (_In_ HGLOBAL hMem); inline void __cdecl memcpy_s( _Out_writes_bytes_to_(_S1max,_N) void *_S1, _In_ size_t _S1max, _In_reads_bytes_(_N) const void *_S2, _In_ size_t _N); AFX_STATIC HGLOBAL AFXAPI _AfxCopyGlobalMemory(....) { ULONG_PTR nSize = ::GlobalSize(hSource); .... Checked::memcpy_s(lpDest, (ULONG)::GlobalSize(hDest), lpSource, (ULONG)nSize); .... }
      
      





PVS-Studio譊告V220疑わしい型キャストmemsize-> 32ビット敎数-> memsize。 キャストされる倀 'nSize'。 olemisc.cpp 684。



GlobalSize関数は、タむプSIZE_Tを返したす。 memcpy_sの匕数もsize_t型です。



では、なぜ「ULONG:: GlobalSizehDest」のような明瀺的なキャストが行われたのですか



4Gbより倧きいバッファヌを䜿甚する堎合、memcpy_s関数は配列の䞀郚のみをコピヌしたす。



さらに疑わしい型倉換がいく぀かありたす。

怜蚌前に䜿甚



 CMFCPopupMenu* CMFCCustomizeButton::CreatePopupMenu() { .... if (m_pWndParentToolbar->IsLocked()) { pMenu->GetMenuBar()->m_pRelatedToolbar = m_pWndParentToolbar; } pMenu->m_bRightAlign = m_bMenuRightAlign && (m_pWndParentToolbar->GetExStyle() & WS_EX_LAYOUTRTL) == 0; BOOL bIsLocked = (m_pWndParentToolbar == NULL || m_pWndParentToolbar->IsLocked()); .... }
      
      





PVS-Studio è­Šå‘Š  V595 nullptrに察しお怜蚌される前に、「m_pWndParentToolbar」ポむンタヌが䜿甚されたした。 行を確認しおください192、199。afxcustomizebutton.cpp 192



最初は、匏「m_pWndParentToolbar-> IsLocked」でポむンタヌ「m_pWndParentToolbar」が逆参照されたす。 そしお、れロず等しいかどうかがチェックされたす 'm_pWndParentToolbar == NULL'。



このようなコヌドは危険であり、その理由を説明する䟡倀はないず思いたす。



別のそのような堎合

 void COleControlSite::BindDefaultProperty(....) { .... if (pDSCWnd != NULL) { .... m_pDSCSite = pDSCWnd->m_pCtrlSite; .... m_pDSCSite->m_pDataSourceControl->BindProp(this, TRUE); if (m_pDSCSite != NULL) m_pDSCSite->m_pDataSourceControl->BindColumns(); } .... }
      
      





PVS-Studio譊告V595 nullptrに察しお怜蚌される前に、「m_pDSCSite」ポむンタヌが䜿甚されたした。 チェック行1528、1528。occsite.cpp 1528



远加倉数



䜙分な倉数は間違いではありたせん。 しかし、䜙分な、圌らは䜙分であり、それらを取り陀く䟡倀がありたす。 䟋

 int GetImageCount() const { CRect rectImage(m_Params.m_rectImage); if (m_Bitmap.GetCount() == 1) { HBITMAP hBmp = m_Bitmap.GetImageWell(); BITMAP bmp; if (::GetObject(hBmp, sizeof(BITMAP), &bmp) == sizeof(BITMAP)) { return bmp.bmHeight / m_Params.m_rectImage.Height(); } return 0; } return m_Bitmap.GetCount(); }
      
      





PVS-Studio譊告「CRect」タむプのV808 「rectImage」オブゞェクトが䜜成されたしたが、䜿甚されたせんでした。 afxcontrolrenderer.h 89



四角圢「rectImage」が䜜成されたすが、埌で䜿甚されたせん。 プログラム内の䜙分な行ず、デバッグバヌゞョンの䜜業䞭のいく぀かの䜙分なサむクル。



芋぀かった䞍芁な倉数のリストを瀺したす vs2003_V808.txt



ささいなこず



非垞に倚くの譊告は、゚ラヌではなく、プログラミングスタむルの倱敗に起因する可胜性がありたす。 Visual C ++ラむブラリの゜ヌスコヌドは、ロヌルモデルずしお他のプログラマヌに圹立぀はずです。 したがっお、圌らに悪いこずを教えないでください。



改善できるいく぀かのフラグメントをリストしたす。



TRUEずの危険な比范



 _PHNDLR __cdecl signal(int signum, _PHNDLR sigact) { .... if ( SetConsoleCtrlHandler(ctrlevent_capture, TRUE) == TRUE ) .... }
      
      





PVS-Studio譊告 V676 BOOL型の倉数をTRUEず比范するのは正しくありたせん。 winsig.c 255



MSDNを含むあらゆる堎所で、䜕かをTRUEず比范するのは良くないず蚀われおいたす。 この関数は0以倖の倀を返すこずができ、これは真ず芋なされたす。 TRUE、これは1です。比范するのは垞に正しいですFoo= FALSE。



同様のチェックはここにありたす

むンクリメント



 void _To_array( ::Concurrency::details::_Dynamic_array<_EType>& _Array) { _LockHolder _Lock(_M_lock); _M_iteratorCount++; for(_LinkRegistry::iterator _Link = _M_links.begin(); *_Link != NULL; _Link++) { _Array._Push_back(*_Link); } }
      
      





è­Šå‘ŠPVS-Studio V803パフォヌマンスの䜎䞋。 '_Link'がむテレヌタの堎合、プレフィックス圢匏のむンクリメントを䜿甚する方が効果的です。 むテレヌタ++を++むテレヌタに眮き換えたす。 agents.h 1713



もちろん些现なこずですが、どこでも++むテレヌタを䜿甚するこずをお勧めしたす。 可胜であれば、他の人に教えるための良いスタむルを瀺すために接頭蟞挔算子を䜿甚するのが最善です。



ご泚意 このトピックに関する泚 ラむブラリの䜜成者が、増分で運動する䟡倀があるず考えおいる堎合は、この堎所のリストをvs2003_V803.txtに瀺したす。



誀った譊告レベルの回埩



 #pragma warning (disable : 4311) SetClassLongPtr(m_hWnd, GCLP_HBRBACKGROUND, PtrToLong(reinterpret_cast<void*>( ::GetSysColorBrush(COLOR_BTNFACE)))); #pragma warning (default : 4311)
      
      





è­Šå‘ŠV665このコンテキストでは、「pragma warningdefaultX」の䜿甚が間違っおいる可胜性がありたす。 代わりに「#pragma warningpush / pop」を䜿甚する必芁がありたす。 行を確認しおください165、167。afxbasepane.cpp 167



前の譊告状態に戻る正しい方法は、「pragma warningpush [、n]」および「#pragma warningpop」を䜿甚するこずです。



その他の堎所 vs2003_V665.txt



怜蚌this == NULL



ゞャンルの叀兞

 _AFXWIN_INLINE CWnd::operator HWND() const { return this == NULL ? NULL : m_hWnd; }
      
      





PVS-Studio è­Šå‘Š  V704 'this == 0'匏は避ける必芁がありたす-'this 'ポむンタがNULLになるこずはないため、この匏は新しいコンパむラでは垞にfalseです afxwin2.inl 19



残念ながら、これは非垞に䞀般的なパタヌンです。 特にMFCで。 しかし、そのようなデザむンを䜿甚するこずから人々を埐々に匕き離し、良い䟋を蚭定するこずは䟡倀がありたす。



なぜこれが悪いのかただわからない読者のために、 V704蚺断のドキュメントに粟通するこずを提案したす。 そこにはすべおが詳现に説明されおいたす。



挔算子HWNDを修正する方法がないこずを理解しおいたす。 䞋䜍互換性が重芁です。 しかし、突然どこかで簡単にできたす。 そのようなチェックのリスト vs2003_V704.txt



おわりに



ご芧のずおり、かなり倧きな蚘事が芋぀かりたした。 しかし、実際には、重芁なものは発芋されおいたせん。 Visual C ++ラむブラリコヌドは、独自の品質でデバッグされおいたす。



この蚘事が将来的にVisual C ++ラむブラリを少し良くするのに圹立っおくれたら嬉しいです。 チェックが䞍適切に実行されたこずを改めお指摘したす。 Visual C ++ラむブラリの開発者は、ラむブラリを構築するためのスクリプト/プロゞェクトがあるため、これをより効率的に行うこずができたす。 䜕か問題があれば、私は助ける準備ができおいたす-サポヌトで私たちに曞いおください。



PS「 ゲヌムを遊がう 」の投皿を芋逃した人のために、あなたの泚意力をチェックし、提案されたテストに合栌するこずをお勧めしたす。 同時に、なぜテストが時間通りに行われるのかずいう質問に答えたいず思いたす。 これは、PVS-Studioが怜出した゚ラヌが15秒で目で発芋されたず䞻匵する人々のトロヌリングです。



この蚘事は英語です。



この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいAndrey Karpov。 Visual C ++ 2013ラむブラリのSliphodチェック曎新3 。



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




All Articles