å°ãã®èæ¯
ããã¯ãVisual C ++ã«å«ãŸããã©ã€ãã©ãªããã§ãã¯ããæåã®å®éšã§ã¯ãããŸããã ããã§ä»¥åã®ãã§ãã¯ã«ã€ããŠèªãããšãã§ããŸãïŒ
- Visual C ++ 2012ã©ã€ãã©ãªã§èŠã€ãã£ããšã©ãŒ
- åãåºãããã§ãã¯ãããVisual C ++ 2013ã©ã€ãã©ãªïŒæŽæ°3ïŒ
ãããã®åºçç©ã®åŸãé·ãäŒæ©ããããŸããããããŠãç§ã¯VS2015ã«é¢ããèšäºãæžããŸããã§ããã æ€èšŒãåŸ ã£ãŠããå€ãã®èå³æ·±ããããžã§ã¯ãããããŸããã æ£çŽãªãšãããç§ã¯ãã®ãããã¯ã«é¢ããèšäºãæžãã®ãå¿ããŠããŸããã 幞ããªããšã«ãVisual C ++éçºè ã®1äººïŒ @MalwareMinigun ïŒããã®ãã€ãŒãã¯ã VS2017ãæãåºãããŠãããŸããã
æšæºã®ã©ã€ãã©ãªããããŒã§ããªããèŠã€ãããã®ããã€ãå«ãã§ããã人ãããªãããšã«é©ããŠããŸãã
確ãã«ãç§ã¯Visual Studio 2017ã©ã€ãã©ãªã®ãã°ã«ã€ããŠäžçã«èªã£ãããšã¯ãããŸããã§ããïŒ ããŠãé»è©±ã¯åãå ¥ããããŸããïŒ
ã芧ã®ãšããããã€ãŒãïŒ3æ31æ¥ïŒãã1ãæãçµéããŠããŸãã åçãé ãããããšã¯èªããŸãããä»ã¯ä¿®æ£ããŸãã
確èªãããå 容ãšæ¹æ³
æ€èšŒã®ããã«ãå ¥æå¯èœãªææ°ããŒãžã§ã³ã®PVS-Studioã¢ãã©ã€ã¶ãŒïŒ6.15ïŒã䜿çšããŸããã
Visual Studio 2017ã®æè¿ãªãªãŒã¹ãããããŒãžã§ã³ã®äžéšã§ããC ++ã©ã€ãã©ãªã確èªããŸããã2017幎4æ12æ¥ãã³ã³ãã¥ãŒã¿ãŒäžã«ãã£ãã©ã€ãã©ãªã®ããŒãžã§ã³ã確èªããŸããã ãã ãããã®ããã¹ãã¯ãã°ã¬ããŒãã§ã¯ãªããéçåæã®äžè¬çãªæ¹æ³è«ãç¹ã«PVS-Studioã¢ãã©ã€ã¶ãŒãäžè¬çã«çŽ¹ä»ããèšäºã§ãããããããŒãžã§ã³ã¯ããã»ã©éèŠã§ã¯ãããŸããã
ç§ã¯é£ããã®ã§ãå®å šãªã©ã€ãã©ãªãã§ãã¯ãæ°ã«ããŸããã§ããã
ãŸãããã¹ãŠã®ã©ã€ãã©ãªãå¥ã®ãã©ã«ããŒã«ã³ããŒããå¿ èŠããããŸãããããããªããšããããã®ã©ã€ãã©ãªãŒã«é¢ããèŠåãååŸã§ããŸããã§ããã ã¢ãã©ã€ã¶ã¯ãã·ã¹ãã ã©ã€ãã©ãªã«ã¡ãã»ãŒãžãçºè¡ããŸããã ãã¡ã€ã«ãå¥ã®ãã©ã«ããŒã«ã³ããŒãããšãPVS-Studioãã ãŸããŠãå¿ èŠãªèŠåã衚瀺ãããŸãã
ã¡ãªã¿ã«ãäžèšã®ãã€ãŒãã«å¯Ÿããåçã¯ãã¡ãã§ãã ãã®ãããVisual C ++ãŠãŒã¶ãŒã¯ãã©ã€ãã©ãªã«é¢ããPVS-Studioã®èŠåã«ã€ããŠã¯æžããŸããã 圌ãã¯äººã ããããã ããªã®ã§ã圌ããé ãã®ã¯æå³ããããŸããã åæã«ãã€ã³ã©ã€ã³é¢æ°ã®æ¬äœãå®å šã«è§£æããã³åæããå¿ èŠããªããããåæã®é床ãå°ãåäžããŸãã
第äºã«ãç§ã¯æ£çŽã«ãããžã§ã¯ããéããããšããŸããã§ããã æ°ãããœãªã¥ãŒã·ã§ã³ãäœæããããã«ããã©ã€ãã©ãªãããã¡ã€ã«ãè¿œå ããŸããã ãã®çµæãããã€ãã®ãã¡ã€ã«ã確èªã§ããŸããã§ããã ããããèšäºãæžããšãã芳ç¹ããã¯ãããã¯å¿ é ã§ã¯ãããŸããã å šæã®è³æã§ãããããããªãååã§ããããšãå€æããŸããã Visual C ++éçºè èªèº«ã«ãã£ãŠããã培åºçã§æ£ãããã§ãã¯ãæ¢ã«è¡ãããŠããå¿ èŠããããŸãããããæ¯æŽããæºåãã§ããŠããŸãã
誀æ€ç¥
ä»åã¯ãæ®å¿µãªãããå ·äœçãªæ°å€ãšå²åã瀺ãããšã¯ã§ããŸããã
ç§ã¯ãããèšãããšãã§ããŸãïŒ
- ä¿¡é Œæ§ã®é«ãæ±çšã¢ã©ãŒãïŒGAïŒ433ãåãåããŸããã
- ä¿¡é Œæ§ãäžçšåºŠã®æ±çšã¢ã©ãŒãïŒGAïŒ743åãåãåããŸããã
ãã ãããããã®æ°å€ã¯ãããªãæ¹æ³ã§ã解éã§ããããããããçµè«ãåŒãåºãããšã¯ã§ããŸããïŒ
ãã¡ã€ã«ã®äžéšã®ã¿ããã§ãã¯ããå¥åŠãªæ¹æ³ã§ããã§ãã¯ããããšãæãåºãããŠãã ããã ããã«ãã©ã€ãã©ãªã«ã¯ç°åžžãªç¬éããããŸãã ã¢ãã©ã€ã¶ãŒã¯ãå®å šã«æ£ããã¡ãã»ãŒãžãå€æ°çæããŸããããããã¯åæã«å®å šã«åœã§ãã ãã®ãã©ããã¯ã¹ã®çç±ã説æããŸãã
ã·ã¹ãã ã®ããŒã¿åãç¬ç«ããŠå®£èšããããšã¯æ害ã§å±éºã§ãã æªãã¢ã€ãã¢ã®äŸïŒ
typedef unsigned long DWORD;
PVS-Studioã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®èŠåãçæããŸããæšæºã®ãDWORDãã¿ã€ãã®V677ã«ã¹ã¿ã 宣èšã ã·ã¹ãã ããããŒãã¡ã€ã«#include <WinDef.h>ã䜿çšããå¿ èŠããããŸãã
ã¢ãã©ã€ã¶ãŒã¯å®å šã«æ£ããã§ãã åããæåã§ã宣èšããã®ã§ã¯ãªãã察å¿ããããããŒãã¡ã€ã«ãå«ããå¿ èŠããããŸãã
ãç解ã®ãšããããã®ãããªèšºæã¯Visual C ++ã©ã€ãã©ãªã«ã¯é©çšãããŸããã çµå±ã®ãšããããã®ãããªåã宣èšãããã®ã¯ãŸãã«ããã§ãã ãããŠãã¢ãã©ã€ã¶ãŒã¯250以äžã®ãã®ãããªã¡ãã»ãŒãžãçºè¡ããŸããã
ãŸãã¯ããã1ã€ã®èå³æ·±ãäŸã§ãã PVS-Studioã¢ãã©ã€ã¶ãŒã¯ã thisãã€ã³ã¿ãŒãNULLã§ãããã©ããããã§ãã¯ããã³ãŒããæ¹å€ãããšãã絶察ã«æ£ããã§ãã ææ°ã®C ++èšèªæšæºã«ããã°ã thisãã€ã³ã¿ãŒãNULLã«ããããšã¯ã§ããŸããã
Visual C ++ã«ã¯ããã«é¢ãã倧ããªåé¡ããããŸãã ã©ãããããã®ç¹ã§ãããã¯æ±ºããŠæšæºãæºãããŠããªããããŸããªãçºçããŸãã å®éã«ã¯ãã©ã€ãã©ãªïŒããšãã°ãMFCïŒã¯ã¢ãŒããã¯ãã£çã«æ§ç¯ãããŠããããã ããã¯NULLã«çããããšãäžè¬çãªç¶æ³ã§ãã
ã©ã€ãã©ãªã³ãŒãã«ã¯ã thisãã€ã³ã¿ãŒããã§ãã¯ããå€æ°ã®é¢æ°ãå«ãŸããŠããŸãã ããã€ãã®æ©èœã次ã«ç€ºããŸãã
_AFXWIN_INLINE CDC::operator HDC() const { return this == NULL ? NULL : m_hDC; } _AFXWIN_INLINE HDC CDC::GetSafeHdc() const { return this == NULL ? NULL : m_hDC; }
PVS-Studioã¢ãã©ã€ã¶ãŒã¯ãåœç¶ãããã«å¯ŸããŠèŠåãçºè¡ããŸãã
- V704 'this == 0'åŒã¯é¿ããå¿ èŠããããŸã-'this'ãã€ã³ã¿ãŒãNULLã«ãªãããšã¯ãªãããããã®åŒã¯æ°ããã³ã³ãã€ã©ãŒã§ã¯åžžã«falseã§ãã afxwin1.inl 314
- V704 'this == 0'åŒã¯é¿ããå¿ èŠããããŸã-'this'ãã€ã³ã¿ãŒãNULLã«ãªãããšã¯ãªãããããã®åŒã¯æ°ããã³ã³ãã€ã©ãŒã§ã¯åžžã«falseã§ãã afxwin1.inl 316
ãã®ãããªã¡ãã»ãŒãžã¯40以äžãããŸããããã¡ããæå³ã¯ãããŸããã ä»åŸæ°å¹Žéã§ããããã¯èª€æ€ç¥ãšã¿ãªãããå¯èœæ§ããããŸãã
ã¡ãã»ãŒãžV677ããã³V704ã®äŸã§ãããããã«ããã¹ãŠã®èšºæãVisual C ++ã©ã€ãã©ãªã«é©çšã§ããããã§ã¯ãããŸããã ãã¡ãããåé¡ã¯ãããŸããããããã®èŠåããã®ä»ã®èŠåããªãã«ããã ãã§ãã¡ãã»ãŒãžã®æ°ãããã«300åæžããããšãã§ããŸãã
ã¢ãã©ã€ã¶ãŒãäºåã«æ§æããŠããªãå Žåã誀æ€ç¥ã®å²åãè°è«ããããšã¯ãã°ãã°ç¡æå³ã§ããããšãå床å®èšŒããããã«ããã®ãã¹ãŠãæžããŠããŸãã
äžè¬çã«ã¯ãä»åã¯èå³ããªãããIã³ç³ãäžããŸãã ç§ã®äž»èŠ³çãªæèŠã§ã¯ã誀æ€ç¥ã¯ã»ãšãã©ãããŸããã
ã¢ãã©ã€ã¶ãŒã¯èå³æ·±ããã®ãèŠã€ããŸãã
ç§ã¯ç¡å®³ããæãããããšã«è¡ãããšã«ããŸããã åãã«ããã€ããŒãªæ¹åã®ããã®æšå¥šäºé ãæ€èšããŸãã ããããç§ã¯å€§èäžæµãªéã¡ã«é²ã¿ãç§ã®æèŠã§ã¯ããã©ãŒããšåŒã¶ããšãã§ãããã®ã§ç©èªãçµããŸãã äžè¬çã«ã次第ã«åŠäœãäžããŠãããŸãã ãã°ããããã°ã©ã ã®äžçãæããªããïŒ
ãã¯ãæé©å
ã¢ãã©ã€ã¶ãŒã¯ãå€ãã®ãã€ã¯ãæé©åãæäŸããŸãã ã€ãŸãããã®ç« ã§èª¬æããããšã¯ãã¹ãŠãšã©ãŒã§ã¯ãããŸããããã³ãŒããå°ãæ¹åããããšãã§ããŸãã
èŠåV808ããå§ããŸããããããã¯ããªããžã§ã¯ãã¯äœæãããŠããã䜿çšãããŠããªãããšã瀺ããŠããŸãã äŸãšããŠ2ã€ã®é¢æ°ã䜿çšããŠããã®ç¶æ³ãèæ ®ããŠãã ããã
void CMFCToolBarComboBoxButton::AdjustRect() { .... if (m_pWndEdit != NULL) { CRect rectEdit = m_rect; const int iBorderOffset = 3; m_pWndEdit->SetWindowPos( NULL, m_rect.left + nHorzMargin + iBorderOffset, m_rect.top + iBorderOffset, m_rect.Width() - 2 * nHorzMargin - m_rectButton.Width() - iBorderOffset - 3, m_rectCombo.Height() - 2 * iBorderOffset, SWP_NOZORDER | SWP_NOACTIVATE); } .... }
PVS-StudioèŠåïŒãCRectãã¿ã€ãã®V808 ãrectEditããªããžã§ã¯ããäœæãããŸãããã䜿çšãããŸããã§ããã afxtoolbarcomboboxbutton.cpp 607
äœæããã³åæååŸã®rectEditãªããžã§ã¯ãã¯ã©ãã§ã䜿çšãããŸããã ããã¯åã«äžèŠã§ãããå®å šã«åé€ã§ããŸãã ã³ãŒãã¯å°ãçããªããŸãã
å¥ã®ã±ãŒã¹ïŒ
BOOL CALLBACK AFX_EXPORT CMFCToolBarFontComboBox::EnumFamPrinterCallBackEx(....) { .... CString strName = pelf->elfLogFont.lfFaceName; pCombo->AddFont((ENUMLOGFONT*)pelf, FontType, CString(pelf->elfScript)); return 1; }
ãCStringTãã¿ã€ãã®V808 ãstrNameããªããžã§ã¯ããäœæãããŸãããã䜿çšãããŸããã§ããã afxtoolbarfontcombobox.cpp 138
CStringåã®ãªããžã§ã¯ããäœæããã³åæåãããŸãããã©ãã§ã䜿çšãããŸããã ã³ã³ãã€ã©ããæååãäœæããŠã³ããŒããããã«äœåãªã³ãŒããæšãŠãããšãæšæž¬ãããã©ããã¯ããããŸããã CStirngã¯è€éãªã¯ã©ã¹ã§ããããã äžå¯èœãªå ŽåããããŸãã ãã ããããã¯éèŠã§ã¯ãããŸããããããã«ããŠãã strNameãªããžã§ã¯ããåé€ããŠãã³ãŒããç°¡åã«ããå¿ èŠããããŸãã
ãããŠããã®ãããªäœåãªãªããžã§ã¯ãããããããããŸãã ãã§ã«æ€èšãããŠãããã®ã«å ããŠãã¢ãã©ã€ã¶ãŒã¯ããã«50ã®ã¡ãã»ãŒãžãçºè¡ããŸããã èšäºã®ããã¹ããç ©éã«ããªãããã«ããããã®ã¡ãã»ãŒãžãå¥ã®ãã¡ã€ã«vs2017_V808.txtã«æžããŸãã ã
ä»åºŠã¯ãè¿œå ã®ãã§ãã¯ã®æéã§ãã
TaskStack::~TaskStack() { if (m_pStack) delete [] m_pStack; }
PVS-StudioèŠåïŒ V809ãã€ã³ã¿ãŒå€ãNULLã§ãªãããšã確èªããå¿ èŠã¯ãããŸããã ãifïŒm_pStackïŒããã§ãã¯ã¯åé€ã§ããŸãã taskcollection.cpp 29
deleteæŒç®åã¯ã nullptrãå ¥åãšããŠå®å šã«å®å šã§ãã ãããã£ãŠããã§ãã¯ã¯äžèŠã§ãããã³ãŒããç°¡çŽ åã§ããŸãã
TaskStack::~TaskStack() { delete [] m_pStack; }
ãã®ãããªè¿œå ã®ãã§ãã¯ããããããããŸãã vs2017_V809.txtãã¡ã€ã«ã«68ã®ã¡ãã»ãŒãžãæžã蟌ã¿ãŸãã ã
å€æŽã§ãã次ã®å°ããªããšã¯ãã€ãã¬ãŒã¿ã®æ¥å°ŸèŸã®å¢åãæ¥é èŸã®1ã«çœ®ãæããããšã§ãã äŸïŒ
size_type count(const key_type& _Keyval) const { size_type _Count = 0; const_iterator _It = _Find(_Keyval); for (;_It != end() && !this->_M_comparator(....); _It++) { _Count++; } return _Count; }
èŠåPVS-StudioïŒ V803ããã©ãŒãã³ã¹ã®äœäžã '_It'ãã€ãã¬ãŒã¿ã®å Žåããã¬ãã£ãã¯ã¹åœ¢åŒã®ã€ã³ã¯ãªã¡ã³ãã䜿çšããæ¹ãå¹æçã§ãã ã€ãã¬ãŒã¿++ã++ã€ãã¬ãŒã¿ã«çœ®ãæããŸãã internal_concurrent_hash.h 509
次ã®ããã«æžããšãå°ãè¯ããªããŸãã
for (;_It != end() && !this->_M_comparator(....); ++_It)
ãã®ãããªãªãã¡ã¯ã¿ãªã³ã°ã«å©ç¹ããããã©ããã®è³ªåã«ã€ããŠã¯ãèšäºã§æ¬¡ã®ããã«æ€èšããŸããã åçïŒãããŸããã倧ããªãã®ã§ã¯ãããŸããã
ã©ã€ãã©ãªã®äœæè ãä¿®æ£ãè¡ã䟡å€ããããšå€æããå Žåãããã«26åã®åæ§ã®èŠåïŒ vs2017_V803.txtããããŸãã
次ã®æé©åã _TïŒ ""ïŒå€ãå²ãåœãŠããããã str.EmptyïŒïŒé¢æ°ãåŒã³åºããŠæååãã¯ãªã¢ããããšããå§ãããŸãã ã¯ã©ã¹ã¯ãåç·ã«å²ãåœãŠãã¡ã¢ãªéãäºåã«ç¥ããŸããã ãããã£ãŠãæååã®é·ããç¡é§ã«æ°ãå§ããŸãã äžè¬çã«ãäžå¿ èŠãªã¢ã¯ã·ã§ã³ã
CString m_strRegSection; CFullScreenImpl::CFullScreenImpl(CFrameImpl* pFrameImpl) { m_pImpl = pFrameImpl; m_pwndFullScreenBar = NULL; m_bFullScreen = FALSE; m_bShowMenu = TRUE; m_bTabsArea = TRUE; m_uiFullScreenID = (UINT)-1; m_strRegSection = _T(""); }
èŠåPVS-StudioïŒ V815ããã©ãŒãã³ã¹ã®äœäžã åŒãm_strRegSection = L ""ãããm_strRegSection.EmptyïŒïŒãã«çœ®ãæããããšãæ€èšããŠãã ããã afxfullscreenimpl.cpp 52
ã©ã€ã³ã亀æããæ¹ãè¯ã
m_strRegSection = _T("");
ã«
m_strRegSection.Empty();
äºçŽ°ãªããšã§ãããå®ç§äž»çŸ©è ã§ããã°ããã®ãããªã³ãŒãã®æ¹åã«æºè¶³ããã§ãããã
ã泚æ å®éããã®ã³ãŒãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒå ã«ãããè¡ã¯ãã§ã«ç©ºãªã®ã§ããã®è¡ã¯å®å šã«åé€ã§ããŸãã
ãã®ãããã¯ã«é¢ããããã«27ã®èŠåïŒ vs2017_V815.txtã§ãã
ãããŠæåŸã«ãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
HRESULT GetPropertyInfo(....) { .... for(ul=0; ul<m_cPropSetDex; ul++) { .... for(ULONG ulProp=0; ....) { .... pDescBuffer += (wcslen(L"UNKNOWN") + 1); .... }
èŠåPVS-StudioïŒ V814ããã©ãŒãã³ã¹ã®äœäžã 'wcslen'é¢æ°ã¯ãã«ãŒãã®æ¬äœå ã§è€æ°ååŒã³åºãããŸããã atldb.h 2374
wcslené¢æ°ã¯ãã¹ããããã«ãŒãå ã«ãããããè€æ°ååŒã³åºãããããšã«æ³šæããŠãã ããã äºåã«èšç®ããæååL "UNKNOWN"ã®é·ããèŠããŠããããšã¯ãããè«ççã§ãã
å¥ã®ã¡ãã»ãŒãžïŒ V814ããã©ãŒãã³ã¹ã®äœäžã 'wcslen'é¢æ°ã¯ãã«ãŒãã®æ¬äœå ã§è€æ°ååŒã³åºãããŸããã atldb.h 2438
æšå¥šäºé ããã¹ãŠå®äºããŸããã ããã«èå³æ·±ããã®ã«ç§»ããŸãããã
äžå°å£åŸãšã©ãŒ
ã³ã³ãã€ã©ã®èŠåã¯ãããããŒãã¡ã€ã«ã§èª€ã£ãŠæå¶ãããŸãã ã¢ã©ãŒããäžæçã«ç¡å¹ã«ããééã£ãæ¹æ³ãæ€èšããŠãã ããã
#ifdef _MSC_VER #pragma warning(disable:4200) #endif typedef struct adpcmwaveformat_tag { WAVEFORMATEX wfx; WORD wSamplesPerBlock; WORD wNumCoef; #if defined( _MSC_VER ) ADPCMCOEFSET aCoef[]; #else ADPCMCOEFSET aCoef[1]; #endif } ADPCMWAVEFORMAT; typedef ADPCMWAVEFORMAT *PADPCMWAVEFORMAT; typedef ADPCMWAVEFORMAT NEAR *NPADPCMWAVEFORMAT; typedef ADPCMWAVEFORMAT FAR *LPADPCMWAVEFORMAT; #ifdef _MSC_VER #pragma warning(default:4200) #endif
PVS-StudioèŠåïŒ V665ãã®ã³ã³ããã¹ãã§ã¯ããïŒpragma warningïŒdefaultïŒXïŒãã®äœ¿çšãééã£ãŠããå¯èœæ§ããããŸãã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã ãã§ãã¯ã©ã€ã³ïŒ2610ã2628ãmmreg.h 2628
ãšã©ãŒèªäœãäœã§ããããèŠãã®ã¯ç°¡åã§ã¯ãªãããšãç解ããŠããã®ã§ãæ¬è³ªã匷調ããŸãã
#pragma warning(disable:4200) .... #pragma warning(default:4200)
ãŸããã³ã³ãã€ã©ã®èŠåããªãã«ãªããŸãã 次ã«ãã¢ã©ãŒãã¹ããŒã¿ã¹4200ãããã©ã«ãå€ã«èšå®ãããŸãã ããã¯ã§ããŸããã ãŠãŒã¶ãŒããã¡ã€ã«ã®1ã€ã«å¯ŸããŠ4200蚺æãå®å šã«ç¡å¹ã«ãããšããŸãã æ®å¿µãªããã圌ã¯ãã¡ã€ã«ã«æžããïŒ
#include <mmreg.h>
ãã®çµæãèŠåãåã³ãªã³ã«ãªãããŠãŒã¶ãŒã³ãŒãã«å¯ŸããŠçºè¡ãããŸãã
æ£ãã解決çã¯ãç¶æ ãä¿åããŠããåã®ç¶æ ãè¿ãããšã§ãã
#pragma warning(push) #pragma warning(disable:4200) .... #pragma warning(pop)
ããããŒãã¡ã€ã«ã§ãã©ã°ãèŠåã誀ã£ãŠäœ¿çšãããå Žæã次ã«ç€ºããŸãã
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªããŠãã ããïŒ586ã601ãworkstealingqueue.h 601
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã ãã§ãã¯è¡ïŒ1669ã1697ãusbioctl.h 1697
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã ãã§ãã¯è¡ïŒ1631ã1646ãusbioctl.h 1646
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªããŠãã ããïŒ1490ã1518ãusbioctl.h 1518
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã ãã§ãã¯è¡ïŒ986ã1002ãusbioctl.h 1002
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªããŠãã ããïŒ960ã978ãusbioctl.h 978
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªããŠãã ããïŒ913ã925ãusbioctl.h 925
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªïŒ861ã876ãusbioctl.h 876
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªããŠãã ããïŒ860ã875ãusbioctl.h 875
* .cppãã¡ã€ã«ã«ããã®ãããªãšã©ãŒããããŸãããVisual C ++ãŠãŒã¶ãŒã³ãŒãã«å±éºãåãŒããªããããæžããŸããã§ããã ãã¡ãããããããä¿®æ£ããããšã圹ç«ã¡ãŸãã
次ã«ã æ°ããæŒç®åã«ã€ããŠèª¬æããŸãã
inline HRESULT CreatePhraseFromWordArray(....) { .... SPPHRASEELEMENT *pPhraseElement = new SPPHRASEELEMENT[cWords]; if(pPhraseElement == NULL) { ::CoTaskMemFree(pStringPtrArray); return E_OUTOFMEMORY; } memset(pPhraseElement, 0, sizeof(SPPHRASEELEMENT) * cWords); .... }
PVS-StudioèŠåïŒ V668ã¡ã¢ãªã¯ãnewãæŒç®åã䜿çšããŠå²ãåœãŠãããããããpPhraseElementããã€ã³ã¿ãŒãnullã«å¯ŸããŠãã¹ãããæå³ã¯ãããŸããã ã¡ã¢ãªå²ãåœãŠãšã©ãŒã®å ŽåãäŸå€ãçæãããŸãã sphelper.h 2973
æ£åŒã«ã¯ããã®ã³ãŒãã¯æ£ãããããŸããã ã¡ã¢ãªå²ãåœãŠãšã©ãŒãçºçããå Žåã newãªãã¬ãŒã¿ãŒã¯äŸå€ãã¹ããŒããå¿ èŠããããŸãã ãã®çµæã ifã¹ããŒãã¡ã³ãã®æ¬äœã®å éšã«ã¯å ¥ããã CoTaskMemFreeé¢æ°ã¯åŒã³åºãããŸããã ãããŠãäžè¬çã«ãããã°ã©ã ã¯ããã°ã©ããŒã®æåŸ ã©ããã«åäœãå§ããŸããã
ãããæ¬åœã®ééããã©ããã¯ããããŸããã ãããžã§ã¯ãã¯nothrownew.objã«ãªã³ã¯ãããŠããå¯èœæ§ããããŸãã ãã®å Žåã newæŒç®åã¯äŸå€ãã¹ããŒããŸããã ãã®ãããªæ©äŒã¯ãããšãã°ããã©ã€ããŒéçºè ã«ãã£ãŠäœ¿çšãããŸãã è©³çŽ°ïŒ newããã³deleteæŒç®å ã ãããã£ãŠããããã誀æ€ç¥ã§ããå ŽåãèŠåV668ããªãã«ããããšãã§ããŸãã
ããããå¥ã®ã·ããªãªãå¯èœã§ãã ãã®ã³ãŒãã¯ããšã©ãŒãçºçãããšãã«newæŒç®åãNULLå€ãè¿ããå€ä»£ããæ®ã£ãŠããŸãã ãã®åŸãã¢ãã©ã€ã¶ãŒã¯112åã®ãã®ãããªèŠåãçºè¡ããããããã¹ãŠãæªãã§ãïŒ vs2017_V668.txt ã
ç¶ããŸãããã ã¢ãã©ã€ã¶ãŒã¯V730ã«å€ãã®èŠåãåºããŸããããã¯ããã¹ãŠã®ã¡ã³ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒã§åæåãããããã§ã¯ãªãããšã瀺ããŠããŸãã èŠåã®æ¬è³ªã2ã€ã®äŸã§èª¬æããŸãã
ãŸããCMFCScanlinerã¯ã©ã¹ãæ€èšããŸãã 次ã®ã¡ã³ããŒã宣èšãããŠããŸãïŒ
class CMFCScanliner { .... private: LPBYTE m_line; LPBYTE m_line_begin; LPBYTE m_line_end; size_t m_pitch; DWORD m_start_row; DWORD m_start_col; DWORD m_rows; DWORD m_cols; long m_offset; BYTE m_channels; size_t m_height; };
ã³ã³ã¹ãã©ã¯ã¿ãŒãèŠãŠã¿ãŸãããïŒ
CMFCScanliner() { empty(); }
å®éãã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯æ³šæããå¿ èŠã¯ãããŸããã 次ã«ã 空ã®é¢æ°ã調ã¹ãŸãã
void empty() { m_line = NULL; m_pitch = 0; m_start_row = 0; m_start_col = 0; m_rows = 0; m_cols = 0; m_offset = 0; m_height = 0; m_line_begin = NULL; m_line_end = NULL; }
PVS-StudioèŠåïŒ V730ã¯ã©ã¹ã®ãã¹ãŠã®ã¡ã³ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒå ã§åæåããããšã¯éããŸããã æ€æ»ãæ€èšããŠãã ããïŒm_channelsã afxtoolbarimages.cpp 510
m_channelsãé€ããã¹ãŠã®ã¡ã³ããŒãåæåããŸãã ã åæããŸããããã¯å¥åŠãªããšã§ãããªããªãããã®ã¡ã³ããŒã¯ä»ã®ã¡ã³ããŒããéç«ã£ãŠããªãããã§ãã ããã¯ééãã«éåžžã«äŒŒãŠããŸãããåé¡ã®ã¯ã©ã¹ã®ååã«ç²ŸéããŠããªããããæåŸãŸã§ç¢ºä¿¡ãæãŠãŸããã
次ã«ãæ§é AFX_EVENTãæ€èšããŸãã
struct AFX_EVENT { enum { event, propRequest, propChanged, propDSCNotify }; AFX_EVENT(int eventKind); AFX_EVENT(int eventKind, DISPID dispid, ....); int m_eventKind; DISPID m_dispid; DISPPARAMS* m_pDispParams; EXCEPINFO* m_pExcepInfo; UINT* m_puArgError; BOOL m_bPropChanged; HRESULT m_hResult; DSCSTATE m_nDSCState; DSCREASON m_nDSCReason; }; AFX_INLINE AFX_EVENT::AFX_EVENT(int eventKind) { m_eventKind = eventKind; m_dispid = DISPID_UNKNOWN; m_pDispParams = NULL; m_pExcepInfo = NULL; m_puArgError = NULL; m_hResult = NOERROR; m_nDSCState = dscNoState; m_nDSCReason = dscNoReason; }
PVS-StudioèŠåïŒ V730ã¯ã©ã¹ã®ãã¹ãŠã®ã¡ã³ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒå ã§åæåãããããã§ã¯ãããŸããã æ€æ»ãæ€èšããŠãã ããïŒm_bPropChangedã afxpriv2.h 104
ä»åã¯ãå€æ°m_bPropChangedã¯åæåãããŠããŸããã
ã©ã¡ãã®å Žåãããããã®å€æ°ãåæåããå¿ èŠããããã©ãããå€æããããšã¯æ³å®ããŠããŸããã ãã®ãããPVS-Studioã¢ãã©ã€ã¶ãŒã泚æãåŒããããã®ã±ãŒã¹ããã®ä»ã®çãããã±ãŒã¹ãç 究ããããšãéçºè ã«å§ããŸãã vs2017_V730.txtãã¡ã€ã«ã«å¥ã®183ã¢ãã©ã€ã¶ãŒèŠåãæžããŸããã 確ãã«ãããã®ã¡ãã»ãŒãžã®äžã«ã¯ãçã«é倧ãªãšã©ãŒã瀺ããã®ãããã€ããããŸãã ã¡ã³ããŒã確å®ã«åæåããå¿ èŠããããšç¢ºä¿¡ããå Žåããããã®èŠåã¯ãã¹ãŠãã®èšäºã®æ¬¡ã®ç« ã«åž°ããããšã«ããŸãã åæåãããŠããªãå€æ°ã¯ããšã©ãŒããŸãã«äžèŠåã«çºçããå¯èœæ§ããããããéåžžã«æœè¡çã§ãã
次ã®ã¢ãã©ã€ã¶ãŒèŠåã¯ãç¡æå³ãªãã§ãã¯çšã§ãã ãã®ãããªãã§ãã¯ã¯åé€ããããä»ã®ãã§ãã¯ã«çœ®ãæããå¿ èŠããããŸãã
HRESULT SetDpiCompensatedEffectInput(....) { .... hr = deviceContext->CreateEffect(CLSID_D2D1DpiCompensation, &dpiCompensationEffect); if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) { .... }
PVS-StudioèŠåïŒ V571ç¹°ãè¿ããã§ãã¯ã 'ifïŒïŒïŒHRESULTïŒïŒhrïŒïŒ> = 0ïŒ'æ¡ä»¶ã¯ã881è¡ç®ã§æ¢ã«æ€èšŒãããŠããŸããd2d1_1helper.h 883
å€æ°hrã®å€ã¯ãé£ç¶ããŠ2åãã§ãã¯ãããŸãã äœåãªã³ãŒããæ±ã£ãŠããããäœããã®ã¿ã€ããã¹ã§ããã2çªç®ã®æ¡ä»¶ãå€æŽããå¿ èŠããããŸãã
void Append(_In_reads_(nLength) PCXSTR pszSrc, _In_ int nLength) { // See comment in SetString() about why we do this UINT_PTR nOffset = pszSrc-GetString(); UINT nOldLength = GetLength(); if (nOldLength < 0) { // protects from underflow nOldLength = 0; } .... }
PVS-Studio èŠå ïŒ V547åŒ 'nOldLength <0'ã¯åžžã«falseã§ãã 笊å·ãªãã®åã®å€ã<0ã«ãªãããšã¯ãããŸããatlsimpstr.h 392
å€æ°nOldLengthã¯ç¬Šå·ãªãã®åUINTã§ããããŒãããå°ããããããšã¯ã§ããŸããã
次ã«ã FreeLibraryé¢æ°ã«ã€ããŠèª¬æããŸã ã
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) { .... ::FreeLibrary(pState->m_appLangDLL); .... }
PVS-StudioèŠåïŒ V718 ãDllMainãé¢æ°ãããFreeLibraryãé¢æ°ãåŒã³åºããªãã§ãã ããã dllinit.cpp 639
FreeLibraryé¢æ°ã«ã€ããŠMSDNãèšã£ãŠããããšã¯æ¬¡ã®ãšããã§ããDllMainããFreeLibraryãåŒã³åºãã®ã¯å®å šã§ã¯ãããŸããã 詳现ã«ã€ããŠã¯ã DllMainã® ã解説ãã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
éã®ãããã§ãã³ãŒãã¯æ©èœããŸãã ãã ããã³ãŒãã¯ãŸã æªãã®ã§æ³šæãå¿ èŠã§ãã
ãã®ç« ã®çµããã«ããã®ãã³ãã¬ãŒãé¢æ°ã«æ³šæãæããããšæããŸãã
template<class _FwdIt> string_type transform_primary(_FwdIt _First, _FwdIt _Last) const { // apply locale-specific case-insensitive transformation string_type _Res; if (_First != _Last) { // non-empty string, transform it vector<_Elem> _Temp(_First, _Last); _Getctype()->tolower(&*_Temp.begin(), &*_Temp.begin() + _Temp.size()); _Res = _Getcoll()->transform(&*_Temp.begin(), &*_Temp.begin() + _Temp.size()); } return (_Res); }
PVS-StudioèŠåïŒ V530é¢æ°ãtolowerãã®æ»ãå€ã䜿çšããå¿ èŠããããŸãã æ£èŠè¡šçŸ319
ãã®ã³ãŒããèŠãã®ã¯ãããåããŠã§ãããã²ãŒãããã®ãé£ããã§ãã ãããã£ãŠã toloweré¢æ°åŒã³åºããæããšãã«ã¢ãã©ã€ã¶ãŒãæ£ãããã©ããã¯ããããŸããã éåžžã toloweré¢æ°ã®çµæã䜿çšããå¿ èŠããããŸãããã©ã®ç¹å®ã®toloweré¢æ°ãããã§åŒã³åºãããã®ãããããŸããã ãããã£ãŠãç§ã¯åã«ãã®ã³ãŒãã«ã©ã€ãã©ãªéçºè ã®æ³šæãåŒãã確èªããããã«ãé¡ãããŸãã
ããŒãã³ã¢
ããã§ãç§ã®æèŠã§ã¯ãæãèå³æ·±ãéšåãå§ãŸããŸãã
_AFXCMN_INLINE int CToolBarCtrl::GetString( _In_ int nString, _Out_writes_to_(cchMaxLen, return + 1) LPTSTR lpstrString, _In_ size_t cchMaxLen) const { ASSERT(::IsWindow(m_hWnd)); return (int) ::SendMessage(m_hWnd, ...., (LPARAM)lpstrString); lpstrString[cchMaxLen]=_T('\0'); }
PVS-StudioèŠåïŒ V779å°éäžèœã³ãŒããæ€åºãããŸããã ãšã©ãŒãååšããå¯èœæ§ããããŸãã afxcmn2.inl 111
æ瀺çãªãšã©ãŒïŒé¢æ°ã®æåŸã®è¡ã¯å®è¡ãããŸããã
次ã®ã³ãŒããã©ã°ã¡ã³ãã«ã¯ãã«ãŒãæ¬äœå ã®returnã¹ããŒãã¡ã³ããžã®éåžžã«çãããåŒã³åºããå«ãŸããŠããŸãã
HRESULT GetIndexOfPropertyInSet( _In_ const GUID* pPropSet, _In_ DBPROPID dwPropertyId, _Out_ ULONG* piCurPropId, _Out_ ULONG* piCurSet) { HRESULT hr = GetIndexofPropSet(pPropSet, piCurSet); if (hr == S_FALSE) return hr; UPROPINFO* pUPropInfo = m_pUPropSet[*piCurSet].pUPropInfo; for(ULONG ul=0; ul<m_pUPropSet[*piCurSet].cUPropInfo; ul++) { if( dwPropertyId == pUPropInfo[ul].dwPropId ) *piCurPropId = ul; return S_OK; } return S_FALSE; }
PVS-StudioèŠåïŒ V612ã«ãŒãå ã®ç¡æ¡ä»¶ã®ãæ»ããã atldb.h 4837
ã«ãŒããäœæããå¿ èŠãããçç±ã¯æããã§ã¯ãããŸãããããã¹ãŠåãå Žåããã®ã«ãŒãã§ã¯è€æ°åã®å埩ãå®è¡ã§ããŸããã ã³ãŒããç°¡çŽ åã§ããŸãã ããããããã§ã¯ã³ãŒããåçŽåããã®ã§ã¯ãªãããšã©ãŒãä¿®æ£ããå¿ èŠãããããã«æããŸãã ããã§äžæ¬åŒ§ãå¿ããããŠããã®ã§ã¯ãªãããšçã£ãŠããŸããå®éãé¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
HRESULT GetIndexOfPropertyInSet( _In_ const GUID* pPropSet, _In_ DBPROPID dwPropertyId, _Out_ ULONG* piCurPropId, _Out_ ULONG* piCurSet) { HRESULT hr = GetIndexofPropSet(pPropSet, piCurSet); if (hr == S_FALSE) return hr; UPROPINFO* pUPropInfo = m_pUPropSet[*piCurSet].pUPropInfo; for(ULONG ul=0; ul<m_pUPropSet[*piCurSet].cUPropInfo; ul++) { if( dwPropertyId == pUPropInfo[ul].dwPropId ) { *piCurPropId = ul; return S_OK; } } return S_FALSE; }
æ€èšäžã®ã«ãŒãã«å ããŠãåžžã«ãµã€ã¯ã«ãäžæããããã€ãã®breakã¹ããŒãã¡ã³ãã«æ³šæãã䟡å€ããããŸãã
- V612ã«ãŒãå ã®ç¡æ¡ä»¶ã®ããã¬ãŒã¯ãã viewprev.cpp 476
- V612ã«ãŒãå ã®ç¡æ¡ä»¶ã®ããã¬ãŒã¯ãã iomanip 489
次ã«ãã³ããŒããŒã¹ãã«ã€ããŠèª¬æããŸãã 倧èŠæš¡ãªãããžã§ã¯ããäœæããããããã¹ããããã¯ã®ã³ããŒãç·šéã«é¢é£ããééããç¯ãããããããšã¯ã§ããŸããã
ãšããã§ãåé ã§ããã®èšäºãããã«èªãããšãªããèªåã§ãšã©ãŒãèŠã€ããããšããããšãææ¡ããŸãã
void CPaneContainerManager::RemoveAllPanesAndPaneDividers() { ASSERT_VALID(this); POSITION pos = NULL; for (pos = m_lstControlBars.GetHeadPosition(); pos != NULL;) { POSITION posSave = pos; CBasePane* pWnd = DYNAMIC_DOWNCAST( CBasePane, m_lstControlBars.GetNext(pos)); ASSERT_VALID(pWnd); if (pWnd->IsPaneVisible()) { m_lstControlBars.RemoveAt(posSave); } } for (pos = m_lstSliders.GetHeadPosition(); pos != NULL;) { POSITION posSave = pos; CBasePane* pWnd = DYNAMIC_DOWNCAST( CBasePane, m_lstControlBars.GetNext(pos)); ASSERT_VALID(pWnd); if (pWnd->IsPaneVisible()) { m_lstSliders.RemoveAt(posSave); } } }
äœãééã£ãŠããã®ãèŠãŠãã ããã
å€ãã®äººã¯ãããããŠããã®èšäºãããã«èªãããšã«ãããšæããŸãã ããã¯ãéçã¢ãã©ã€ã¶ãŒãéèŠã§å¿ èŠãªçç±ã®è¯ãäŸã§ãããããã¯æ notã§ã¯ãªããç²ããŸããã
PVS-StudioèŠåïŒ V778åæ§ã®2ã€ã®ã³ãŒããã©ã°ã¡ã³ããèŠã€ãããŸããã ãããããããã¯ã¿ã€ããã¹ã§ããããm_lstControlBarsãã®ä»£ããã«ãm_lstSlidersãå€æ°ã䜿çšããå¿ èŠããããŸãã afxpanecontainermanager.cpp 1645
ãã ããã¢ãã©ã€ã¶ãŒã®èŠåãèªãã åŸã§ããã³ãŒãå ã®ãšã©ãŒãèŠã€ããã®ã¯ç°¡åã§ã¯ãããŸããã ãããã£ãŠãç§ã¯ãããæžãããéèŠãªãã®ãæ®ããŸãïŒ
for (... m_lstControlBars ...) { CBasePane* pWnd = ... m_lstControlBars ... m_lstControlBars.RemoveAt(); } for (... m_lstSliders ...) { CBasePane* pWnd = ... m_lstControlBars ... m_lstSliders.RemoveAt(); }
æåã®ã«ãŒãã§ã¯m_lstControlBarsã³ã³ãããŒãåŠçããã2çªç®ã®ã«ãŒãã§ã¯m_lstSlidersã³ã³ãããŒãåŠçãããŸãã
99ïŒ ã®ç¢ºçã§ã2çªç®ã®ãµã€ã¯ã«ã¯Copy-Pasteãã¯ãããžãŒã䜿çšããŠèšè¿°ãããŸãããæåã®ãµã€ã¯ã«ãååŸãã³ããŒããã m_lstControlBarsãšããååãm_lstSlidersã«çœ®ãæããããŸãã ã ããããããå Žæã§ã¯ååã眮ãæããã®ãå¿ããŠããŸããïŒ
ãšã©ãŒã¯æ¬¡ã®ãšããã§ããCBasePane* pWnd = ... m_lstControlBars ...
ããã¯è¯ãééãã§ãããã次ã¯çŸããã§åœŒå¥³ã«å£ã£ãŠããŸããã CMFCScanlinerã¯ã©ã¹ã§ã®ã€ã³ã¯ãªã¡ã³ã/ãã¯ãªã¡ã³ãæŒç®åã®å®è£ æ¹æ³ãæ€èšããŠãã ããã
class CMFCScanliner { .... inline const CMFCScanliner& operator ++ () { m_line += m_offset; return *this; } inline const CMFCScanliner& operator ++ (int) { m_line += m_offset; return *this; } inline const CMFCScanliner& operator -- () { m_line -= m_offset; return *this; } inline const CMFCScanliner& operator -- (int) { m_line += m_offset; return *this; } .... };
PVS-StudioèŠåïŒ V524 ã-ãé¢æ°ã®æ¬äœãã++ãé¢æ°ã®æ¬äœãšå®å šã«åçã§ããããšã¯å¥åŠã§ãã afxtoolbarimages.cpp 656
ææ°ã®ã¹ããŒãã¡ã³ãã®å®è£ ã«æ³šæããŠãã ããã + =ãã-=ãžã®å€æŽãå¿ããŸããã ããã¯å€å žçã§ãïŒ ãããå®éã®ã æåŸã®è¡å¹æ ãã§ãïŒ
ãªãŒã¯ãçºçããå¯èœæ§ã®ããå Žæã¯3ã€ãããŸããã ãããã®1ã€ã次ã«ç€ºããŸãã
CSpinButtonCtrl* CMFCPropertyGridProperty::CreateSpinControl( CRect rectSpin) { ASSERT_VALID(this); ASSERT_VALID(m_pWndList); CSpinButtonCtrl* pWndSpin = new CMFCSpinButtonCtrl; if (!pWndSpin->Create(WS_CHILD | WS_VISIBLE | UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_NOTHOUSANDS, rectSpin, m_pWndList, AFX_PROPLIST_ID_INPLACE)) { return NULL; } .... }
PVS-StudioèŠåïŒ V773 ãpWndSpinããã€ã³ã¿ãŒã解æŸããã«é¢æ°ãçµäºããŸããã ã¡ã¢ãªãªãŒã¯ãçºçããå¯èœæ§ããããŸãã afxpropertygridctrl.cpp 1490
Createé¢æ°ããšã©ãŒã§å®è¡ãããå Žåã pWndSpinå€æ°ã«ãã€ã³ã¿ãŒãä¿åãããŠãããªããžã§ã¯ãã¯åé€ãããŸããã
åæ§ã«ïŒ
- V773ãpListããã€ã³ã¿ãŒã解æŸããã«é¢æ°ãçµäºããŸããã ã¡ã¢ãªãªãŒã¯ãçºçããå¯èœæ§ããããŸãã afxribboncombobox.cpp 461
- V773ãpButtonããã€ã³ã¿ãŒã解æŸããã«é¢æ°ãçµäºããŸããã ã¡ã¢ãªãªãŒã¯ãçºçããå¯èœæ§ããããŸãã afxvslistbox.cpp 222
C ++èšèªæšæºã«ããã°ãvoid *åã®ãã€ã³ã¿ãŒã§åé€æŒç®åãåŒã³åºããšãæªå®çŸ©ã®åäœãçºçããŸãããããŠãèªè ããã§ã«æšæž¬ããããã«ãããã¯Visual C ++ã©ã€ãã©ãªã§èµ·ãããŸãã
typedef void *PVOID; typedef PVOID PSECURITY_DESCRIPTOR; class CSecurityDescriptor { .... PSECURITY_DESCRIPTOR m_pSD; .... }; inline CSecurityDescriptor::~CSecurityDescriptor() { delete m_pSD; // <= m_pSD void * free(m_pOwner); free(m_pGroup); free(m_pDACL); free(m_pSACL); }
PVS-StudioèŠåïŒV772ã¯ãç¡å¹ãªãã€ã³ã¿ãŒã«å¯ŸããŠãåé€ãæŒç®åãåŒã³åºããšãæªå®çŸ©ã®åäœãåŒãèµ·ãããŸããatlcom.h 1039
åæ§ã®åé¡ã¯ããã«ãããŸãïŒ
- V772 voidãã€ã³ã¿ãŒã«å¯ŸããŠãåé€ãæŒç®åãåŒã³åºããšãæªå®çŸ©ã®åäœãçºçããŸããatlcom.h 1048
- V772 voidãã€ã³ã¿ãŒã«å¯ŸããŠãåé€ãæŒç®åãåŒã³åºããšãæªå®çŸ©ã®åäœãçºçããŸããatlcom.h 1070
- V772 voidãã€ã³ã¿ãŒã«å¯ŸããŠãåé€ãæŒç®åãåŒã³åºããšãæªå®çŸ©ã®åäœãçºçããŸããatlcom.h 1667
- V772 Calling a 'delete' operator for a void pointer will cause undefined behavior. afxstate.cpp 265
- V772 Calling a 'delete' operator for a void pointer will cause undefined behavior. dbcore.cpp 1240
- V772 Calling a 'delete' operator for a void pointer will cause undefined behavior. dbcore.cpp 1250
- V772 Calling a 'delete' operator for a void pointer will cause undefined behavior. doccore.cpp 1654
- V772 Calling a 'delete' operator for a void pointer will cause undefined behavior. dockstat.cpp 343
- V772 Calling a 'delete' operator for a void pointer will cause undefined behavior. filefind.cpp 43
- V772 Calling a 'delete' operator for a void pointer will cause undefined behavior. filefind.cpp 49
- V772 voidãã€ã³ã¿ãŒã«å¯ŸããŠãåé€ãæŒç®åãåŒã³åºããšãæªå®çŸ©ã®åäœãçºçããŸããsockcore.cpp 541
- V772 voidãã€ã³ã¿ãŒã«å¯ŸããŠãåé€ãæŒç®åãåŒã³åºããšãæªå®çŸ©ã®åäœãçºçããŸããwinfrm.cpp 145
- V772 voidãã€ã³ã¿ãŒã«å¯ŸããŠãåé€ãæŒç®åãåŒã³åºããšãæªå®çŸ©ã®åäœãçºçããŸããwinfrm.cpp 465
- V772 voidãã€ã³ã¿ãŒã«å¯ŸããŠãåé€ãæŒç®åãåŒã³åºããšãæªå®çŸ©ã®åäœãçºçããŸããmapiunicodehelp.h 168
æ©èœCMFCReBar :: CalcFixedLayoutã¯ããã©ã¡ãŒã¿ã®åãbStretchããããã䜿çšããŠããŸãããããããæåã®äœ¿çšã®åã«ãbStretchã¯æ瀺çã«1ãèšè¿°ããŸãã
CSize CMFCReBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz) { ASSERT_VALID(this); ENSURE(::IsWindow(m_hWnd)); // the union of the band rectangles is the total bounding rect int nCount = (int) DefWindowProc(RB_GETBANDCOUNT, 0, 0); REBARBANDINFO rbBand; rbBand.cbSize = m_nReBarBandInfoSize; int nTemp; // sync up hidden state of the bands for (nTemp = nCount; nTemp--; ) { rbBand.fMask = RBBIM_CHILD|RBBIM_STYLE; VERIFY(DefWindowProc(RB_GETBANDINFO, nTemp, (LPARAM)&rbBand)); CPane* pBar = DYNAMIC_DOWNCAST( CPane, CWnd::FromHandlePermanent(rbBand.hwndChild)); BOOL bWindowVisible; if (pBar != NULL) bWindowVisible = pBar->IsVisible(); else bWindowVisible = (::GetWindowLong( rbBand.hwndChild, GWL_STYLE) & WS_VISIBLE) != 0; BOOL bBandVisible = (rbBand.fStyle & RBBS_HIDDEN) == 0; if (bWindowVisible != bBandVisible) VERIFY(DefWindowProc(RB_SHOWBAND, nTemp, bWindowVisible)); } // determine bounding rect of all visible bands CRect rectBound; rectBound.SetRectEmpty(); for (nTemp = nCount; nTemp--; ) { rbBand.fMask = RBBIM_STYLE; VERIFY(DefWindowProc(RB_GETBANDINFO, nTemp, (LPARAM)&rbBand)); if ((rbBand.fStyle & RBBS_HIDDEN) == 0) { CRect rect; VERIFY(DefWindowProc(RB_GETRECT, nTemp, (LPARAM)&rect)); rectBound |= rect; } } // add borders as part of bounding rect if (!rectBound.IsRectEmpty()) { CRect rect; rect.SetRectEmpty(); CalcInsideRect(rect, bHorz); rectBound.right -= rect.Width(); rectBound.bottom -= rect.Height(); } bStretch = 1; return CSize((bHorz && bStretch) ? 32767 : rectBound.Width(), (!bHorz && bStretch) ? 32767 : rectBound.Height()); }
PVS-StudioèŠåïŒV763ãã©ã¡ãŒã¿ãŒ 'bStretch'ã¯ã䜿çšãããåã«åžžã«é¢æ°æ¬äœã§æžãæããããŸãã afxrebar.cpp 209
ãbStretch = 1;ããšããè¡ã¯ã誰ãããããã°çšã«äœæããŠãåé€ããã®ãå¿ããããã«èŠããŸããããããããããŸãã«èµ·ãã£ãããšã§ããéçºè ã«ãã®å¥åŠãªã³ãŒãããã§ãã¯ããŠå¯ŸåŠããããã«äŸé ŒããŸããAdjustDockingLayout
é¢æ°ãCBasePaneããã³CDockSiteã¯ã©ã¹ã§ã©ã®ããã«å®£èšãããŠããããæ€èšããŠãã ããã
class CBasePane : public CWnd { .... virtual void AdjustDockingLayout(HDWP hdwp = NULL); .... }; class CDockSite : public CBasePane { .... virtual void AdjustDockingLayout(); .... };
PVS-StudioèŠåïŒV762ä»®æ³æ©èœã誀ã£ãŠãªãŒããŒã©ã€ããããå¯èœæ§ããããŸãã掟çã¯ã©ã¹ãCDockSiteãããã³åºæ¬ã¯ã©ã¹ãCBasePaneãã®é¢æ°ãAdjustDockingLayoutãã®æåã®åŒæ°ãåç §ããŠãã ãããafxdocksite.h 94
åºæ¬ã¯ã©ã¹ã®ããæç¹ã§ãhdwpåŒæ°ãé¢æ°å®£èšã«è¿œå ãããåå«ã¯ã©ã¹ã§å¿ããããããã§ãããã®çµæããããã¯2ã€ã®ç°ãªãæ©èœã«ãªããŸããã
åæ§ã®ç¶æ³ïŒ
- V762ä»®æ³æ©èœã誀ã£ãŠãªãŒããŒã©ã€ããããå¯èœæ§ããããŸãã掟çã¯ã©ã¹ãCPaneãããã³åºæ¬ã¯ã©ã¹ãCBasePaneãã®é¢æ°ãCopyStateãã®æåã®åŒæ°ãåç §ããŠãã ãããafxpane.h 96
- V762ä»®æ³æ©èœã誀ã£ãŠãªãŒããŒã©ã€ããããå¯èœæ§ããããŸãã掟çã¯ã©ã¹ãCDockablePaneãããã³åºæ¬ã¯ã©ã¹ãCPaneãã®é¢æ°ãCopyStateãã®æåã®åŒæ°ãåç §ããŠãã ãããafxdockablepane.h 184
- V762ä»®æ³æ©èœã誀ã£ãŠãªãŒããŒã©ã€ããããå¯èœæ§ããããŸãã掟çã¯ã©ã¹ãCMFCLinkCtrlãããã³åºæ¬ã¯ã©ã¹ãCMFCButtonãã®é¢æ°ãSizeToContentãã®2çªç®ã®åŒæ°ãåç §ããŠãã ãããafxlinkctrl.h 50
- V762ä»®æ³æ©èœã誀ã£ãŠãªãŒããŒã©ã€ããããå¯èœæ§ããããŸãã掟çã¯ã©ã¹ãCMFCTasksPaneãããã³åºæ¬ã¯ã©ã¹ãCPaneãã®é¢æ°ãRecalcLayoutãã®æåã®åŒæ°ãåç §ããŠãã ãããafxtaskspane.h 287
ã¯ã©ã¹å ã®é¢æ°ã«ã€ããŠèª¬æããŠããã®ã§ãä»®æ³ãã¹ãã©ã¯ã¿ã«ã€ããŠããŸãã¯ãããã®äžåšã«ã€ããŠèª¬æããŸãããããŸããCAccessTokenã¯ã©ã¹ãèŠãŠãã ããã
class CAccessToken { .... mutable CRevert *m_pRevert; }; inline bool CAccessToken::ImpersonateLoggedOnUser() const throw(...) { .... delete m_pRevert; m_pRevert = _ATL_NEW CRevertToSelf; .... }
ã¢ãã©ã€ã¶ãŒã¯èŠåãçæããŸããV599ãCRevertãã¯ã©ã¹ã«ã¯ä»®æ³é¢æ°ãå«ãŸããŠããŸãããä»®æ³ãã¹ãã©ã¯ã¿ãŒã¯ååšããŸãããatlsecurity.h 5252
圌ããããããçç±ãèŠãŠã¿ãŸããããæã ã¯èå³ãã¡ã³ããŒã§ããm_pRevertåã®ãªããžã§ã¯ããžã®ãã€ã³ã¿ã§ãããCRevertãã¯ã©ã¹ã¯å€æ çã«äœ¿çšãããŸãã次ã®ã³ãŒãè¡ãèŠããšããã®çµè«ã«å°éã§ããŸãã
m_pRevert = _ATL_NEW CRevertToSelf;
ã¯ã©ã¹CRevertToSelfã¯ããç¶æ¿CRevertããããã®ã¯ã©ã¹ãä»ããç¥ããŸãããïŒ
class CRevert { public: virtual bool Revert() throw() = 0; }; class CRevertToSelf : public CRevert { public: bool Revert() throw() { return 0 != ::RevertToSelf(); } };
ãã®CRevertã¯ã©ã¹ã«ã¯äœãæ¬ ããŠããŸããïŒä»®æ³ãã¹ãã©ã¯ã¿ããããŸããã
PVS-Studioã¢ãã©ã€ã¶ãŒã«æ°ãã蚺æãè¿œå ããã ãã§ãªããæ¢åã®èšºæãæ¹åããŸããããšãã°ãæè¿V611蚺æã¯ãã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã®ããã»ã¹ãç°ãªãæ©èœã«ããå Žåã«ã¡ã¢ãªã解æŸããåé¡ãæ¢ãããšãåŠã³ãŸããã次ã«ããããå®éã«ã©ã®ããã«æ©èœãããã瀺ããŸãã
template <class TAccessor> class CBulkRowset : public CRowset<TAccessor> { .... void SetRows(_In_ DBROWCOUNT nRows) throw() { if (nRows == 0) nRows = 10; if (nRows != m_nRows) { delete m_phRow; m_phRow = NULL; m_nRows = nRows; } } HRESULT BindFinished() throw() { m_nCurrentRows = 0; m_nCurrentRow = 0; m_hr = S_OK; if (m_phRow == NULL) { m_phRow = _ATL_NEW HROW[m_nRows]; if (m_phRow == NULL) return E_OUTOFMEMORY; } return S_OK; } .... HROW* m_phRow; .... }
PVS-Studio èŠåïŒV611ã¡ã¢ãªã¯ãnew T []ãæŒç®åã䜿çšããŠå²ãåœãŠãããŸãããããdeleteãæŒç®åã䜿çšããŠè§£æŸãããŸããããã®ã³ãŒãã調ã¹ãããšãæ€èšããŠãã ããããdelete [] m_phRow;ãã䜿çšããããšããå§ãããŸããatldbcli.h 5689 new []æŒç®åã䜿çš
ããŠãBindFinishedé¢æ°ã§ã¡ã¢ãªãå²ãåœãŠãããŸãã
m_phRow = _ATL_NEW HROW[m_nRows];
deleteæŒç®åã䜿çšããŠSetRowsé¢æ°ã§ã¡ã¢ãªã解æŸããŸãïŒ
delete m_phRow;
çµæïŒæªå®çŸ©ã®åäœãmemset
é¢æ°ã®éåžžã«çãããåŒã³åºãã«ã€ããŠèª¬æããŸãããããã ãã誀ã£ãã³ãŒããèŠãåã«ããã¹ãŠãåé¡ã®ãªãã³ãŒããèŠãŠãã ãããæ£ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
void CToolTipCtrl::FillInToolInfo(TOOLINFO& ti, ....) const { memset(&ti, 0, sizeof(AFX_OLDTOOLINFO)); ti.cbSize = sizeof(AFX_OLDTOOLINFO); .... }
ããã¯å žåçãªç¶æ³ã§ããmemseté¢æ°ãåŒã³åºããšãæ§é äœã®ãã¹ãŠã®ã¡ã³ããŒãã¯ãªã¢ãããŸãïŒãŒãã§åããããŸãïŒã次ã«ããã®ãµã€ãºãæ§é ã«æžã蟌ãŸããŸããããã¯WinAPIã®æšæºçãªæ¹æ³ã§ãããã®ãããå€ãã®é¢æ°ã¯ãããããæ©èœããæ§é ã®ããŒãžã§ã³ïŒåœ¢åŒïŒãèŠã€ããŸãã
äžèšã®ã³ãŒãã§ã¯ããã¹ãŠãè«ççã§ããAFX_OLDTOOLINFOæ§é äœã®ãµã€ãºãèšç®ãããŸãã次ã«ãæ§é ã®ãã®ãµã€ãºã䜿çšããŠmemseté¢æ°ãåŒã³åºããåããµã€ãºãæ§é å ã«æžã蟌ãŸããŸãã
ç°åžžãªã³ãŒããèããŠã¿ãŸãããïŒ
BOOL CControlBar::PreTranslateMessage(MSG* pMsg) { .... TOOLINFO ti; memset(&ti, 0, sizeof(AFX_OLDTOOLINFO)); ti.cbSize = sizeof(TOOLINFO); .... }
PVS-StudioèŠåïŒV512ãmemsetãé¢æ°ãåŒã³åºããšããããã¡ãŒãïŒtiããã¢ã³ããŒãããŒããŸããbarcore.cpp 384
æ§é äœã¯TOOLINFOåã§ããæžã蟌ãŸããTOOLINFOæ§é äœã®ãµã€ãºã§ããti.cbSize = sizeofïŒTOOLINFOïŒ; ã
ãã ããåŒsizeofïŒAFX_OLDTOOLINFOïŒã䜿çšããŠãªã»ããå¯èœãªãã€ãæ°ãèšç®ããããããæ§é ã¯å®å šã«ã¯ãªã»ããããããéšåçã«ã®ã¿ãªã»ãããããŸãã
ãã®çµæãæ§é ãã£ãŒã«ãã®äžéšã¯åæåãããªããŸãŸã«ãªããŸããmemsetãæ§é å šäœãæºãããªã
å¥ã®ã±ãŒã¹ããããŸãã
GUID m_Id; void zInternalStart() { .... // Zero the activity id in case we end up logging the stop. ZeroMemory(&m_Id, sizeof(&m_Id)); .... }
PVS-StudioèŠåïŒV512ãmemsetãé¢æ°ãåŒã³åºããšããããã¡ãŒãïŒm_Idãã®ã¢ã³ããŒãããŒãçºçããŸãã traceloggingactivity.h 656
æ§é ã®ãµã€ãºã§ã¯ãªãããã€ã³ã¿ãŒã®ãµã€ãºãèšç®ãããå Žåã®å€å žçãªãšã©ãŒããã®çµæã32ãããã¢ããªã±ãŒã·ã§ã³ãš64ãããã¢ããªã±ãŒã·ã§ã³ã®ã©ã¡ããã³ã³ãã€ã«ãããŠãããã«å¿ããŠãæåã®4ãã€ããŸãã¯8ãã€ãã®ã¿ããªã»ãããããŸãã GUIDã®æ§é ã¯16ãã€ãïŒ128ãããïŒã§ãã
æ£ãããªãã·ã§ã³ïŒ
ZeroMemory(&m_Id, sizeof(m_Id));
èŠåV595ããªãããã§ã¯ãããŸããããã®èšºæã¯Cããã³C ++ããã°ã©ã ã§æãäžè¬çãªãšã©ãŒã®1ã€ãæ€åºãããããããã¯é©ãããšã§ã¯ãããŸããããã ããCïŒã§ã¯ãã¹ãŠãå®ç§ã§ã¯ãããŸããã
ãšã©ãŒã®æ¬è³ªã¯ããã§ãã¯ãããåã«ãã€ã³ã¿ãŒã®éåç §ãçºçãããšããäºå®ã«ãããŸãã
ãã®èšºæã䜿çšããŠç¹å®ãããã³ãŒããæ€èšããŠãã ããã
HRESULT CBasePane::get_accHelp(VARIANT varChild, BSTR *pszHelp) { if ((varChild.vt == VT_I4) && (varChild.lVal == CHILDID_SELF)) { *pszHelp = SysAllocString(L"ControlPane"); return S_OK; } if (((varChild.vt != VT_I4) && (varChild.lVal != CHILDID_SELF)) || (NULL == pszHelp)) { return E_INVALIDARG; } .... }
PVS-StudioèŠåïŒV595 nullpsrã«å¯ŸããŠæ€èšŒãããåã«ããpszHelpããã€ã³ã¿ãŒã䜿çšãããŸãããè¡ããã§ãã¯ããŠãã ããïŒ1324ã1328ãafxbasepane.cpp 1324
é¢æ°ã次ã®ããã«åŒã³åºãããå ŽåïŒ
VARIANT foo; foo.vt = VT_I4; foo.lVal = CHILDID_SELF; get_accHelp(foo, NULL);
ãã®é¢æ°ã¯E_INVALIDARGã®ã¹ããŒã¿ã¹ãè¿ãå¿ èŠããããŸããã代ããã«nullãã€ã³ã¿ãŒãéåç §ãããŸãã
ã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®ããã«æšè«ããŸããããã€ã³ã¿ãŒã¯éåç §ãããŸãããã ãã以äžã§ã¯ããã®NULLãã€ã³ã¿ãŒãçãããã©ããã®ãã§ãã¯ããããŸãããã®ãããªãã§ãã¯ãããã®ã§ãã©ããããã€ã³ã¿ãŒã¯ãã«ã§ããå¯èœæ§ããããŸãããŒãã®å Žåããã©ãã«ãçºçããŸãããããèŠåããå¿ èŠããããŸãïŒ
ç§ãèšã£ãããã«ãããã¯éåžžã«ããããééãã§ãã Visual C ++ã©ã€ãã©ãªãäŸå€ã§ã¯ãããŸããããªãã¡ã¯ã¿ãªã³ã°ãåŸ ã£ãŠããããã«17ã®å ŽæããããŸãïŒvs2017_V595.txtã
ãããŠãFALSEå®æ°ãšS_FALSEå®æ°ã®æ··åã«é¢é£ããæçµãšã©ãŒãèæ ®ããŠãã ããã
BOOL CMFCRibbonPanel::OnSetAccData (long lVal) { .... if (nIndex < 0 || nIndex >= arElements.GetSize()) { return FALSE; } if (GetParentWnd()->GetSafeHwnd() == NULL) { return S_FALSE; } ASSERT_VALID(arElements[nIndex]); return arElements[nIndex]->SetACCData(GetParentWnd(), m_AccData); }
PVS-Studio èŠåïŒV716 returnã¹ããŒãã¡ã³ãã§ã®çãããåå€æïŒHRESULTãè¿ããŸããããé¢æ°ã¯å®éã«ã¯BOOLãè¿ããŸããafxribbonpanel.cpp4107ã
ãã®é¢æ°ã¯BOOLåãè¿ããŸãã芪ãŠã£ã³ããŠããHWNDãååŸã§ããªãå Žåãããã°ã©ãã¯é¢æ°ããFALSEå€ãè¿ããããšèããŠããŸããããããã圌ã¯å°å°ãããã¹ãŠãæ ¹æ¬çã«å€ããS_FALSEãæžããŸããã
ããã¯ãS_FALSEå®æ°ã®å®£èšæ¹æ³ã§ãã
#define S_FALSE ((HRESULT)1L)
äœãèµ·ãã£ãŠããã®ãã¯ãã§ã«ç解ããŠãããšæããŸããã念ã®ããã«èª¬æããŸãã
ãreturn S_FALSE;ããšæžãããšã¯ããreturn TRUE;ããšæžãããšãšåãã§ãã壮倧ãªå€±æã
ãšã©ãŒã¯äžäººã§ã¯ãªãã圌女ã«ã¯å人ãããŸãïŒ
- V716 Suspicious type conversion in return statement: returned HRESULT, but function actually returns BOOL. afxribbonbar.cpp 5623
- V716 Suspicious type conversion in return statement: returned HRESULT, but function actually returns BOOL. afxribbonbar.cpp 5627
- V716 Suspicious type conversion in return statement: returned HRESULT, but function actually returns BOOL. ctlnownd.cpp 349
- V716 Suspicious type conversion in return statement: returned HRESULT, but function actually returns BOOL. olecli2.cpp 548
èšäºã®åé ã§è¿°ã¹ãããã«ããã¹ãŠã®ãã¡ã€ã«ããã§ãã¯ããŸããã§ãããããã«ãã¢ãã©ã€ã¶ãŒã«ãã£ãŠçºè¡ãããèŠåã®äžããäœããèŠèœãšããŠãããããããŸããããããã£ãŠããã®ããã¥ã¡ã³ãã®éçºè ãããã€ãã®ãšã©ãŒãä¿®æ£ããããã®ã¬ã€ããšèŠãªããªãããã«ããŠãã ãããéçºè èªèº«ãã©ã€ãã©ãªãå®å šã«ãã§ãã¯ããã¢ãã©ã€ã¶ãŒã®èŠåã泚ææ·±ã調ã¹ããšãã¯ããã«åªããŠããŸãã
ãããã«
ããäžåºŠãéçã³ãŒãåæããŒã«ã®å©ç¹ãèªè ã«ç€ºãããšãã§ããŸããã
äžã€ã®ééãã«å¯ŸããŠèŠåããããæã ããªãªãŒã¹ã«åããŠäžéšã®ããã°ã©ããŒãéçã¢ãã©ã€ã¶ãŒãèµ·åãããšèããŸãã誰ãããããè¡ãããããæ£åžžã§ãããšäž»åŒµããå Žåã圌ã¯æ·±ã誀解ãããŠããŸããããã¯ãéçã¢ãã©ã€ã¶ãŒã䜿çšããééã£ãæ¹æ³ã§ãã ããã¯ããªãªãŒã¹åã«ã³ã³ãã€ã©ã®èŠåããªã³ã«ããŠãæ®ãã®æéã¯ãããžã§ã¯ãã§äœæ¥ããããããå®å šã«ç¡å¹ã«ããããšãšåãã§ãã
PVS-Studioã¢ãã©ã€ã¶ãŒã®ãã¢çãã€ã³ã¹ããŒã«ãããããžã§ã¯ãã確èªããŠã¿ãŠãã ããã
PVS-Studio補åããŒãžïŒhttps : //www.viva64.com/en/pvs-studio/
ãµããŒããããŠããèšèªãšã³ã³ãã€ã©ïŒ
- çª Visual Studio 2017 CãC ++ãC ++ / CLIãC ++ / CXïŒWinRTïŒãCïŒ
- çª Visual Studio 2015 CãC ++ãC ++ / CLIãC ++ / CXïŒWinRTïŒãCïŒ
- çª Visual Studio 2013 CãC ++ãC ++ / CLIãC ++ / CXïŒWinRTïŒãCïŒ
- çª Visual Studio 2012 CãC ++ãC ++ / CLIãC ++ / CXïŒWinRTïŒãCïŒ
- çª Visual Studio 2010 CãC ++ãC ++ / CLIãCïŒ
- çª MinGW CãC ++
- Windows / Linux Clang CãC ++
- Linux GCC CãC ++
èªãã§ãããŠããããšããTwitter @Code_Analysisã§ãã©ããŒããŠãã ããã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒAndrey Karpovã PVS-Studioã䜿çšããŠVisual C ++ 2017ã©ã€ãã©ãªãæ¹åããæ¹æ³
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãåéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã